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 に答える