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

问题描述:

我每次进行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

SHA-256是Injective。你给它相同的输入,它会给你相同的输出。然而,它不是,而是有效的。如果 两个哈希^h,你不能断定 = ,即使你知道| m | = | m | (这两个消息长度相同)。

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

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

所以简短的答案是:就是不要这样做。根据需要使用最强大的非确定性熵源生成尽可能多的随机字节,并直接使用它们。

+0

对我很好的答案!非常感谢! – hanjoonk