我正在尝试使用 PBE 生成 key ,但 SecretKeyFactory 生成的 key 与输入密码完全相同。我尝试了不同的算法、迭代计数等,但它仍然是相同的,所以我觉得我在这里错过了一步。
public SecretKey generateKey(String password, String salt) {
char[] passChars = password.toCharArray();
byte[] saltBytes = salt.getBytes();
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("PBEWithHmacSHA256AndAES_128");
PBEKeySpec keySpec = new PBEKeySpec(passChars, saltBytes, 2048, 128);
SecretKey secretKey = keyFactory.generateSecret(keySpec);
byte[] encodedKey = secretKey.getEncoded();
System.out.println("key: " + new String(encodedKey));
return new SecretKeySpec(encodedKey, "AES");
}
编辑:如果我使用算法“PBKDF2WithHmacSHA1”,那么生成的 key 与密码不同,但为什么我使用的算法生成的 key 与输入密码完全相同?
最佳答案
当您使用 SecretKeyFactory PBEWithHmacSHA256AndAES_128
生成 SecretKey
时,您将获得 com.sun.crypto.provider.PBEKey
的实例,并且此类具有“特殊功能”,它在调用 getEncoded() 时返回原始“ key ”(也称为密码),而不是加密 key Material 。如果我理解正确的话, key 派生将不是由 KeyFactory 而是由密码本身进行。
因此,您不应尝试将 SecretKey
实例转换为 SecretKeySpec
实例;相反,只需在正确的密码实例中使用生成的 SecretKey
实例:
Cipher c = Cipher.getInstance("PBEWithHmacSHA256AndAES_128");
c.init(Cipher.ENCRYPT_MODE, secretKey);
关于Java SecretKeyFactory生成的 key 与输入密码相同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39954211/