Почему я получаю разные результаты с 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 зависят только от входных данных, которые я им даю, или они также зависят от машины, на которой я работаю?

Если да, то как я могу сохранить пароль по умолчанию для первой установки с помощью этого механизма безопасности без запуска дополнительного кода во время установки?

Спасибо!


person borod108    schedule 24.10.2012    source источник


Ответы (1)


Я думаю, что проблема может быть в разных кодировках строк по умолчанию.

Убедитесь, что ваши строки используют одинаковую кодировку.

вы можете попробовать проверить байты, используя

salt.getBytes()
  • он возвращает байты в кодировке по умолчанию, возможно, машины имеют разные кодировки.

Вы можете просто заменить salt.getBytes() чем-то вроде salt.getBytes("UTF-8"); может быть, это поможет.

person kornero    schedule 24.10.2012
comment
Какие струны? Я не понимаю. - person borod108; 24.10.2012
comment
@user1114464 String unencryptedPassword, соль строки - person kornero; 24.10.2012
comment
Соль, похоже, использует String.getBytes(). Соли должны быть случайными байтами, поэтому я не понимаю использование строки, если только она не была закодирована для хранения/передачи в строке... - person Maarten Bodewes; 24.10.2012
comment
owlstead: В начале кода видно, что я генерирую случайную строку для соли. Затем я использую getBytes, поскольку byte[] является типом аргумента для PBEKeySpec. kornero - попробую, завтра напишу результат. Спасибо. - person borod108; 25.10.2012