如何将SHA1散列字符串截断为32位字符串

时间:2016-12-15 15:16:41

标签: ruby encryption sha1 truncate truncation

我想创建一个32位字符串,我可以将其用作加密密钥。该字符串/键应该从纯文本字符串派生,例如:

'I am a string'

我的方法首先是哈希:

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

然后只使用前32个字符:

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

然而,我觉得必须有一个更好的方法,我不确定我是否冒险让2个输入字符串产生类似的密钥。

什么是更好的方法?我看到this post触及了截断,但无法找到对我有吸引力的答案。

1 个答案:

答案 0 :(得分: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 chars:

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