2015-09-17 18 views
0

根據CWE-329非隨機IV允許字典攻擊的可能性。 然而,in the AES crypto example,golang文檔使用非隨機IV:爲什麼golang crypto示例不使用隨機IV?

ciphertext := make([]byte, aes.BlockSize+len(plaintext)) 
iv := ciphertext[:aes.BlockSize] 

這是實現安全的,或者我應該使用一個隨機函數來獲取我的IV?

+3

你錯了。在加密的情況下,它使用隨機IV。在解密的情況下,它使用消息中的IV。不要讓IV作爲密文的一部分被初始化的事實騙過你;它所做的下一件事是從[強隨機源](http://golang.org/pkg/crypto/rand/#pkg-variables)將隨機字節讀入該片段。 – hobbs

+0

感謝您澄清GO示例,它確實通過執行'io.ReadFull(rand.Reader,iv)'來隨機化IV。我認爲這有點誤導。做'iv:= make([]字節,[:aes.BlockSize])'分配會更清楚。 – Vinzent

+0

甚至沒有有效的語法。 – hobbs

回答

1

這是安全的,因爲IV是由密碼安全僞隨機數發生器(CSPRNG)填充的,默認爲/dev/urandom,由OS提供。來自ExampleNewCBCEncrypter功能:

iv := ciphertext[:aes.BlockSize] 
if _, err := io.ReadFull(rand.Reader, iv); err != nil { 
    panic(err) 
} 
+2

你的第一句話是錯誤的。 'make'總是返回一個歸零片。在OP的例子中'ciphertext'將總是全爲零。 –

+1

這100%是錯誤的。如果製作切片時未提供容量,則與長度相同。是否提供它與後備數組是否已初始化無關;它始終初始化爲零。 – hobbs

+1

如果不使用「不安全」,則無法在Go中訪問未初始化的內存。 – JimB