1

使用相同的 IV、key、iteration 和 salt 作为输入,每次生成的 PBEKeySpec 是否相同?那是:

SecretKeyFactory factory = SecretKeyFactory.getInstance("PBEWithSHA256And256BitAES-CBC-BC");
KeySpec spec = new PBEKeySpec(secureKey.toCharArray(), SALT.getBytes(), KEY_ITERATION, KEY_LENGTH);
SecretKey tmp = factory.generateSecret(spec);
SecretKey secret = new SecretKeySpec(tmp.getEncoded(), "AES");

我每次都会得到相同的 SecretKey 吗?我只是担心当用户下次启动程序时,SecretKey 对象被更改并且不能用于解密该值。

4

1 回答 1

3

是的。只要输入和算法按照您在问题中指定的方式固定,它将继续在给定相同输入的情况下生成相同的密钥。您应该能够通过在循环中运行代码并每次打印来测试这一点

System.out.println(Arrays.toString(secret.getEncoded));

此外,API 指定了除密码之外的不可变对象。对于密码 (a char[]),API 指定用户可以在 PBE 操作后覆盖该值。

请注意,原则上派生自的类SecretKeySpec可以实现可变接口。SecretKeySpec然而,扩展、可变并且 keyfactory 类或任何其他类将改变内容的可能性极小。

于 2012-08-01T01:55:07.160 回答