Хеш возвращает разные результаты для одного и того же ввода - PullRequest
0 голосов
/ 01 марта 2019

Я не могу получить MessageDigest для вывода одного и того же хэша, даже используя одну и ту же строку 3 раза подряд.Я упростил код до основ, и это поведение все еще сохраняется.

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.io.UnsupportedEncodingException;

public class foo {

    private static byte[] hashPass(String _pass) {  
        MessageDigest mDigest;
        try {
            mDigest = MessageDigest.getInstance("SHA-256");
        } catch (NoSuchAlgorithmException e) {
            System.out.println("[" + e.getMessage() + "] Unable to create message digest");
            return null;
        }

        try {
            return mDigest.digest( _pass.getBytes("UTF-8") );
        } catch (UnsupportedEncodingException e) {
            System.out.println("[" + e.getMessage() + "]");
            return null;
        }
    } //private boolean hashPass(...)

    public static void main(String[] args) {

        System.out.println("Hash1: " + hashPass("string"));
        System.out.println("Hash2: " + hashPass("string"));     
        System.out.println("Hash3: " + hashPass("string"));     
    }

}

//Outputs:
//Hash1: [B@7852e922
//Hash2: [B@4e25154f
//Hash3: [B@70dea4e

Странно то, что он выдает одинаковые выходные данные при каждом повторном запуске - это означает, что внутреннее состояние изменяется каждый раз в одном и том жепуть?Использует ли он соль или другие материалы, о которых я не знаю, и которые следует указать / использовать?

1 Ответ

0 голосов
/ 01 марта 2019
Метод

hashPass() возвращает массив byte[], а в массивах Java нет значимого представления toString().Для отображения элементов массива используйте Arrays.toString():

System.out.println(Arrays.toString(hashPass("string")));

, который выведет:

[71, 50, -121, -8, 41, -115, -70, 113, 99, -88, -105, -112, -119, 88, -9, -64, -22, -25, 51, -30, 93, 46, 2, 121, -110, -22, 46, -36, -101, -19, 47, -88]

или преобразует массив byte[] в шестнадцатеричное представление:

byte[] bytes = hashPass("string");
StringBuilder sb = new StringBuilder();
for (byte b : bytes) {
    sb.append(String.format("%02X", b));
}
System.out.println(sb);

, который напечатает:

473287F8298DBA7163A897908958F7C0EAE733E25D2E027992EA2EDC9BED2FA8
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...