我最近搜索了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()
返回的值是密码或类似密码的东西,那么使用PBKDF2,bcrypt或argon2之类的密码哈希算法将是更好的选择。