2016-12-15 4 views
1

my에서 암호화 키로 사용할 수있는 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

gem [pbkdf2] (https://github.com/emerose/pbkdf2-ruby)는 일반적인 경우와 같이 유용 할 수 있습니다. 그 중 하나는 패스 프레이즈에서 키를 파생시키는 것과 같은 함수를 사용합니다. –

+4

비트 대 바이트에 대해 약간의 혼란이있는 것 같습니다. SHA1 해시는 160 비트입니다. 'hexdigest'는 해당 비트의 [16 진수] (https://en.wikipedia.org/wiki/Hexadecimal) 표현을 반환합니다. 각 16 진수는 4 비트를 나타내므로 처음 32 문자를 취하면 32 × 4 = 128 비트가됩니다. 어쨌든, 네, 가장 확실한 접근 방법이 있습니다. 그러나 먼저 우리가 해결하려고하는 문제점을 알아야합니다. "암호화 키"를 생성하려고하지만 어떤 목적으로 사용합니까? 무엇을 암호화하고 어떻게 암호화하고 있습니까? 왜 32 비트 (* 매우 * 암호화 키에 대한 짧은)? –

+0

질문 변경은 어떻습니까? '32 비트 문자열'과'32 자 길이 문자열 '은 서로 다른 두 가지입니다. – lcguida

답변

2

당신이 원하는 경우 (약한) 암호 중 32 비트 문자열 : 정보의 동일한 금액도 8 자리의 16 진수로 표시 할 수 있습니다

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

:

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

4 아스키 문자 :

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