为什么我在不同的机器上使用PBKDF2得到不同的结果?

时间:2012-10-24 14:59:23

标签: java encryption passwords password-encryption pbkdf2

我正在尝试使用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方法仅依赖于我给它们的输入,还是依赖于我正在运行的机器?

如果是这样,如何在安装过程中使用此安全机制保存默认密码而不运行任何额外代码?

谢谢!

1 个答案:

答案 0 :(得分:1)

我认为问题可能在于不同的默认字符串编码。

检查您的字符串是否使用相同的编码。

您可以尝试使用

检查字节
salt.getBytes()
  • 它以默认编码返回字节,可能是机器有不同的编码。

你可以用salt.getBytes(“UTF-8”)之类的东西来替换salt.getBytes();可能会有所帮助。