crypt on suse导致段错误

时间:2015-06-18 17:01:59

标签: c passwords hashcode crypt

我做的是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上运行良好。

有什么想法吗?

2 个答案:

答案 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上也得到了一个N​​ULL指针。

也许您的SUSE系统包含随时迁移的密码条目,甚至不再可用。或者其他一些软件(如自定义PAM模块)使用自定义库评估和检查密码条目,而不是使用标准的libc crypt()函数。

答案 1 :(得分:-2)

使用$2y$10$xxx作为盐,xxx表示$2y$10$之后的22个字符。 如果你想知道为什么22,请看:https://en.wikipedia.org/wiki/Bcrypt