Zac*_*vre 3 c pointers crypt cs50
我正在为CS50做第2周的pset.当使用crypt函数时,指向任何字符串的密文的char指针总是指向我加密的最后一个东西.例如:
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);
Run Code Online (Sandbox Code Playgroud)
toCrackCiph和passwordCiph彼此相等,即使它们的字符串不相同,也不是盐.
我在某处做了一个简单的指针错误吗?
谢谢,
(我不熟悉CS50.我在假设这crypt
是crypt(3)
传统Unix标准C库的功能的情况下回答了这个问题.)
crypt
从任何人担心C中的线程安全之前的几天开始,这是一个非常古老的函数.每次调用它时,它都会返回相同的指针,指向C库中的静态缓冲区.每次呼叫都会覆盖之前呼叫的结果.
如果您crypt
在再次呼叫之前打印出第一个呼叫的结果...
#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;
}
Run Code Online (Sandbox Code Playgroud)
...然后你会看到两个不同的字符串.我的电脑上的输出是
AAAA
AAzz
daeBW5vt16USo
aaI8pRQwCn7N2
Run Code Online (Sandbox Code Playgroud)
由于您使用的是使用旧的基于DES的密码哈希算法的salt字符串,因此您应该得到同样的结果.
这是一个课堂练习,但我仍然必须指出,旧的基于DES的密码哈希可以在任何现代计算机上通过暴力破解,因此它永远不应该用于真正的密码.您可以通过指定不同类型的salt字符串来获得更好的算法,例如"$5$bpKU3bUSQLwX87z/$"
.