2

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

如果是这样,如何使用此安全机制保存首次安装的默认密码,而无需在安装期间运行任何额外代码?

谢谢你!

4

1 回答 1

1

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

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

您可以尝试使用检查字节

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

您可以将 salt.getBytes() 替换为 salt.getBytes("UTF-8"); 可能会有所帮助。

于 2012-10-24T15:15:50.600 回答