我正在尝试使用 PBKDF2 来存储密码。然后,我将代码与它在另一台机器上生成的密码哈希一起使用。
我正在使用这种方法来加密我的密码:
public String pwdEncodePBKDF2(String unencryptedPassword,String salt)
{
try
{
if(salt.isEmpty())
{
salt = generateSalt(SystemSecurity.SALTLENGTH);
}
String algorithm = "PBKDF2WithHmacSHA1";
int derivedKeyLength = 160;
int iterations = 1000;
KeySpec spec = new PBEKeySpec(unencryptedPassword.toCharArray(), salt.getBytes(), iterations, derivedKeyLength);
SecretKeyFactory f = SecretKeyFactory.getInstance(algorithm);
StringBuffer hexString = new StringBuffer();
byte[] mdbytes = f.generateSecret(spec).getEncoded();
for (int i=0;i<mdbytes.length;i++)
{
hexString.append(Integer.toHexString(0xFF & mdbytes[i]));
}
String hashedPassword = hexString.toString();
return hashedPassword + salt;
}
catch(Exception e)
{
e.printStackTrace();
throw new RuntimeException("Error computing hash: "+e.getMessage());
}
}
它工作正常,但是当我在另一台机器上运行它时(即将我的项目安装在另一台机器上,数据库对我最初运行的机器的默认密码进行了加密)我看到使用相同的盐和密码它给了我不同的加密。据我了解,SecretKeyFactory 方法仅取决于我给它们的输入,还是它们也取决于我正在运行的机器?
如果是这样,如何使用此安全机制保存首次安装的默认密码,而无需在安装期间运行任何额外代码?
谢谢你!