我的目标
我有一个旧的 MySQL 数据库,其中的用户名和密码使用 sha256 进行哈希处理。我没有原始密码,也不可能知道它们。这是从数据库到 Linux 系统的简单用户迁移。我需要在 Linux 上创建所有这些用户,因为 Linux 身份验证将在其他部分使用,并且我们不想让用户再次创建凭据。
到目前为止我的想法
我发现您可以使用 crypt 生成使用影子文件的奇怪的 base64 格式,但这需要原始密码。我理解Linux下的流程是这样的:
- 根据盐和密码生成简单的 sha512 哈希值
- 循环 1000 5000 次,根据先前的哈希值与密码和盐的哈希值交替连接,计算新的 sha512 哈希值。此外,sha512-crypt 允许您指定自定义轮数,从 1000 到 999999999
- 对最终哈希使用特殊的 Base64 编码来创建密码哈希字符串。
参考:https://www.vidarholen.net/contents/blog/?p=33
由于第一步是用盐生成哈希,所以我认为这应该是可能的。由于 linux 是开源的,我相信我可以尝试在这样的地方获取 crypt 的源代码https://code.woboq.org/userspace/glibc/crypt/crypt-entry.c.html 并从第2步开始,但在做所有这些之前,我不知道它是否会成功,我想知道是否有更简单的方法。如果没有,我在哪里可以获得正确的linux源代码来做到这一点?我不确定我提供的链接是否正确。
多谢。
答案1
不,抱歉,您不能直接使用旧哈希来生成新哈希。
其一,您讨论的是拥有 SHA-256 哈希值,然后使用它来计算基于 SHA-512 的哈希值,如果不反转 SHA-256 哈希值,就不会发生这种情况。其次,即使您要使用基于相同哈希的加密算法($5$
对于基于 SHA-256 的加密),链接中的第一步仍然是“从计算备用总和 sha512(密码 + 盐 +密码)”,为此,您需要明文密码。
从一种密码哈希转换为另一种密码哈希的方法是,要么强制用户以某种方式刷新其密码,以便生成新的哈希;要么强制用户以某种方式刷新其密码,以便生成新的哈希。或者更好的是,修改登录例程,以便在新哈希值不存在时接受针对旧哈希值的登录,和同时生成新的哈希值。这样,您最终可以淘汰旧的哈希值,除了被遗忘的帐户之外。
答案2
有多种方法可以做到这一点:您可能不需要编译自己的代码。
查看 PAM。它是一个模块化的身份验证管理器。它被用在许多 Gnu/Linux 上。可能有一个模块允许您使用现有的哈希值。