2016-12-15 17 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) может быть полезным в вашем случае - как типичные ly один использует такую ​​функцию для получения ключей из кодовой фразы –

+4

У вас, похоже, есть путаница в отношении бит против байтов. Хэш SHA1 составляет 160 бит. 'hexdigest' возвращает представление [hexadecimal] (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"