我正在尝试使用PBE生成密钥,但SecretKeyFactory生成的密钥与输入密码完全相同。我尝试了不同的算法,迭代计数等等,但它仍然是相同的,所以我觉得我在这里错过了一步。
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”,那么生成的密钥与密码不同,但是我使用的算法是如何生成与输入密码完全相同的密钥?
答案 0 :(得分:2)
使用SecretKeyFactory SecretKey
生成PBEWithHmacSHA256AndAES_128
时,您将获得com.sun.crypto.provider.PBEKey
的实例,此类具有"特殊功能"它返回原来的"键" (称为密码)在调用getEncoded()
而不是加密密钥材料时。如果我理解正确,密钥派生不会由KeyFactory进行,而是由密码本身进行。
因此,您不应尝试将SecretKey
实例转换为SecretKeySpec
实例;而只是在正确的密码实例中使用生成的SecretKey
实例:
Cipher c = Cipher.getInstance("PBEWithHmacSHA256AndAES_128");
c.init(Cipher.ENCRYPT_MODE, secretKey);