如何将 crypto() 的输出与用于在 C 中破解密码的命令行输入进行比较

How to compare the output of crypt() to a cmd line input for cracking passwords in C

我正在学习 cs50x intro to comp sci 课程,其中一个练习是解密使用 crypt(3) 函数加密的密码。

他们通过假设密码长度只能为 5 个字符并且每个字符都是大写或小写字母来简化要求。

我在加密和比较方面遇到了障碍,不确定如何继续。

总结如下。

我已经循环遍历了 A、AA、AAA、AAAA 和 AAAAA 的 A-Z 和 a-z 的所有可能变体。

我可以将其与来自 argv 的用户输入进行比较。

现在我试图让 argv 成为一个散列并将其与(上面可能的密码)的散列进行比较

我挣扎的地方-->

我想象代码应该如何工作

  1. 接收 argv[1] 并识别盐。
  2. 生成密码
  3. 使用 crypt() 散列密码
  4. 比较密码哈希与 argv[1]
  5. 如果不匹配,生成新密码并重复直到匹配。

什么不起作用 -->

存储密码哈希以进行比较并在操作后使用新哈希更新密码哈希。

我觉得我明白了 -->

  1. 散列存储为字符串文字。
  2. 您不能更新字符串文字。
  3. 我需要分配一个变量来存储散列,以便将其与 argv 进行比较。

我错过了什么?我应该阅读哪些内容才能继续前进?

提前致谢!

您可以将 crypt(3) 的结果分配给 char* 并从指针引用散列:

char *compare = crypt(p, salt);
compare = crypt(p, salt);

因为 crypt(3) 有它自己的静态数据 space 它会在每次调用它时重写,你可能想使用 char 数组将散列复制到你程序的 space 并且strcpy(3)

char hash[256]; // arbitrary length, enough to store the hash without overflowing
char *compare = crypt(p, salt);
strcpy(hash, compare);

或更简洁地说,

char hash[256];
strcpy(hash, crypt(p, salt));

这样,再次调用crypt(3)时,hash不会被覆盖

请记住在使用前对 crypt(3) 的结果进行空检查,因为它可能 return 一个错误的空指针。

char *compare = crypt(p, salt);
compare = crypt(p, salt);
if (compare) { // null check
    if (strcmp(compare, input) == 0) }
        printf("%s is identical to %s!", compare, input);
    } else {
        printf("%s does not match %s."), compare, input);
    }
}

由于您使用的是 c 字符串并且我们知道它们以空值终止,因此可以使用 strcmp(3) 来比较它们,如果您使用的是原始字节或不保证以空值终止的字符数组,最好使用memcmp(3)进行比较。