2016-12-15 83 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"