crypt on suse 导致段错误

标签 c passwords hashcode crypt

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

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

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

系统必须有一个可以进行 Blowfish 散列的工作地穴(或等效物),因为/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;
}

salt $2a$10$ 也显示错误。

它适用于其他系统,例如 Ubuntu,其他哈希算法也适用于 SUSE。

有什么想法吗?

最佳答案

crypt() 返回 NULL 意味着错误,可能是无效的 salt,因为 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() 函数。

关于crypt on suse 导致段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30921488/

相关文章:

c - 当第三方 C 函数返回一个指针时,你应该自己释放它吗?

没有 GCC 优化的编译时断言失败

c - 在结构体数组中搜索字符串

powershell - 首次使用 powershell 登录时的新密码

equals - 这个 HashSet 测试示例可能吗?

c - 来自 C 的 NASM X86_64 全局变量

c# - WCF:通过向每个方法传递密码来实现简单的安全性

php - 为 password_hash() 清理密码

java - JAXB 如何在解码中强制执行特定顺序

java - 如何使 Lombok 的 EqualsAndHashCode 与 BigDecimal 一起使用