我有两个关于Ruby的String#crypt(salt)
方法的快速问题:
答案 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变种要快得多。这使暴力行为更加困难。