【问题标题】:Using crypt() from crypt.h使用 crypt.h 中的 crypt()
【发布时间】:2017-05-23 18:16:39
【问题描述】:

我正在为 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 也不相同。

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

谢谢,

【问题讨论】:

    标签: c pointers cs50 crypt


    【解决方案1】:

    (我对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 的密码哈希算法,因此您应该得到相同的结果。

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

    【讨论】:

    • “旧的基于 DES 的密码哈希可以被蛮力破解”——这正是问题集的内容。暴力破解哈希?
    • 那么如何比较crypt函数调用的两个输出呢?
    • @abhisekp 在再次调用crypt 之前,您必须将crypt 返回的字符串复制到另一个缓冲区中。
    • 我这样做是为了将哈希复制到另一个字符串(而不是静态哈希位置char new_hash[14]; strcpy(new_hash, crypt(new_password, salt));
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-08
    • 1970-01-01
    • 2013-05-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多