Java AES - 密钥的消息摘要

时间:2018-02-05 22:26:13

标签: java encryption aes

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

        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));

非常感谢提前

吉勒

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

显着的区别在于,在上面的代码中,getSecretKey()的散列(SHA-256)被应用于构造AES密钥。

在下面的代码getSecretKey()中直接采用原始/应用。

......以上我认为“更安全”;)