2014-12-01 1 views
3

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

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

9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08 

Использование библиотеки Spring4D, следующий код производит различные хэш:

CreateSHA256.ComputeHash('test').ToString; 

приводит к:

9EFEA1AEAC9EDA04A892885A65FDAE0E6D9BE8C9FC96DA76D31B929262E12B1D 

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

+1

Это трагично, что эта библиотека убаюкивает вас, полагая, что вы можете хэш-текст. У вас есть бинарный файл. Предположительно два варианта кодируют текст с различными кодировками. Сделай себе одолжение и будь явным. Кодировать в байты UTF8 и хэш. –

+1

Я изменил название, так как это не тема, чтобы попросить примеры в StackOverflow. Вы * не *, но название предложило, что вы это сделали. –

ответ

9

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

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

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

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

я получаю тот же хэш, как появляется в вашем вопросе.

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

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

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

0

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

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

+1

Неверный. Unicode Delphi делает 'string' псевдоним' UnicodeString', который сильно отличается от 'WideString'. –

4

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

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

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

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

+0

Строки Delphi кодируются с UTF-16, а не UCS2 –

+1

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

+0

Просто наткнулся на это сам. В документации действительно должно быть ясно. –