C - SUSE 上的地穴导致段错误



我正在做一个PAM类型的事情,它需要在/etc/shadow中检查用户的密码。

通常,这涉及读取加密 ID、盐和密码的密码行。使用 ID 和 salt, 用户提供的密码可以使用 crypt(3) 或 m_crypt (在同一手册页上) 进行哈希处理, 并比较结果。这在许多系统上都运行良好,例如 Ubuntu,但我在 SUSE 上遇到了重大问题。

该系统使用河豚,具有"正确处理 8 位字符"。其哈希 ID 为"2y"。不幸的是, 每当 crypt(3) 被调用时, 它就会出现段错误。ID "2a"也是如此,这是识别河豚的第一个代码。所有其他哈希算法都有效。

系统必须有一个工作加密(或等效的)进行河豚散列,因为/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("%sn", pp);
  return 0;
}

盐 $2a$10$ 也显示了错误。

它适用于其他系统,如 Ubuntu,其他哈希算法在 SUSE 上运行良好。

有什么想法吗?

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()函数来评估和检查密码条目。

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

相关内容

  • 没有找到相关文章

最新更新