我最近搜索了使用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));
非常感谢提前
吉勒
答案 0 :(得分:1)
通过使用getSecretKey().getBytes("UTF-8")
的SHA-256哈希,无论getSecretKey()
返回的字符串大小如何,都可以保证获得256位AES密钥。这是一个有用的属性。程序员基本上使用SHA-256作为临时key derivation function(KDF)。然而,密码学家设计的精心设计的KDF是更好的选择。例如,如果getSecretKey()
返回的值是密码或类似密码,则密码哈希算法(如PBKDF2,bcrypt或argon2)将是更好的选择
答案 1 :(得分:0)
显着的区别在于,在上面的代码中,getSecretKey()
的散列(SHA-256)被应用于构造AES密钥。
在下面的代码getSecretKey()
中直接采用原始/应用。
......以上我认为“更安全”;)