我做的是PAM类型的东西,它需要在/ etc / shadow中检查用户的密码。
通常,这涉及读取加密ID,盐和密码的密码行。使用ID和salt,可以使用crypt(3)或m_crypt(在同一手册页上)对用户提供的密码进行哈希处理,并对结果进行比较。这在许多系统上运行良好,例如Ubuntu,但我在SUSE上遇到了重大问题。
系统正在使用Blowfish,正确处理8位字符"。它的哈希ID为" 2y"。不幸的是,每当crypt(3)被调用时,就会发生段错误。 ID" 2a"也是如此,这是第一个识别Blowfish的代码。所有其他哈希算法都可以工作。
系统必须有一个可以进行Blowfish散列的工作地穴(或等效物),因为/ etc / shadow文件有它的例子,但是我无法做到这一点。有人能指出我正确的方向吗?
segfault的一个例子:
#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上运行良好。
有什么想法吗?
答案 0 :(得分:0)
crypt()返回NULL意味着错误,可能是无效的盐,因为2y是未知的。 根据维基百科,它似乎是一个相当新近的补充: https://en.wikipedia.org/wiki/Crypt_%28C%29
<$> $ 2y $ - 2011年后的错误发现,$ 2y $可用于明确地使用新的,更正的算法。在一个遭受错误的实现上,$ 2y $根本不起作用。更新,固定实现,它将产生与使用$ 2a $相同的结果。“尝试此操作以获取错误:
#include <errno.h>
printf("%p (errno=%d: %s)\n", pp, errno, strerror(errno));
glibc-2.19不支持任何Blowfish算法,我在最近的Debian 8.1上也得到了一个NULL指针。
也许您的SUSE系统包含随时迁移的密码条目,甚至不再可用。或者其他一些软件(如自定义PAM模块)使用自定义库评估和检查密码条目,而不是使用标准的libc crypt()函数。
答案 1 :(得分:-2)
使用$2y$10$xxx
作为盐,xxx
表示$2y$10$
之后的22个字符。
如果你想知道为什么22,请看:https://en.wikipedia.org/wiki/Bcrypt。