2011-03-02 99 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