是否可以使用string#crypt生成更长的哈希值?

时间:2009-08-03 21:19:33

标签: ruby-on-rails ruby

我有两个关于Ruby的String#crypt(salt)方法的快速问题:

  1. 在文档中,它说盐应该是两个字符。我以为盐可以是我想要的任何东西,不是吗?我使用的是一个大于两个字符的随机值,它似乎工作正常。这是文档中的错误还是我对其工作原理的理解?
  2. 目前它生成一个约15个字符的字符串。我想生成更长的东西,至少32个字符。有没有办法用内置的Ruby功能来做到这一点?如果没有,建议使用什么gem或插件来生成给定字符串的更长哈希?

3 个答案:

答案 0 :(得分:2)

String#crypt忽略任何多余的字符,因此只使用前两个字符。

"foobar".crypt("abc") # => abVbJXzHUY99s
"foobar".crypt("abd") # => abVbJXzHUY99s

相反,您可以使用SHA1为您提供40个字符的加密,并允许任意长度的盐。

require 'digest/sha1'
Digest::SHA1.hexdigest("foobar" + "abc") # => 17dd6cae99582672c4b2ccc78fe4ad0888559ce7
Digest::SHA1.hexdigest("foobar" + "abd") # => 8aba27fd409286946504ac78098c41549d182316

更新:正如Gaius指出的那样,SHA1不适合生产。而是使用SHA256或SHA512。有关详细信息,请参阅他的回复。

答案 1 :(得分:2)

根据"Cryptographic Right Answers(我建议阅读和聆听,除非你真的知道你正在做什么...而且几乎没有人这样做),SHA1对于生产代码来说太过分了。使用SHA256:

require 'digest/sha2'
Digest::SHA2.hexdigest("foobar" + "abc") # => "32ef4da9bcfbbe1..." (64 chars)
Digest::SHA2.hexdigest("foobar" + "abd") # => "f5e363e77f14e07..." (64 chars)

或SHA512:

require 'digest/sha2'
digest = Digest::SHA2.new(512)
digest << 'foobar'
digest << 'abc'
digest.to_s                              # => ""415d4ca2647d17..." (128 chars)

digest.reset
digest << 'foobar'
digest << 'abd'
digest.to_s                              # => ""93fbbe3b6a7aac..." (128 chars)

答案 2 :(得分:2)

我会使用bcrypt-ruby。 Bcrypt是一种更安全的哈希算法,因为它的设计计算成本昂贵,因此速度慢,而Sha变种要快得多。这使暴力行为更加困难。