首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用crypt.h中的crypt()

使用crypt.h中的crypt()
EN

Stack Overflow用户
提问于 2017-05-24 02:16:40
回答 1查看 10.1K关注 0票数 4

我正在为CS50做week2 pset。在使用crypt函数时,指向任何字符串密文的char指针总是指向我加密的最后一项内容。例如:

代码语言:javascript
复制
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彼此相等,即使它们的字符串不同,盐也不同。

我是不是在某个地方犯了一个简单的指针错误?

谢谢,

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-05-24 02:26:38

(我不熟悉CS50。我是在假设crypt是传统Unix标准C库中的函数crypt(3)的情况下回答这个问题的。)

crypt是一个非常老的函数,早在人们担心C中的线程安全之前,每次你调用它时,它都会返回相同的指针,指向C库中的一个静态缓冲区。每次调用都会覆盖之前任何调用的结果。

如果在再次调用之前打印出第一次crypt调用的结果...

代码语言:javascript
复制
#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;
}

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

代码语言:javascript
复制
AAAA
AAzz
daeBW5vt16USo
aaI8pRQwCn7N2

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

这是一个课堂练习,但我仍然必须指出,在任何现代计算机上,旧的基于DES的密码散列都可以通过暴力破解,因此它永远不应该用于真正的密码。您可能可以通过指定不同样式的salt字符串来使用更好的算法,比如"$5$bpKU3bUSQLwX87z/$"

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44142220

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档