使用ruby生成为/ etc/shadow格式化的SHA512 crypt-style哈希?

Gab*_*esy 7 ruby encryption passwords crypt sha

我想生成SHA512散列密码,以便直接包含在/ etc/shadow文件中,以便与chef的用户资源一起使用.通常我会去stdlib的Digest库,但它不会以正确的格式生成哈希:

ruby-1.9.2-p136 :001 > require 'digest/sha2'
 => true 
ruby-1.9.2-p136 :002 > Digest::SHA512.hexdigest('test')
 => "ee26b0dd4af7e749aa1a8ee3c10ae9923f618980772e473f8819a5d4940e0db27ac185f8a0e1d5f84f88bc887fd67b143732c304cc5fa9ad8e6f57f50028a8ff" 
Run Code Online (Sandbox Code Playgroud)

shadow文件想要的格式是:

$6$/ShPQNXV$HJnibH9lw01qtYqyJQiBf81ggJB2BGUvKA7.kv39HGCeE.gD4C/SS9zAf5BrwOv3VJzvl99FpHYli9E8jykRC0
Run Code Online (Sandbox Code Playgroud)

我看过的事情:

  • openssl"dgst"模块返回与.hexdigest相同的格式,其"passwd"模块不包含SHA512支持.
  • String#crypt,但不支持SHA512.(编辑:这只是OSX的情况 - 如果指定"$ 6 $ somesalt"作为盐,现代Linux发行版将起作用)
  • ruby-crypt gem,但它不支持SHA512

为了比较,返回正确格式的东西是PHP的crypt,但我宁愿不必向PHP执行简单的操作.

Gab*_*esy 6

经过进一步研究:

  • mkpasswd命令,在debian上的whois包中(很奇怪):

    mkpasswd -m sha-512

  • String#crypt实际上调用平台的本机crypt()调用,但OSX(最多10.6)不包括对备用密码的支持."password".crypt('$ 6 $ somesalt')可以在Linux平台上运行.