Java 如果我使用自己的密钥,为什么需要哈希?

Java 如果我使用自己的密钥,为什么需要哈希?,java,encryption,aes,encryption-symmetric,Java,Encryption,Aes,Encryption Symmetric,如果我使用自己的密钥,为什么需要哈希?我发现每一个地方都是这样做的,如下所示 key = myKey.getBytes("UTF-8"); sha = MessageDigest.getInstance("SHA-1"); key = sha.digest(key); key = Arrays.copyOf(key, 16); secretKey = new SecretKeySpec(key, "AES"); 有

如果我使用自己的密钥,为什么需要哈希?我发现每一个地方都是这样做的,如下所示

        key = myKey.getBytes("UTF-8");
        sha = MessageDigest.getInstance("SHA-1");
        key = sha.digest(key);
        key = Arrays.copyOf(key, 16);
        secretKey = new SecretKeySpec(key, "AES");

有人能解释一下散列的好处吗

因为在您的情况下,AES需要128位密钥,所以构建它需要16个字节。如何获取这16个字节?最常见的方法是散列用户密码并获取散列的前16个字节。这样做将确保AES算法始终收到正确的16字节密钥


由于散列算法,即使是“123456”或“god”这样的短密码也会被转换为固定长度的20字节散列

这只是从较大的密码中获取16字节密钥的可靠和安全的方法。
密钥
不能是正确选择的密钥,在我的例子中,我使用unix生成128位密钥,并使用以下命令dd if=/dev/uradom of=/data/myfolder/key/aeskey.txt bs=16 count=1将其写入文件。我可以直接从文件中读取密钥进行加密/解密,还是在读取后需要进行哈希运算。在您的情况下,没有理由这样做。散列不会使您的密钥更强或更弱(在熵方面)。这只是一种单向转换/dev/Uradom是一个很好的熵源,只要底层PRNG是好的,您就可以直接向AES提供结果。非常感谢您的帮助!!不客气+1感谢您使用/dev/uradom而不是经典的rand(time(0));