【问题标题】:Platform-independently generate Linux password in Modular Crypt Format (MFC) SHA512 for /etc/shadow in Ruby独立于平台为 Ruby 中的 /etc/shadow 生成模块化加密格式 (MFC) SHA512 的 Linux 密码
【发布时间】:2020-09-23 11:12:20
【问题描述】:

为了自动创建虚拟机,我从一些 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.txtUsing ruby to generate SHA512 crypt-style hashes formatted for /etc/shadow?)。我想避免在 Ruby 中自己实现算法。我做了几个小时的研究,但到目前为止找不到任何有用的东西。

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

【问题讨论】:

  • 此类问题应包含minimal reproducible example,该minimal reproducible example 演示了在 Linux 上成功生成以及在 Windows 和 macOS 上生成失败,并通过测试验证输出。通过向我们提供示例代码,清楚地展示问题以及重现问题的步骤,使我们能够轻松地为您提供帮助。 Ruby + 加密在我的专业驾驶室中是正确的,但请不要让我从头开始学习所有让你达到这一点的东西。
  • @anothermh 非常感谢您的专业知识。我已经改写了这个问题并添加了一个例子。我希望现在更清楚了。

标签: ruby linux windows password-hash


【解决方案1】:

如您所见,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 Subsystem for Linux 并让他们使用您正在使用的特定 Linux 发行版。

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

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

【讨论】:

  • 我们在 Vagrant 的上下文中运行 Ruby 代码。 Vagrantfile 是 Ruby,执行有问题的 Ruby 代码。 (计划使它成为一个干净的 Vagrant 插件,暂时可以这样想。)我不确定如何在这种情况下以自动方式安装 gem。我会调查一下,但对此有不好的感觉。关于 Linux 的 Windows 子系统:我认为将此系统用作我们 VM 的主机是没有意义的。
  • 我没有意识到这是给 Vagrant 的。我对 Vagrant 不太熟悉,所以我不确定我能提供帮助。但是,如果您能够要求 unix-crypt gem 并使用我给出的示例,那么您将拥有一个跨平台且可靠的解决方案。
  • @Flo 这个答案是否在 Ruby 中为您提供了一种独立于平台的方法来为/etc/shadow 生成密码?如果是这样,请花点时间阅读What should I do when someone answers my question?
  • 我没有忘记您的宝贵帮助。但我仍然需要一些时间来验证它是否真的可以在多个平台上运行。
猜你喜欢
  • 1970-01-01
  • 2020-07-04
  • 1970-01-01
  • 2015-08-12
  • 1970-01-01
  • 2011-07-31
  • 2020-09-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多