2011-03-02 97 views
6

我想生成SHA512散列密码,直接包含在/ etc/shadow文件中,以便与chef's user resource一起使用。通常我会去STDLIB的Digest库这一点,但它不会产生正确的格式哈希:使用ruby生成格式化为/ etc/shadow的SHA512 crypt-style哈希?

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

,影子文件想要的格式是:

$6$/ShPQNXV$HJnibH9lw01qtYqyJQiBf81ggJB2BGUvKA7.kv39HGCeE.gD4C/SS9zAf5BrwOv3VJzvl99FpHYli9E8jykRC0 

事我看了:

  • openssl“dgst”模块返回与.hexdigest相同的格式,其“passwd”模块不包含SHA512支持。
  • String#crypt,但不支持SHA512。 (编辑:这只是对OSX的情况下 - 如果指定“$ 6 $ somesalt”为盐现代的Linux发行版都可以)
  • ruby-crypt宝石,但是它不支持SHA512

为了比较,东西返回正确的格式是PHP的crypt,但我宁愿不必执行PHP的东西,应该很简单。

回答

5

经过进一步研究:

  • mkpasswd命令了,这在Debian处于whois包(怪异):

    mkpasswd -m SHA-512

  • 字符串#隐窝确实实际上调用平台的本地crypt()调用,但OSX(最高为10.6)不包括对替代密码的支持。 “密码”.crypt('$ 6 $ somesalt')将在Linux平台上运行。

+0

我会跟你的问题合并这一点。 – Blender 2011-03-02 23:20:31

+0

会对本地ruby解决方案感兴趣:http://stackoverflow.com/questions/9043017/how-to-convert-php-crypt-function-sha512-to-ruby – c33s 2012-01-28 04:54:54