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

标签 java encryption cryptography secret-key

我正在尝试使用 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/

相关文章:

java - Android:使用 Assets 目录中存储的 key 文件初始化 PublicKey

assembly - 将 ARMv8 Crypto 加速的 SHA256 集成到现有的 C 实现函数中

java - 将 session ID/ key 作为请求参数传递的安全风险

java.util.Vector 无法转换为 java.util.ArrayList

java - "Software caused connection abort: socket write error"的官方原因

c# - 使用 MachineKey 的加密不是持久的

c++ - Tag18 的 OpenPGP CFB 模式

asp.net-core - ASP.NET Core - 数据保护

java - 通知抽屉似乎已满 - 新通知被丢弃

java - 在Android Studio中添加Facebook依赖项后出现Gradle构建错误