如果我散列IV值,是否有任何安全改进?

时间:2017-01-06 03:03:17

标签: java aes sha cbc-mode initialization-vector

每次加密AES / CBC时,我都会随机生成IV值。

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

每次加密时,我都会将IV值连接到密码字节。

如果我在concat到cipher byte之前散列(SHA-256)IV值,是否有任何安全改进?

1 个答案:

答案 0 :(得分:3)

SHA-256是 injective 。你给它相同的输入,它会给你相同的输出。但是,它不是主观。如果 m 1 m 2 都散列到 h ,则无法得出结论 m 1 = m 2 ,即使你知道| m 1 | = | m 2 | (两条消息长度相同)。

因此,应用SHA-256(或任何确定性函数)不能增加数据的熵。充其量,它不会减少它。换句话说:如果你的数据是16个纯粹的随机字节,那么在你对它进行散列后它就不会“超过纯粹的随机”。如果你的数据开始时并不是纯粹随机的,那么哈希就不会让它变得随机。你必须首先使用更好的熵源。

你没有提到的另一个问题是你目前有16个随机字节,但如果你把它们放入你的SHA-256哈希函数中,你就会得到32个字节。你打算用哪些?如果你只使用每一个字节 - 由于注入性 -​​ 即使输入是完全随机的并且哈希函数完美无缺,你也不会获得所有可能的位模式。 (如果你这样做,那么这将通过pidgin hole原则 - 意味着另外一半的字节将始终是你选择的字节的函数。只有一个非常糟糕的哈希函数,SHA-256当然不是会有这样的属性。)如果你试图聪明并以某种“聪明”的方式结合字节,那么你可能会让事情变得更糟。

所以简短的回答是:不要做。使用您可用的最强非确定性熵源生成任意数量的随机字节,并直接使用它们。