我最近搜索了Java代码以使用AES加密数据,并在网上找到了这段代码:

        MessageDigest digest = MessageDigest.getInstance("SHA-256");
        digest.update(getSecretKey().getBytes("UTF-8"));
        byte[] keyBytes = new byte[16];
        System.arraycopy(digest.digest(), 0, keyBytes, 0, keyBytes.length);
        Key aesKey = new SecretKeySpec(keyBytes, "AES");

        // Then encrypt
        byte[] iv = initIV();
        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
        cipher.init(Cipher.ENCRYPT_MODE, aesKey, new IvParameterSpec(iv));
        byte[] encrypted = cipher.doFinal(value.getBytes(encoding));


我想了解为什么开发人员将MessageDigest与秘密密钥一起使用。用这种方法代替编写的好处是什么?

        Key aesKey = new SecretKeySpec(getSecretKey().getBytes("UTF-8"), "AES");

        // Then encrypt
        byte[] iv = initIV();
        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
        cipher.init(Cipher.ENCRYPT_MODE, aesKey, new IvParameterSpec(iv));
        byte[] encrypted = cipher.doFinal(value.getBytes(encoding));


提前谢谢了

吉尔斯

最佳答案

通过获取getSecretKey().getBytes("UTF-8")的SHA-256哈希,无论getSecretKey()返回的字符串的大小如何,都可以确保获得256位AES密钥。这是一个有用的属性。程序员本质上是将SHA-256用作临时key derivation function(KDF)。但是,由密码学家精心设计的KDF是更好的选择。例如,如果getSecretKey()返回的值是密码或类似密码的东西,那么使用PBKDF2bcryptargon2之类的密码哈希算法将是更好的选择。

07-25 20:37