2017-01-06 62 views
2

我每次進行AES/CBC加密時都會隨機產生IV值。如果我散列IV值,是否有任何安全改進?

private static IvParameterSpec getRandomIvParameterSpec() { 
    byte[] iv = new byte[16]; 
    new SecureRandom().nextBytes(iv); 
    return new IvParameterSpec(iv); 
} 

我Concat的IV值到加密字節每次我進行加密。

如果我在concat之前將(SHA-256)IV值散列到密碼字節,是否有任何安全改進?

+4

**不要試圖推出自己的安全改進。**這對於您的應用程序的安全性不會很好。 – Makoto

回答

3

SHA-256是Injective。你給它相同的輸入,它會給你相同的輸出。然而,它不是,而是有效的。如果 兩個哈希^h,你不能斷定 = ,即使你知道| m | = | m | (這兩個消息長度相同)。

因此,應用SHA-256(或任何確定性函數)不能增加數據的熵。充其量,它不會減少它。換句話說:如果你的數據是16個純粹的隨機字節,在散列之後它不會「超過純粹的隨機」。如果你的數據不是純粹隨機的,那麼哈希算法不會使它變得隨機。首先你必須使用更好的熵源。

另一個你沒有提到的問題是,你現在有16個隨機字節,但是如果你把它們放到你的SHA-256哈希函數中,你會得到32個字節。你打算使用哪些?如果您只使用每個第二個字節 - 由於注入性 -​​ 即使您的輸入是完全隨機的並且哈希函數完美無瑕,您也不會獲得所有可能的位模式。 (如果你這樣做了,那麼按照pidgin hole原則,這意味着另一半字節總是你選擇字節的函數,只有一個非常糟糕的散列函數,當然SHA-256當然不是,會擁有這樣的屬性。)如果你試圖聰明並以某種「聰明」的方式組合字節,很可能會讓事情變得更糟。

所以簡短的答案是:就是不要這樣做。根據需要使用最強大的非確定性熵源生成儘可能多的隨機字節,並直接使用它們。

+0

對我很好的答案!非常感謝! – hanjoonk

相關問題