gpt4 book ai didi

c - 使用 crypt.h 中的 crypt()

转载 作者:行者123 更新时间:2023-12-04 11:03:14 24 4
gpt4 key购买 nike

我正在为 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 彼此相等,即使它们的字符串不同,salt 也不相同。

我在某处犯了一个简单的指针错误吗?

谢谢,

最佳答案

(我对 CS50 不熟悉。我回答这个问题的前提是 crypt 是传统 Unix 标准 C 库中的函数 crypt(3) 。)
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;
}

...然后你会看到两个不同的字符串。我电脑上的输出是

AAAA
AAzz
daeBW5vt16USo
aaI8pRQwCn7N2

由于您使用的是请求旧的基于 DES 的密码哈希算法的 salt 字符串,因此您应该得到相同的结果。

这是一个类练习,但我仍然必须指出,旧的基于 DES 的密码散列可以在任何现代计算机上通过蛮力破解,所以它永远不应该用于真正的密码。您可能可以通过指定不同样式的盐串来获得更好的算法,例如 "$5$bpKU3bUSQLwX87z/$" .

关于c - 使用 crypt.h 中的 crypt(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44142220/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com