Функция SHA512 возвращает один и тот же результат для разных входов - PullRequest
0 голосов
/ 15 апреля 2019

Я пытаюсь реализовать экран входа в систему, где все ваши входы зашифровываются с помощью SHA 512 и некоторые незначительные изменения в функции позже (изменение строки, увеличение длины).Для моего имени пользователя шифрование работает хорошо, но мои пароли, с другой стороны, дают один и тот же результат, независимо от того, что я печатаю.

 public static String password_encrypt(String input) {
    try {
        String password_ = input;

        int iterations = 250000;
        String salt = "salt";

        SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA512");
        char[] passwordChars = password_.toCharArray();
        KeySpec spec = new PBEKeySpec(passwordChars, salt.getBytes(), iterations, 256);
        SecretKey key = factory.generateSecret(spec);

        byte[] passwordHash = key.getEncoded();

        SecretKey secret = new SecretKeySpec(key.getEncoded(), "AES");

        input = secret.toString();
    } catch (NoSuchAlgorithmException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (InvalidKeySpecException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    return input;
}

И затем я проверяю в массиве, есть ли место, где яможет поместить информацию, и я, если есть один его получение хранится там.

 for (int i = 0; i < username.length; i++) {
        System.out.println("username " + username[i]);
        if (name.equals(username[i])) {
            System.out.println("Dieser Username ist bereits vergeben!");
            break;
        }
        if ("empty".equals(username[i]) || null == username[i]) {
            username[i] = name;
            stelle = i;
            System.out.println("Username wurde vergeben");
            break;
        } 
        else if (name.equals(username[i])) {
            System.out.println("1234");
        }
    }
    for (int j = 0; j < password.length; j++) {
        System.out.println("Passwort " + password[j]);
        if ("empty".equals(password[j]) || null == password[j]) {
            System.out.println("Passwort wurde vergeben");
            password[j] = input_;
            stelle_pw = j;
            break;
        } 
        else if (input.equals(password[j])) {
            System.out.println("123");
        }
    }

Мое имя пользователя [] и пароль [] были заполнены пустым или нулевым моим конструктором.

Моя главная проблема: независимо от того, какой ввод пароля, я получаю один и тот же ключ: javax.crypto.spec.SecretKeySpec@fffea4cc

Это дает мне большую утечку безопасностиесли я просто сравниваю строки, чтобы решить, является ли это правильным ...

Little Disclamer: некоторые функции или переменные сделаны с _, потому что я дислексик.Пожалуйста, не убивайте меня за то, что вы не используете соглашение об именах.T

1 Ответ

0 голосов
/ 18 апреля 2019

В предоставленном коде есть несколько ошибок, в первую очередь он использует слабую статическую соль. Хотя существуют более надежные алгоритмы для защиты пароля, чем PBKDF2 (➽ Argon2, BCrypt, SCrypt), его можно использовать , если оно реализовано правильно. Там я хотел бы порекомендовать хорошо известную библиотеку Defuse , которая упрощает хеширование и проверку пароля, она может быть включена в один файл класса.

Кстати, хешированный пароль нельзя отменить, хеширование не совпадает с шифрованием.

...