2017-05-23 3 views
1

Je fais la semaine2 pset pour CS50. Lorsque vous utilisez la fonction crypt, les pointeurs char qui pointent vers le texte chiffré d'une chaîne pointent toujours vers la dernière chose que j'ai chiffrée. Par exemple:En utilisant crypt() de 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 et passwordCiph égaux les uns des autres, même si leurs chaînes ne sont pas les mêmes, et ni est le sel. Est-ce que je fais une simple erreur de pointeur quelque part?

Merci,

Répondre

5

(je ne suis pas au courant CS50. Je réponds à cette question en supposant que crypt est la fonction crypt(3) de la bibliothèque standard Unix traditionnelle C.)

crypt est un très vieux fonction, à partir des jours avant que quiconque s'inquiète de thread-sécurité en C. Chaque fois que vous l'appelez, il renvoie le même pointeur, pointant vers un tampon statique dans la bibliothèque C. Chaque appel écrase le résultat de tout appel précédent.

Si vous imprimez le résultat du premier appel crypt avant d'appeler à nouveau ...

#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; 
} 

... vous verrez deux chaînes différentes. La sortie sur mon ordinateur est

AAAA 
AAzz 
daeBW5vt16USo 
aaI8pRQwCn7N2 

Puisque vous utilisez des chaînes de sel qui demandent l'ancien algorithme de hachage de mot de passe à base-DES, vous devriez obtenir la même chose. Ceci est un exercice en classe, mais je dois quand même souligner que l'ancien hachage de mot de passe basé sur DES peut être brisé par force brute sur n'importe quel ordinateur moderne, donc il ne devrait jamais être utilisé pour de vrais mots de passe. Vous pouvez probablement obtenir un meilleur algorithme à utiliser en spécifiant un style différent de chaîne de sel, quelque chose comme "$5$bpKU3bUSQLwX87z/$".