为了自动创建虚拟机,我从一些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 库作为生成哈希的更普遍兼容的方法,而不考虑发行版。