有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

如果我散列IV值,有什么安全改进吗?

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

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

每次加密时,我都会将IV值与密码字节进行合并

如果在concat之前将(SHA-256)IV值散列到加密字节,是否有任何安全改进


共 (1) 个答案

  1. # 1 楼答案

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

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

    您没有提到的另一个问题是,您当前有16个随机字节,但如果将它们放入SHA-256哈希函数中,您将得到32个字节。你打算用哪一种?如果你只使用每秒钟一个字节——由于内射性——即使你的输入是完全随机的,哈希函数是完美的,你也不会得到所有可能的位模式。(如果你这样做了,那么这将——根据洋泾浜洞原理——意味着另一半字节将始终是你选择的字节的函数。只有一个真正糟糕的哈希函数(当然不是SHA-256)才会有这样的属性。)如果你试着聪明一点,以某种“聪明”的方式组合字节,很可能你会让事情变得更糟

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