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

Is there any secure improvement if I hash IV value?

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

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

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

如果我在连接到密码字节之前散列 (SHA-256) IV 值,是否有任何安全改进?

SHA-256 是 单射的。你给它同样的输入,它会给你同样的输出。但是,它不是 满射。如果 m1m2 都哈希到 h,你不能得出m1 = m2,即使你知道 |m1| = |m2| (两条消息的长度相同)。

因此,应用 SHA-256(或任何确定性函数)不能增加数据的熵。充其量,它不会减少它。换句话说:如果您的数据是 16 个纯随机字节,那么在您对它进行哈希处理后,它不会“超过纯随机”。而且,如果您的数据一开始就不是纯随机的,那么对其进行哈希处理也无助于使其随机化。你必须首先使用更好的熵源。

另一个你没有提到的问题是你目前有 16 个随机字节,但如果你将它们放入你的 SHA-256 哈希函数中,你将得到 32 个字节。您要使用哪些?如果你只使用每个第二个字节——由于单射性——你不会得到所有可能的位模式,即使你的输入是完全随机的并且哈希函数是完美的。 (如果你这样做了,那么这将 - 根据 pidgin hole 原则 - 意味着另一半字节将始终是你选择的字节的函数。只有一个非常糟糕的哈希函数,SHA-256 当然不是, 会有这样的 属性.) 如果你试图变得聪明并以某种“聪明”的方式组合字节,很可能你会让事情变得更糟。

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