Christian Block: Die Funktionen crypt() und rand()

Hallo,

ich habe 2 Fragen, wozu ich bisher keine Antwort finden konnte.

1. Wenn ich ein Passwort mit crypt() verschlüssel, dann muss das doch auf folgende Weise geschehen:
crypt PLAINTEXT,SALT

wofür steht SALT? Was muss ich da einsetzen? Ist das der Verschlüsselungskey?
Wenn ich z. B.
$pwd = "geheim";
$crypt = crypt($pwd, skdfusdfhdfghwerr);

schreibe, geht das, hat das einen Sinn? Es kommt nämlich dann immer ein anderer Code raus, wenn man den SALT ändert. Oder wie geht es richtig?

2. Mit der Funktion rand() kommt bei mir NIE eine zufällige Zahl! Wenn ich z. B.
$zahl = int(rand 99999)+1;
print $zahl;

schreibe, dann müsste er doch laut meinem Buch eine Zufallszahl zwischen 1 und 99999 ausgeben. Bei mir gibt er aber immer die 126 aus.

Wer kann mir helfen? Ich danke Euch schon im voraus!

  1. Hallo Christian,

    1. Wenn ich ein Passwort mit crypt() verschlüssel, dann muss das doch auf folgende Weise geschehen:
      crypt PLAINTEXT,SALT
      wofür steht SALT? Was muss ich da einsetzen? Ist das der Verschlüsselungskey?

    In der Original-Perldoku findest du folgendes Beispiel:

    print "Password: ";
        chomp($word = <STDIN>);
        print "\n";
        system "stty echo";
        if (crypt($word, $pwd) ne $pwd) {
            die "Sorry...\n";
        } else {
            print "ok\n";
        }

    Es wird also ein String in $word eingelesen, der als User-Passworteingabe interpretiert werden soll. Das Script kennt das Passwort im verschluesselten Zustand, das es in $pwd gespeichert hat. Mit Hilfe des crypt-Befehls ueberprueft es nun, ob die "Verkryptung" von $word nach C/Unix-Standard auf $pwd passt.

    Die Doku dazu im Wortlaut: "When verifying an existing encrypted string you should use the encrypted text as the salt (like crypt($plain, $crypted) eq $crypted). This allows your code to work with the standard crypt() and with more exotic implementations"

    1. Mit der Funktion rand() kommt bei mir NIE eine zufällige Zahl! Wenn ich z. B.

    $zahl = int(rand 99999)+1;
    print $zahl;

    Achte mal auf die Perl-Version, die du benutzt! Wenn es eine unterhalb von 5.004 ist, musst du zuerst explizit die Funktion srand() aufrufen, bevor rand() was Brauchbares liefert. Ab 5.004 ruft rand() srand() intern erst mal auf. Beispielaufruf fuer srand:

    srand (time ^ $$);

    Aber nur _einmal_ im gesamten Script!

    viele Gruesse
      Stefan Muenz

  2. Kleiner Tip, wenn du was über Verschlüsselung erfahren möchtest, in der letzten Xi war nen Artikel über Verschlüsselung mit Perl drinnen. Da wurde sogar was mit DES oder IDEA verschlüsselt. Also richtig professionell. Ist vielleicht was für dich.