JAVA декодировать SHA1PRNG генерируется байт в гекса

В настоящее время я пытаюсь реализовать генератор хеша паролей. Но сначала я пытаюсь закодировать случайно сгенерированную соль следующим образом:

public static byte[] generateSalt()
        throws NoSuchAlgorithmException {
    SecureRandom random = SecureRandom.getInstance("SHA1PRNG");
    byte[] salt = new byte[8];
    random.nextBytes(salt);
    return salt;
}

Как я могу закодировать это в гекса, а затем декодировать его в исходное состояние? Я просто хочу показать значение hexa сгенерированной соли пользователю, чтобы он мог затем декодировать его в части аутентификации. Конечно, это для склонности.

Что у меня сейчас есть

Я попробовал это:

    try {
        byte[] new_salt;
        String salt_str;
        new_salt = PasswordHash.generateSalt();
        for(int i = 0; i < 8; i++) {
            salt_str += new_salt[i];
        }
        out_new_salt.setText(salt_str);
    }
    catch (Exception e) {
        System.out.print(e.getStackTrace() + "Something failed");
    }

Вывод выглядит так: 67-55-352712114-12035 Итак, я могу получить содержимое каждого байта. Я пытался использовать кодировщик Base 64, но он печатает неизвестный символ, я думаю, это потому, что содержимое байтового массива имеет диапазон значений 2exp8. Я пытался с помощью:

System.out.println(new String(new_salt));

но он также печатает неизвестные значения. Использование Charset.forName("ISO-8859-1") и Charset.forName("UTF-8"), но это не работает. UTF-8 печатает неизвестные символы, а ISO-8859-1 работает странно, но не печатает столько чисел, сколько размер байтового массива ( 8). Я думаю, что hexa - это то, что лучше всего подходит для того, что я хочу делать.

1 ответ

Решение

Я наконец-то нашел то, что искал. Это простая функция, которую я нашел здесь:

Как преобразовать байтовый массив в шестнадцатеричную строку в Java? Это прекрасно работает в моем случае.

Это функция:

private final static char[] hexArray = "0123456789ABCDEF".toCharArray();

public static String bytesToHex(byte[] bytes) {
    char[] hexChars = new char[bytes.length * 2];
    for (int j = 0; j < bytes.length; j++) {
        int v = bytes[j] & 0xFF;
        hexChars[j * 2] = hexArray[v >>> 4];
        hexChars[j * 2 + 1] = hexArray[v & 0x0F];
    }
    return new String(hexChars);
}

Это выглядит так: введите описание изображения здесь

Другие вопросы по тегам