Не удается получить ожидаемый результат для примеров криптографии Spring4D

В библиотеке Spring4D есть классы криптографии, однако я не могу заставить их работать должным образом. Я, вероятно, использую их неправильно, однако отсутствие каких-либо примеров затрудняет.

Например, на веб-сайте https://quickhash.com/hash-sha256-online я могу хешировать слово "тест", чтобы сгенерировать следующий хеш:

9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08

Используя библиотеку Spring4D, следующий код создает другой хеш:

CreateSHA256.ComputeHash('test').ToString;

результаты в:

9EFEA1AEAC9EDA04A892885A65FDAE0E6D9BE8C9FC96DA76D31B929262E12B1D

Помимо верхнего и нижнего регистра, это совсем другой хеш. Я знаю, что должен делать что-то не так, но опять же нет примеров использования, поэтому я застрял на том, как это сделать.

3 ответа

Решение

Алгоритмы хеширования работают с двоичными данными, обычно представленными с использованием байтовых массивов.

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

Когда я использую этот код Delphi:

LowerCase(CreateSHA256.ComputeHash(TEncoding.UTF8.GetBytes('test')).ToString)

Я получаю тот же хеш, который указан в вашем вопросе.

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

Я выбрал кодировку UTF-8 здесь, потому что это полная кодировка Unicode и имеет тенденцию быть эффективной с точки зрения пространства. Тем не менее, я не думаю, что ваш онлайн-кодировщик использует UTF-8. На самом деле я понятия не имею, какую кодировку он использует, неясно по этому вопросу. Это, конечно, та же самая старая проблема текста, отличного от двоичного.

На мой взгляд, это недостаток дизайна библиотеки Delphi, который вы используете, так как он позволяет хешировать текст без явного выбора кодировки. Если эта библиотека должна предлагать функцию, которая хэширует текст, то она должна требовать от вызывающей стороны предоставить дополнительную TEncoding параметр.

Внутреннее преобразование не происходит, поэтому он хэширует UnicodeString, который составляет не менее 2 байтов на символ.

Если вы хотите получить тот же результат, что и на странице, вы должны использовать UTF8Encode или напрямую передать как AnsiString.

Однако я попробовал несколько строк, которые содержали разные символы Юникода, и страница вернула другой результат. Так что я не совсем уверен, как они относятся к струнам там. Я предполагаю, что это вещь кодовой страницы.

Изменить: Если вы используете эту страницу http://www.xorbin.com/tools/sha256-hash-calculator он генерирует тот же хэш, что и TSHA256 с UTF8Encode.

Какой тип строки вы используете? Используете ли вы AnsiString или WideString (строка Unicode). Delphi 2009 и Newer используют WideString по умолчанию.

Почему строковый тип имеет значение? Алгоритм хэширования работает с необработанными байтовыми данными, поэтому важно, чтобы каждый символ вашей строки хранился в одном байте памяти (AnsiString) или нескольких байтах памяти (WideString).

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