Java有一个方便的类PBEKeySpec,它允许您使用迭代计数、密钥长度和salt值从密码中生成一个密钥,用于解密目的。参见下面的示例。
private static Key getPasswordBasedKey(String cipher, int keySize, char[] password) throws NoSuchAlgorithmException, InvalidKeySpecException {
byte[] salt = new byte[100];
SecureRandom random = new SecureRandom();
random.nextBytes(salt);
PBEKeySpec pbeKeySpec = new PBEKeySpec(password, salt, 1000, keySize);
SecretKey pbeKey = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256").generateSecret(pbeKeySpec);
return new SecretKeySpec(pbeKey.getEncoded(), cipher);
}但是,如果salt不是特定加密案例的一部分,该怎么办?然后,为了得到正确的输出,我也必须解密没有盐。但在本例中,PBEKeySpec(char[] password, byte[] salt, int iterationCount, int keyLength)的构造函数将抛出一个异常(如果salt为null,则为NullPointerException;如果为空数组,则为IllegalArgumentException )。因此,我的问题是:在Java中是否有任何方法可以从密码中生成密钥,同时考虑到iterationCount和keyLength,但跳过了盐类?
为什么我需要它:
发布于 2022-10-11 10:04:15
要使用PBEKeySpec类获得相同的密钥,您需要相同的密码、salt和迭代计数(以及密钥大小)。您不能跳过salt部分,并期望获得相同的基于密码的密钥,因为只有这些提供的数据才能生成密钥,这是2^(salt-length)可能的方法。
对于基于密码的密钥生成,salt不需要是私有的。请参阅答案基于密码的Java 256位AES加密中的引文
共享
password(achar[])和salt(由SecureRandom选择的byte[]-8字节)与接收者共享不需要保密的。
答案还解释了迭代和键大小是固定的或已知的。
也可以检查RFC2898 PKCS #5:基于密码的密码规范2.0版-第5页
在PKCS #5 v1.5中,Salt和迭代计数构成了基于密码的加密的基础,并且在这里也适用于各种密码操作。因此,这里定义的基于密码的密钥派生是密码、salt和迭代计数的函数,其中后两个量不需要保密。
强调“.,,其中后两个量不需要保密”(即salt和迭代)。
回答你的问题:
考虑到iterationCount和keyLength但跳过盐分,是否有任何方法从密码中生成(相同的)1-1密钥?
(由我增补)
答案是:不。
https://stackoverflow.com/questions/74016495
复制相似问题