我对Ruby的String#crypt(salt)
方法二简单的问题:是否可以使用字符串#crypt生成更长的散列值?
- 在本文档中,它说的盐应该是两个字符。我认为盐可以是我想要的任何东西,不是吗?我正在使用一个大于两个字符的随机值,它似乎工作正常。这是文档中的错误还是我对这种工作原理的理解?
- 目前它会生成一个大约15个字符的字符串。我想生成更长的东西,至少32个字符。有没有一种方法可以通过内置的Ruby功能来实现?如果没有,建议使用什么gem或插件来简单地生成一个给定字符串的更长散列?
我对Ruby的String#crypt(salt)
方法二简单的问题:是否可以使用字符串#crypt生成更长的散列值?
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。详细信息请参阅他的回复。
根据"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)
我会用bcrypt-ruby。 Bcrypt是一种更安全的哈希算法,因为它的设计计算昂贵,因此速度较慢,而Sha变种速度更快。这使得暴力更加困难。
再次谢谢你,先生。 :) – cakeforcerberus 2009-08-04 01:58:32
你有正确的想法,ryanb,但SHA1已过时。只需在您的代码上执行gsub('1','2'),这太棒了! – 2009-08-04 12:33:25
(好吧,至少在接下来的几年里) – 2009-08-04 12:33:57