Есть ли способ преобразовать хеш-строку SHA256 в строку Java?

У меня есть следующий код, и мне нужна строка Java из хеш-строки SHA256. Есть ли способ преобразовать шестнадцатеричную строку в исходное значение?

public class CryptoHash {
    public static void main( String[] args ) throws NoSuchAlgorithmException {
        MessageDigest md = MessageDigest.getInstance( "SHA-256" );
        String text = "Text to hash, cryptographically.";

        // Change this to UTF-16 if needed
        md.update( text.getBytes( StandardCharsets.UTF_8 ) );
        byte[] digest = md.digest();

        String hex = String.format( "%064x", new BigInteger( 1, digest ) );
        System.out.println( hex );
    }
}

person Dhananjay Jatagond    schedule 29.08.2018    source источник
comment
Разве хэш не означает, что его невозможно преобразовать обратно в исходную строку?   -  person ernest_k    schedule 29.08.2018
comment
Не могли бы вы уточнить, хотите ли вы вернуть исходную строку из хеша или []byte (дайджест) из выведенной шестнадцатеричной строки?   -  person Leon    schedule 29.08.2018
comment
я хочу преобразовать выведенную шестнадцатеричную строку в ASCII   -  person Dhananjay Jatagond    schedule 29.08.2018
comment
как вы хотите преобразовать, например, 0xFF в ASCII < / а>?   -  person pskink    schedule 29.08.2018
comment
например из f56c3a71b29e28ce7bc8f2f3f1ede0f89a40b25a8857b2bc25023a40a7391fb8 в ASCII   -  person Dhananjay Jatagond    schedule 29.08.2018
comment
Похоже, вы пытаетесь вернуть хешированную строку SHA-256 в исходную форму. Это невозможно, поскольку хеш-функция SHA-256 является так называемым односторонним хешированием. Вы можете только превратить строку в хешированную строку, вы не можете превратить хешированную строку обратно в обычную читаемую строку.   -  person Sander van't Veer    schedule 29.08.2018
comment
У меня есть код для преобразования шестнадцатеричного кода в ASCII, но я не получаю ожидаемого результата. код, возвращающий значение ASCII как õl: q² (Î {òóñíàø @ ²ZW²¼%: @ §9¸   -  person Dhananjay Jatagond    schedule 29.08.2018
comment
хорошо, как вы хотите преобразовать первый 0xf5 в ascii? или вы имеете ввиду Extended ASCII?   -  person pskink    schedule 29.08.2018
comment
hash сам по себе разработан именно, чтобы из него невозможно было получить исходное значение.   -  person Vladyslav Matviienko    schedule 29.08.2018
comment
@VladyslavMatviienko я почти уверен (возможно, я ошибаюсь), что OP знает о том, что если исходные данные имеют, например, 10 МБ, а хэш-код имеет 32 байта, невозможно получить эти 10 МБ из 32 байтов ... он вероятно, хочет преобразовать эту шестнадцатеричную строку в 32 двоичных байта - например: 566c6164 - это Vlad в ASCII   -  person pskink    schedule 29.08.2018
comment
@pskink, я только что отредактировал свой вопрос .. есть ли решение?   -  person Dhananjay Jatagond    schedule 29.08.2018
comment
@Greggz, моя проблема несколько иная.   -  person Dhananjay Jatagond    schedule 29.08.2018
comment
В этом случае заголовок либо неправильный, либо двусмысленный.   -  person ProgFroz    schedule 29.08.2018
comment
@ProgFroz я подумал, что у меня есть код для хеш-пароля с солью. после этого мне нужно преобразовать его в шестнадцатеричный формат в ASCII   -  person Dhananjay Jatagond    schedule 29.08.2018
comment
@pskink похоже, что ты прав   -  person Vladyslav Matviienko    schedule 29.08.2018
comment
Боюсь, что мой ответ все тот же. Когда вы конвертируете хэш в шестнадцатеричный, а затем в ASCII, вы обнаружите, что просто получили обратно свой хэш.   -  person ProgFroz    schedule 29.08.2018
comment
возможно, java2s.com/Code/Java-Out-Input /?   -  person pskink    schedule 29.08.2018
comment
@pskink, спасибо .. но мой ожидаемый результат несколько отличается ..   -  person Dhananjay Jatagond    schedule 29.08.2018
comment
разные? это означает, что?   -  person pskink    schedule 29.08.2018
comment
@pskink Я пробовал этот метод, но получаю неожиданный результат для шестнадцатеричного хэша   -  person Dhananjay Jatagond    schedule 29.08.2018
comment
Ваш вопрос все еще неясен. Может быть, вы хотите преобразовать массив байтов в base64 (как, похоже, делает ваш код base64)? В этом случае посмотрите: stackoverflow.com/questions/2418485/   -  person Mark Rotteveel    schedule 29.08.2018


Ответы (1)


Простой ответ: нет, нет.

Более длинный ответ: может быть способ использовать стратегию грубой силы. Но это займет много времени, слишком долго, чтобы быть эффективным.

Видите ли, хеш в целом создан для того, чтобы его невозможно было отменить. Вы конвертируете String в некоторый хэш, и это не может быть отменено. Вы можете посмотреть, как работают хэши и шифрование.

https://www.cryptocompare.com/coins/guides/how-does-a-hashing-algorithm-work/

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

Изменить: если вы хотите преобразовать String в Hash, затем в Hex и, наконец, в ASCII, вашим результатом будет исходный Hash. Следовательно, идея не получится. Расшифровать таким образом нельзя.

person ProgFroz    schedule 29.08.2018