独立于平台生成模块化加密格式 (MFC) SHA512 的 Linux 密码,用于 Ruby 中的 /etc/shado



为了自动创建虚拟机,我从一些Ruby代码中生成了/etc/shadow的密码。这是在主机上完成的。主机可以是 Linux 或 Windows。

在 Linux 主机上

"mypassword".crypt("$6$" + "123SaLt9")

返回

$6$123SaLt9$idgUFrrwVkpDMcoHj7SAYH0UwCY6LymbsR9yTDrelYgcZ2wstoynmLIY83qBF0/BIT4Od.rQL2g3n2jEG/VXp/

这是正确的,适用于/etc/shadow。

但是,在某些Windows 10主机上(大约两周前在两个同事的机器上(,相同的代码行返回

$6MrNddDu3Hf6

显然,这是行不通的。(在这里观察到类似的行为 https://judepereira.com/blog/use-ruby-to-generate-your-shadow-password/的 MacOS(

我忽略了这个函数依赖于平台(https://apidock.com/ruby/String/crypt(。除了几周前它确实有效之外,我认为我不能理所当然地认为它在 Windows 10 主机上可靠地运行。

我需要的是一个解决方案,它在 Linux 和 Windows 10 主机上以 MFC 格式返回正确的密码哈希。据我了解,MFC 的密码部分不仅仅是生成 SHA512 的 base64 编码结果,而是一个更复杂的过程(https://akkadia.org/drepper/SHA-crypt.txt,使用 ruby 生成 SHA512 加密样式的哈希格式化为/etc/shadow?我想避免自己在 Ruby 中实现算法。我做了几个小时的研究,但到目前为止找不到任何有用的东西。

任何想法如何在Windows上避免此问题,即如何独立于平台生成这些密码哈希?

正如您所发现的,crypt方法依赖于平台。它可用的算法取决于主机。macOS 仅支持 DES。现代Linux发行版可能会支持所有现代密码。Windows——嗯,这完全是一个废话,取决于你如何运行Ruby。(您使用的是 WSL 吗?直接在Windows上运行Ruby?别的什么?

最好将crypt排除在图片之外,并使用库为您处理它。首先,安装 unix-crypt:

gem install unix-crypt

然后使用它来生成你的哈希:

require 'unix_crypt'
# This is the hash you generated on Linux with crypt for your example
expected_hash = '$6$123SaLt9$idgUFrrwVkpDMcoHj7SAYH0UwCY6LymbsR9yTDrelYgcZ2wstoynmLIY83qBF0/BIT4Od.rQL2g3n2jEG/VXp/'
# Generate the same hash using unix-crypt instead
hash = UnixCrypt::SHA512.build('mypassword', '123SaLt9')
# Verify they match (returns true)
expected_hash == hash

这在 macOS 上对我有用,而您的原始示例则不适用:

"mypassword".crypt("$6$" + "123SaLt9")
=> "$6MrNddDu3Hf6"

所以它可能也适用于Windows。如果没有,那么我建议您查看Windows用户如何运行Ruby,并将他们切换到Windows子系统for Linux,并让他们使用您正在使用的特定Linux发行版。

一旦他们启动并运行了Linux,他们就可以安装Ruby,从Ruby解释器的角度来看,它将在Linux上运行,而不是Windows,因此它对crypt算法的访问应该与您拥有的相同,并且您应该能够像在原始示例中一样使用crypt

或者,您可以使用我示例中的 unix-crypt 库作为生成哈希的更普遍兼容的方法,而不考虑发行版。

最新更新