2013-03-27 56 views
-1

密碼的源字符串的最小長度是多少?我正嘗試創建獨特的會話ID,並且正在執行以下操作:密碼的源字符串的最小長度

cipherer = OpenSSL::Cipher::Cipher.new("aes-256-cbc").encrypt 

cipherer.update(Time.now.to_f.*(1000).to_i.to_s(36)) 

但它返回一個空字符串。我將乘法因子1000更改爲100000000000000之類的較大值,然後它有時會返回一個空字符串,有時會返回一個長字符串。我想這是因爲短於某些長度的字符串被密碼映射爲空字符串。這種理解是否正確?如果是這樣,最小長度是多少,我怎樣才能使它永遠不會返回空字符串?我不需要破譯它,因此不用擔心舍入錯誤或硬件依賴性是否會導致無法解密。

+0

也許一個UUID生成器寶石會更好? – Jords 2013-03-27 23:49:19

+0

我不是一個加密專家,但我從來沒有聽說過一個密碼,只是拋出輸入,因爲它太短。我知道的所有密碼都使用某種[填充](http://en.wikipedia.org/wiki/Padding_(cryptography)),以便允許可變長度的字符串。 – 2013-03-28 00:02:32

+0

我同意一個UUID生成器可能更適合,例如'require'securerandom'; SecureRandom.uuid'給你一個根據RFC 4122的UUID v4,類似於'「92a1517b-9c8b-4fc8-b31e-0920fcc6323b」' – 2013-03-28 00:05:07

回答

2

AES塊大小是128位= 16字節,它是16個字符。這意味着16字節進去,16字節出去。

您正在使用流模式,呼叫OpenSSL::Cipher#update。這意味着將update方法的輸入附加到密碼輸入,直到達到最小16字節。只有這樣,才能執行加密,只有這樣方法纔會返回實際值。

這意味着,如果你有8個字節的值餵它update通話將只產生一個輸出每一秒時間,這是你要做的:

cipherer = OpenSSL::Cipher::Cipher.new("aes-256-cbc").encrypt 
#=> #<OpenSSL::Cipher::Cipher:0x007fb67426e558> 
cipherer.update('X'*8) 
#=> "" 
cipherer.update('X'*8) 
#=> "\xA0+\xD8Y\xA5\xBC68\x972\x86!\xC7\xE5\xA2\xDE" 
cipherer.update('X'*8) 
#=> "" 
cipherer.update('X'*8) 
#=> "\xFB\xB1I\xE2\x01\xB8Z\x10\xDC\x96m?\xC3\x00\x19+" 

在另一方面,2個蓋帽會如果你提供一個32字節的值,那麼可以一次加密,例如

cipherer = OpenSSL::Cipher::Cipher.new("aes-256-cbc").encrypt 
=> #<OpenSSL::Cipher::Cipher:0x007fb6741579f8> 
cipherer.update('X'*32) 
#=> "\xA0+\xD8Y\xA5\xBC68\x972\x86!\xC7\xE5\xA2\xDE\xFB\xB1I\xE2\x01\xB8Z\x10\xDC\x96m?\xC3\x00\x19+" 
cipherer.update('X'*32) 
#=> "\xB2!\xBA>M\x13t\xEBv^\xCE\xAE\x18\x9A\xE3S\xD96\x95\x89\xC1\xB4\xAA\xDD\xD3\xDCp\e<\x90\xA79" 
cipherer.update('X'*32) 
#=> "\x95\xA3-\xB9\x93D\x1D\xC0\xB3mh\xE3\xB5N\x9C\x8C\xEA\xF3\x80\xD3\xBDU\xCB'\xC0E\xDA\x02\xA8L\a\xB3" 

直接解決您的問題是使用字符串作爲輸入,保證是16字節長。

儘管如此,我強烈建議您使用ruby附帶的UUID實現。有很多事情需要考慮,當執行加密的東西。你總是堅持遵守標準,並使用衆所周知的,廣泛使用的和經過戰鬥測試的實施。這就是說,如何獲得UUID:

require 'securerandom' 

SecureRandom.uuid 
#=> "c5059a24-25fc-4617-aaf7-280df52cd8d3" 

這樣簡單。

+0

感謝您回答我的問題。至於生成uuid,我發現了一個名爲uuidtools的gem,它有一個使用時間戳的方法'UUIDTools :: UUID.timestamp_create',它符合我的要求,它是唯一的。 – sawa 2013-03-28 00:35:28

+0

嗯,uuid v4由32個重要的十六進制字符組成,所以有16 ** 32 = 340282366920938463463374607431768211456可能的uuids。所以這是veeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee兩次:) – 2013-03-28 00:55:06

+0

其實'UUIDTools :: UUID。timestamp_create'也有32個重要的十六進制字符,所以選擇相同的uuid兩次的機會完全相同 – 2013-03-28 00:58:18