我正在尝试将密码安全地存储在数据库中,为此我选择存储使用PBKDF2函数生成的哈希.我想使用充气城堡库来做这个,但我不知道为什么我不能通过使用JCE接口让它工作...问题是在3种不同模式下生成散列:
1.使用PBKDF2WithHmacSHA1密钥工厂由sun提供
2.直接使用充气城堡api
3.通过JCE使用充气城堡
产生2个不同的值:一个与前两个共同,一个与第三个相同.
这是我的代码:
//Mode 1
SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
KeySpec keyspec = new PBEKeySpec("password".toCharArray(), salt, 1000, 128);
Key key = factory.generateSecret(keyspec);
System.out.println(key.getClass().getName());
System.out.println(Arrays.toString(key.getEncoded()));
//Mode 2
PBEParametersGenerator generator = new PKCS5S2ParametersGenerator();
generator.init(PBEParametersGenerator.PKCS5PasswordToUTF8Bytes(("password").toCharArray()), salt, 1000);
KeyParameter params = (KeyParameter)generator.generateDerivedParameters(128);
System.out.println(Arrays.toString(params.getKey()));
//Mode 3
SecretKeyFactory factorybc = SecretKeyFactory.getInstance("PBEWITHHMACSHA1", "BC");
KeySpec keyspecbc = new PBEKeySpec("password".toCharArray(), salt, 1000, 128);
Key keybc = factorybc.generateSecret(keyspecbc);
System.out.println(keybc.getClass().getName());
System.out.println(Arrays.toString(keybc.getEncoded()));
System.out.println(keybc.getAlgorithm());
Run Code Online (Sandbox Code Playgroud)
我知道PBKDF2是使用HMAC SHA1实现的,这就是为什么我在最后一个方法中选择了作为算法的"PBEWITHHMACSHA1",我从充气城堡java docs中获取.
输出如下:
com.sun.crypto.provider.SunJCE_ae
[-53, 29, 113, -110, -25, 76, 115, -127, -64, 74, -63, 102, …Run Code Online (Sandbox Code Playgroud)