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

标签 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 值连接到密码字节。

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

最佳答案

SHA-256 是单射。你给它同样的输入,它会给你同样的输出。然而,它不是满射。如果 m1m2 都散列到 h,你不能得出结论m1 = m2,即使你知道 |m>1| = |m2| (两条消息的长度相同)。

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

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

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

关于java - 如果我散列 IV 值,是否有任何安全改进?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41498262/

相关文章:

java - f :param is null in bean jsf

java - 如何在eclipse中使用现有的maven项目?

swift - 对 Swift 3.1 的原生 HMAC SHA512 支持

java - 将 Base64 编码的字符串传递到 sha512 函数会得到与硬编码时不同的结果

java - 在字符串中的变量周围包含引号

java - 如何基于字符串创建新类型的对象?

python - 值错误: Invalid padding bytes when decrypting with AES256

web-services - AesManaged 和 RijndaelManaged

java - 如何在 Java 中创建安全的随机 AES key ?

c# - 字符串 SHA-512 编码 : C# and JAVA result is different