Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Passwords 为什么PBE使用不同的salt和迭代次数生成相同的密钥?_Passwords_Key_Iteration_Salt - Fatal编程技术网

Passwords 为什么PBE使用不同的salt和迭代次数生成相同的密钥?

Passwords 为什么PBE使用不同的salt和迭代次数生成相同的密钥?,passwords,key,iteration,salt,Passwords,Key,Iteration,Salt,我正在尝试测试PBE加密/解密。我发现PBE使用不同的salt和迭代次数生成相同的密钥。当然,使用的密码是相同的。 据我所知,相同的密码和不同的salt/迭代应该得到不同的密钥。 下面是我的测试代码: import java.security.Key; import java.security.SecureRandom; import javax.crypto.SecretKeyFactory; import javax.crypto.spec.PBEKeySpec; public class

我正在尝试测试PBE加密/解密。我发现PBE使用不同的salt和迭代次数生成相同的密钥。当然,使用的密码是相同的。 据我所知,相同的密码和不同的salt/迭代应该得到不同的密钥。 下面是我的测试代码:

import java.security.Key;
import java.security.SecureRandom;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.PBEKeySpec;

public class PBETest
{
    public static void main(String[] args)
        throws Exception
    {
        String algo = "PBEWithSHA1andDESede";
        System.out.println("====== " + algo + " ======");

        char[] password = "password".toCharArray();
        SecureRandom rand = new SecureRandom();
        byte[] salt = new byte[32];
        rand.nextBytes(salt);
        int iterationCount = rand.nextInt(2048);

        //encryption key
        PBEKeySpec          encPBESpec = new PBEKeySpec(password, salt, iterationCount);
        SecretKeyFactory    encKeyFact = SecretKeyFactory.getInstance(algo);
        Key encKey = encKeyFact.generateSecret(encPBESpec);
        System.out.println("encryptioin iteration: " + iterationCount);

        //decryption key
        rand.nextBytes(salt);
        iterationCount = rand.nextInt(2048);
        PBEKeySpec          decPBESpec = new PBEKeySpec(password, salt, iterationCount);
        SecretKeyFactory    decKeyFact = SecretKeyFactory.getInstance(algo);
        Key decKey = decKeyFact.generateSecret(decPBESpec);
        System.out.println("decryptioin iteration: " + iterationCount);

        System.out.println("encryption key is same as decryption key? " + encKey.equals(decKey));

    }

}
我希望最终输出是一个
false

我做错了什么吗?

你非常幸运,你的随机盐分和迭代次数恰好匹配。直接去拉斯维加斯。现在

我在谷歌上搜索了pbewithsha1和desede,并找到了这个例子:在这个例子中,他单独指定了带有
newpbekeyspec(password)
的密钥,并使用salt和迭代计数创建了一个单独的
PBEParameterSpec
,然后将其传递给Cipher.init()


所以,不,你没有做错什么,你只是在盐和计数被塞进密码之前停了下来。

如果你用
pbkdf2和hmacsha1
而不是
pbewithsha1和desede
的话,你的假设就起作用了,因为它支持盐。只需将
keyLength
参数添加到
PBEKeySpec

        String algo = "PBKDF2WithHmacSHA1";

我运行了一个测试,结果是:
false


但是,请注意,要使加密和解密正常工作,您需要在生成密钥时使用相同的salt和迭代计数。

感谢tbroberg的回复。1,“盐和迭代计数恰好匹配”。salt和迭代计数是随机生成的,我不认为它们可以匹配此测试的每次运行。2,“在盐和伯爵被塞进密码之前,你停了下来。”。您的意思是salt和迭代计数仅在执行加密/解密时生效吗?我发现钥匙总是“706173776f7264”。我认为这是“密码”,它与salt或迭代计数无关。这是正确的结果吗?#2和#3似乎可以解释这种情况。我试图继续加密一些文本,加密的数据每次都不一样。所以我现在的结论是:SecretKeyFactory.generateScret()生成的密钥只与密码相关。至少从比较的角度来看是这样的,即key.getEncoded()是相同的。加密纯文本时,Salt和迭代计数生效。再次感谢你的帮助!杰出的(#1是个笑话。)如果你觉得答案有用,请标记为有用。^)我会的。然而,我的声誉太低了。我只能接受它,但不能认为它有用。很抱歉,我现在不能做这件事。我保证会回来做标记:)
        PBEKeySpec decPBESpec = new PBEKeySpec( password, salt, iterationCount, 128 );