package Password;

use strict;
use warnings;

our $VERSION = 1.00;

# moegliche Buchstaben fuer den Salt-Wert. 
my @salt = ('A'..'Z','a'..'z','0'..'9','-','.');
# Referenz auf ein anonymes Array, das die User aufnimmt
my $users = {};

sub new
  {
  my $class = shift;                 # Klasse abholen
  if (@_ != 2)
    { die "Zuwenig Parameter!\n"; }  # Parameterzahl gerade!
  my ($user, $pass) = @_;

  my $salt = $salt[rand(@salt)] . $salt[rand(@salt)];
  $$users{$user} = crypt($pass, $salt);
  return 1;
  }
  
sub verify
  { 
  my $class = shift;                 # Klasse abholen
  if (@_ != 2)
    { die "Zuwenig Parameter!\n"; }  # Parameterzahl gerade!
  my ($user, $pass) = @_;
  # gibt's den User ueberhaupt?
  return 0 unless (exists($$users{$user}));
  # Salt ermitteln und passwoerter vergleichen
  my $salt = substr($$users{$user},0,2);
  return $$users{$user} eq crypt($pass, $salt);
  }

package main;

Password->new("mueller", "secret");
Password->new("meier", "geheim");
Password->new("chef", "asdfgh");
Password->new("maus", "oleum");

while (1)
  {
  print "Enter Username and Password: ";
  my $line = <STDIN>;
  chomp($line);
  my ($username, $password) = split(" ", $line);
  print Password->verify($username, $password)?"OK\n":"Fail\n";
  }

