gpt4 book ai didi

java - SecretKey.getEncoded() 如何为 PBE 生成的 key 返回明文密码?

转载 作者:行者123 更新时间:2023-12-01 02:21:41 31 4
gpt4 key购买 nike

我正在试验 key 派生函数,我注意到我通过所有 PBE 算法生成的 key 编码为纯文本密码。

我的意思是:

public class Main {
public static void main(String[] args) throws Exception {
byte[] salt = new byte[256/8];
SecureRandom.getInstanceStrong().nextBytes(salt);
KeySpec spec = new PBEKeySpec("password".toCharArray(), salt, /*iterations*/ 1000, /*key length*/ 1024);
SecretKeyFactory factory = SecretKeyFactory.getInstance("PBEWithHMACSHA512AndAES_256"); // PBE with HMAC SHA512 and AES_256
SecretKey secret = factory.generateSecret(spec);
System.out.println(new String(secret.getEncoded()));
}
}

版画 password我期望 1024 个看似随机的字节。这对我来说不太合适..你能解释一下吗?

顺便说一句:请注意,对于 PBKDF2 算法,相同的代码似乎确实像我期望的那样工作。

PS:以防万一,我在 mac (13.0.1.hs-adpt) 上使用 vanilla OpenJDK 13

最佳答案

编码并不意味着加密。根据 Key类 javadoc getEncoded()方法返回键的表示:

 * This is an external encoded form for the key used when a standard
* representation of the key is needed outside the Java Virtual Machine,
* as when transmitting the key to some other party. The key
* is encoded according to a standard format (such as
* X.509 {@code SubjectPublicKeyInfo} or PKCS#8), and
* is returned using the {@link #getEncoded() getEncoded} method.

PBEWithHMACSHA512AndAES_256是一种对称算法,观察到的行为是有道理的。加密和解密使用相同的 key ,不能修改。

看看 How do I properly use the “PBEWithHmacSHA512AndAES_256” algorithm?题。您需要加密输入,在 byte[] messageBytes下方, 正确 Cipher实例:
Cipher cipherEncrypt = Cipher.getInstance("PBEWithHMACSHA512AndAES_256");
cipherEncrypt.init(Cipher.ENCRYPT_MODE, key);

byte[] cipherBytes = cipherEncrypt.doFinal(messageBytes);
byte[] iv = cipherEncrypt.getIV();

关于java - SecretKey.getEncoded() 如何为 PBE 生成的 key 返回明文密码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59027254/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com