如何将 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 成为一个散列并将其与(上面可能的密码)的散列进行比较
我挣扎的地方-->
我想象代码应该如何工作
- 接收 argv[1] 并识别盐。
- 生成密码
- 使用 crypt() 散列密码
- 比较密码哈希与 argv[1]
- 如果不匹配,生成新密码并重复直到匹配。
什么不起作用 -->
存储密码哈希以进行比较并在操作后使用新哈希更新密码哈希。
我觉得我明白了 -->
- 散列存储为字符串文字。
- 您不能更新字符串文字。
- 我需要分配一个变量来存储散列,以便将其与 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)
进行比较。
我正在学习 cs50x intro to comp sci 课程,其中一个练习是解密使用 crypt(3) 函数加密的密码。
他们通过假设密码长度只能为 5 个字符并且每个字符都是大写或小写字母来简化要求。
我在加密和比较方面遇到了障碍,不确定如何继续。
总结如下。
我已经循环遍历了 A、AA、AAA、AAAA 和 AAAAA 的 A-Z 和 a-z 的所有可能变体。
我可以将其与来自 argv 的用户输入进行比较。
现在我试图让 argv 成为一个散列并将其与(上面可能的密码)的散列进行比较
我挣扎的地方-->
我想象代码应该如何工作
- 接收 argv[1] 并识别盐。
- 生成密码
- 使用 crypt() 散列密码
- 比较密码哈希与 argv[1]
- 如果不匹配,生成新密码并重复直到匹配。
什么不起作用 -->
存储密码哈希以进行比较并在操作后使用新哈希更新密码哈希。
我觉得我明白了 -->
- 散列存储为字符串文字。
- 您不能更新字符串文字。
- 我需要分配一个变量来存储散列,以便将其与 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)
进行比较。