如果我散列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值散列到密码字节,是否有任何安全改进?
SHA-256是Injective。你给它相同的输入,它会给你相同的输出。然而,它不是,而是有效的。如果米 和米 两个哈希^h,你不能断定米 =米 ,即使你知道| m | = | m | (这两个消息长度相同)。
因此,应用SHA-256(或任何确定性函数)不能增加数据的熵。充其量,它不会减少它。换句话说:如果你的数据是16个纯粹的随机字节,在散列之后它不会“超过纯粹的随机”。如果你的数据不是纯粹随机的,那么哈希算法不会使它变得随机。首先你必须使用更好的熵源。
另一个你没有提到的问题是,你现在有16个随机字节,但是如果你把它们放到你的SHA-256哈希函数中,你会得到32个字节。你打算使用哪些?如果您只使用每个第二个字节 - 由于注入性 - 即使您的输入是完全随机的并且哈希函数完美无瑕,您也不会获得所有可能的位模式。 (如果你这样做了,那么按照pidgin hole原则,这意味着另一半字节总是你选择字节的函数,只有一个非常糟糕的散列函数,当然SHA-256当然不是,会拥有这样的属性。)如果你试图聪明并以某种“聪明”的方式组合字节,很可能会让事情变得更糟。
所以简短的答案是:就是不要这样做。根据需要使用最强大的非确定性熵源生成尽可能多的随机字节,并直接使用它们。
对我很好的答案!非常感谢! – hanjoonk
**不要试图推出自己的安全改进。**这对于您的应用程序的安全性不会很好。 – Makoto