2009-08-03 82 views
2

我对Ruby的String#crypt(salt)方法二简单的问题:是否可以使用字符串#crypt生成更长的散列值?

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

回答

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 

UPDATE:作为该犹指出,SHA1是不是最好的生产。请使用SHA256或SHA512。详细信息请参阅他的回复。

+0

再次谢谢你,先生。 :) – cakeforcerberus 2009-08-04 01:58:32

+1

你有正确的想法,ryanb,但SHA1已过时。只需在您的代码上执行gsub('1','2'),这太棒了! – 2009-08-04 12:33:25

+0

(好吧,至少在接下来的几年里) – 2009-08-04 12:33:57

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

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