使用来自 crypt.h 的 crypt()
Using crypt() from crypt.h
我正在为 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);
toCrackCiph 和 passwordCiph 彼此相等,即使它们的字符串不相同,盐也不相同。
我是不是在某处犯了一个简单的指针错误?
谢谢,
(我对CS50不熟悉,我是在假设crypt
是传统Unix标准C库中的函数crypt(3)
的情况下回答这个问题的。)
crypt
是一个非常古老的函数,早在有人担心 C 语言中的线程安全之前就存在了。每次调用它时,它 returns 相同的指针,指向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;
}
...然后你会看到两个不同的字符串。我电脑上的输出是
AAAA
AAzz
daeBW5vt16USo
aaI8pRQwCn7N2
由于您使用的是请求旧的基于 DES 的密码哈希算法的盐字符串,因此您应该得到相同的结果。
这是一个课堂练习,但我仍然必须指出,旧的基于 DES 的密码散列可以在任何现代计算机上被暴力破解,所以它不应该用于真实密码。您可能可以通过指定不同样式的盐字符串来使用更好的算法,例如 "$bpKU3bUSQLwX87z/$"
.
我正在为 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);
toCrackCiph 和 passwordCiph 彼此相等,即使它们的字符串不相同,盐也不相同。
我是不是在某处犯了一个简单的指针错误?
谢谢,
(我对CS50不熟悉,我是在假设crypt
是传统Unix标准C库中的函数crypt(3)
的情况下回答这个问题的。)
crypt
是一个非常古老的函数,早在有人担心 C 语言中的线程安全之前就存在了。每次调用它时,它 returns 相同的指针,指向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;
}
...然后你会看到两个不同的字符串。我电脑上的输出是
AAAA
AAzz
daeBW5vt16USo
aaI8pRQwCn7N2
由于您使用的是请求旧的基于 DES 的密码哈希算法的盐字符串,因此您应该得到相同的结果。
这是一个课堂练习,但我仍然必须指出,旧的基于 DES 的密码散列可以在任何现代计算机上被暴力破解,所以它不应该用于真实密码。您可能可以通过指定不同样式的盐字符串来使用更好的算法,例如 "$bpKU3bUSQLwX87z/$"
.