【发布时间】:2015-09-04 10:53:17
【问题描述】:
我正在做 PAM 类型的事情,它需要检查 /etc/shadow 中的用户密码。
通常,这涉及读取加密 ID、salt 和密码的密码行。使用 ID 和 salt,可以使用 crypt(3) 或 m_crypt(在同一手册页上)对用户提供的密码进行哈希处理,并比较结果。这在许多系统上都可以正常工作,例如 Ubuntu,但我在 SUSE 上遇到了重大问题。
系统使用 Blowfish,“正确处理 8 位字符”。它的哈希 ID 为“2y”。不幸的是,每当 crypt(3) 被调用时,它都会出现段错误。 ID“2a”也是如此,这是识别 Blowfish 的第一个代码。所有其他散列算法都有效。
系统必须有一个可以进行 Blowfish 散列的工作 crypt(或等效的),因为 /etc/shadow 文件有它的示例,但我无法完成这项工作。谁能指出我正确的方向?
段错误示例:
#define _XOPEN_SOURCE
#include <unistd.h>
#include <stdio.h>
int main(int argc, char** argv) {
char *pass = "tqbfjotld";
char *salt = "$2y$10$";
char *pp = NULL;
pp = crypt(pass, salt);
printf("%s\n", pp);
return 0;
}
盐 $2a$10$ 也显示错误。
它可以在 Ubuntu 等其他系统上运行,而其他哈希算法在 SUSE 上也可以正常运行。
有什么想法吗?
【问题讨论】:
-
自己没用过,不过
2a是河豚,2y是什么? -
对 crypt 的调用返回 NULL 值。是 printf() 导致了 seg 错误事件,因为字符串参数为 NULL。
-
根据 crypt 的文档,salt 必须是指向 2 char 字符串的指针。当我只使用两个字符的字符串作为盐时,它工作得很好。请阅读 crypt 的手册页
-
@user3629249:该手册页具有误导性,您会在下方找到“Glibc 注释”,其中描述了更复杂的“盐”值。
-
@SouravGhosh:请参阅 en.wikipedia.org/wiki/Crypt_%28C%29#Blowfish-based_scheme 关于“2y”,这是一个相当新的添加。
标签: c passwords hashcode crypt