Ruby on rails 是否可以使用字符串#crypt生成更长的哈希值?

Ruby on rails 是否可以使用字符串#crypt生成更长的哈希值?,ruby-on-rails,ruby,Ruby On Rails,Ruby,关于Ruby的String#crypt(salt)方法,我有两个简短的问题: 在文件中,它说盐应该是两个字符。我以为盐可以是我想要的任何东西,不是吗?我使用了一个大于两个字符的随机值,它似乎工作正常。这是文档中的错误还是我对其工作原理的理解中的错误 目前,它生成一个约15个字符的字符串。我想生成更长的内容,至少32个字符。有没有办法利用内置的Ruby功能实现这一点?如果不是,建议使用什么gem或插件来简单地生成给定字符串的较长散列 String#crypt忽略任何额外字符,因此只使用前两个字符

关于Ruby的
String#crypt(salt)
方法,我有两个简短的问题:

  • 在文件中,它说盐应该是两个字符。我以为盐可以是我想要的任何东西,不是吗?我使用了一个大于两个字符的随机值,它似乎工作正常。这是文档中的错误还是我对其工作原理的理解中的错误
  • 目前,它生成一个约15个字符的字符串。我想生成更长的内容,至少32个字符。有没有办法利用内置的Ruby功能实现这一点?如果不是,建议使用什么gem或插件来简单地生成给定字符串的较长散列
  • String#crypt
    忽略任何额外字符,因此只使用前两个字符

    "foobar".crypt("abc") # => abVbJXzHUY99s
    "foobar".crypt("abd") # => abVbJXzHUY99s
    
    相反,您可以使用SHA1为您提供40个字符的加密,并允许任意长度的salt

    require 'digest/sha1'
    Digest::SHA1.hexdigest("foobar" + "abc") # => 17dd6cae99582672c4b2ccc78fe4ad0888559ce7
    Digest::SHA1.hexdigest("foobar" + "abd") # => 8aba27fd409286946504ac78098c41549d182316
    
    更新:正如盖尤斯指出的,SHA1不适合生产。而是使用SHA256或SHA512。详细信息请参见他的回复。

    根据(我建议阅读和聆听,除非你真的知道自己在做什么……而且几乎没有人知道),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)
    
    需要“摘要/sha2”
    摘要=摘要::SHA2.new(512)
    
    消化我会用。Bcrypt是一种更安全的散列算法,因为它的设计计算成本高,因此速度慢,而Sha变体则快得多。这使得暴力强迫变得更加困难。

    你的想法是对的,ryanb,但是SHA1已经过时了。只要在你的代码中使用gsub('1','2'),它就很棒了!(好吧,至少在未来几年内)这很有趣,我会研究一下。谢谢:)+1这也是一个很好的观点。考虑边信道攻击和定时攻击是很重要的!