2016-12-15 55 views
1

我想创建一个32位字符串,我可以将其用作加密密钥。此字符串/关键应该从一个纯文本字符串中获得,如:如何将SHA1散列字符串截断为32位字符串

'I am a string' 

我的做法首先是哈希吧:

hashed_string = Digest::SHA1.hexdigest('I am a string') # => 'bd82fb0e81ee9f15f5929e0564093bc9f8015f1d' 

然后到只使用前32个字符:

hashed_string[0..31] # => 'bd82fb0e81ee9f15f5929e0564093bc9' 

但是,我觉得必须有更好的方法,而且我不确定是否有风险,即2个输入字符串最终导致类似的键。

什么是更好的方法?我看到this post涉及截断,但无法找到在那里吸引我的答案。

+0

宝石[pbkdf2](https://github.com/emerose/pbkdf2-ruby)可以用于你的情况 - 作为典型一个人使用这样的函数从密码中导出密钥 –

+4

您似乎对位和字节有些混淆。 SHA1哈希值是160位。 'hexdigest'返回这些位的[十六进制](https://en.wikipedia.org/wiki/Hexadecimal)表示。每个十六进制数字代表4位,所以当你取前32个字符时,你会得到32×4 = 128位。无论如何,是的,肯定有更好的方法 - 但首先我们必须知道你想要解决什么问题。你想生成一个“加密密钥”,但为了什么目的?你在加密什么,你如何加密它?为什么32位(*非常短的加密密钥)? –

+0

如何改变问题? '32位字符串'和'32个字符长度字符串'是两个不同的东西。 – lcguida

回答

2

如果你想与32位你的(弱)密码的字符串:

Digest::SHA1.digest('I am a string').unpack('B32').first 
#=> "10111101100000101111101100001110" 

的相同的信息量也可以用8个十六进制数字显示:

Digest::SHA1.hexdigest('I am a string')[0,8] 
#=> "bd82fb0e" 

或4 ascii字符:

Digest::SHA1.digest('I am a string')[0,4] 
#=> "\xBD\x82\xFB\x0E"