2017-05-23 3 views
1

Ich mache die week2 pset für CS50. Bei der Verwendung der crypt-Funktion zeigen die char-Zeiger, die auf den Chiffretext eines beliebigen Strings zeigen, immer auf das Letzte, was ich verschlüsselt habe. Zum Beispiel:Verwenden von crypt() aus crypt.h

char password[] = "AAAA"; 
char toCrack[] = "AAzz"; 
printf("%s\n", password); 
printf("%s\n", toCrack); 

char *toCrackCiph = crypt(toCrack, "da"); 
char *passwordCiph = crypt(password, "aa"); 


printf("%s\n", passwordCiph); 
printf("%s\n", toCrackCiph); 

toCrackCiph und passwordCiph gleich sich, obwohl ihre Saiten nicht gleich sind, und weder ist das Salz.

Mache ich irgendwo einen einfachen Zeigerfehler?

Danke,

Antwort

5

(bin ich mit CS50 nicht vertraut. Ich diese Frage unter der Annahme, mich beantworten, dass crypt die Funktion Standard-C-Bibliothek crypt(3) von der traditionellen Unix ist.)

crypt ein sehr alt Funktion, aus den Tagen, bevor jemand besorgt über Thread-Sicherheit in C. Jedes Mal, wenn Sie es aufrufen, gibt es die gleichen Zeiger, zeigt auf einen statischen Puffer in der C-Bibliothek. Jeder Anruf überschreibt das Ergebnis eines vorherigen Anrufs.

Wenn Sie das Ergebnis des ersten crypt Anruf auszudrucken, bevor es wieder anrufen ...

#include <stdio.h> 
#include <unistd.h> 

int 
main(void) 
{ 
    char password[] = "AAAA"; 
    char toCrack[] = "AAzz"; 
    printf("%s\n", password); 
    printf("%s\n", toCrack); 

    char *toCrackCiph = crypt(toCrack, "da"); 
    printf("%s\n", toCrackCiph); 

    char *passwordCiph = crypt(password, "aa"); 
    printf("%s\n", passwordCiph); 
    return 0; 
} 

... dann werden Sie zwei verschiedene Strings sehen. Die Ausgabe auf meinem Computer ist

AAAA 
AAzz 
daeBW5vt16USo 
aaI8pRQwCn7N2 

Da Sie Salz Saiten verwenden, die den alten DES-basierten Passwort-Hash-Algorithmus beantragen, sollten Sie die gleiche Sache bekommen.

Dies ist eine Übung im Klassenzimmer, aber ich muss noch darauf hinweisen, dass der alte DES-basierte Passwort-Hash kann durch brachiale Gewalt auf jedem modernen Computer gebrochen werden, so dass es nie für echte Passwörter verwendet werden sollte. Sie können wahrscheinlich einen besseren Algorithmus verwenden, der verwendet werden soll, indem Sie einen anderen Stil der Saltzeichenfolge angeben, etwa "$5$bpKU3bUSQLwX87z/$".

Verwandte Themen