我已经尝试使用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方法仅取决于我给出的输入,或者它们也取决于我正在运行的机器?
如果是这样,如何在安装过程中不运行任何额外代码的情况下保存默认密码作为首次安装?
谢谢!
我认为问题可能是在不同的默认字符串编码中。
检查字符串是否使用相同的编码。
您可以尝试使用
检查字节salt.getBytes()
- 它在默认编码中返回字节,可能是机器的编码不同。
您可以用salt.getbytes(" utf-8")替换salt.getbytes();可能会有所帮助。