Java SecretKeyFactory生成的密钥与输入密码相同

时间:2016-10-10 08:29:44

标签: java encryption cryptography secret-key

我正在尝试使用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”,那么生成的密钥与密码不同,但是我使用的算法是如何生成与输入密码完全相同的密钥?

1 个答案:

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