Почему MD5 хэшируется так сильно и в Swift 3?

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

Однако иногда вы сталкиваетесь с проблемами, которые имеют абсолютный 0 смысл, и даже хуже, когда решения имеют отрицательный смысл.

Моя проблема в том, что я хочу взять Data и сделать из него хеш MD5.

Я нахожу все виды решений, но ни одно из них не работает.

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

Я пытаюсь использовать Crypto а также CommonCrypto рамки по Soffes и они кажутся довольно простыми, верно? Правильно?

Да!

Но почему я все еще получаю ошибку fatal error: unexpectedly found nil while unwrapping an Optional value?

Из того, что я понимаю, данные обслуживаются myData.md5 в продолжении Crypto от Soffes кажется "необязательным". Но почему?

Код, который я пытаюсь выполнить:

print(" md5 result: " + String(data: myData.md5, encoding: .utf8)!)

где myData в нем 100% данных, потому что после вышеприведенной строки кода я отправляю эти данные на сервер, и данные существуют.

Кроме того, печать отсчета myData.md5.count от print(String(myData.md5.count)) работает отлично.

Итак, мой вопрос в основном: как мне MD5 хешировать данные и печатать их в виде строки?

Редактировать:

Что я пробовал

Это работает

MD5: ввод строки test в сценарии PHP дает мне 098f6bcd4621d373cade4e832627b4f6и код Swift "test".md5() также дает мне 098f6bcd4621d373cade4e832627b4f6

Это не работает

Преобразование UInt8 байтовый массив из Data.md5() в строку, которая представляет правильное значение MD5.

Различные тесты, которые я сделал, следующие:

var hash = ""
for byte in myData.data.md5() {
    hash +=  String(format: "%02x", byte)
}
print("loop = " + hash) //test 1

print("myData.md5().toHexString() = " +  myData.md5().toHexString()) //test 2

print("CryptoSwift.Digest.md5([UInt8](myData)) = " + CryptoSwift.Digest.md5([UInt8](myData)).toHexString()) //test 3

Все три теста с 500-байтовыми тестовыми данными дают мне значение MD5 56f6955d148ad6b6abbc9088b4ae334dв то время как мой скрипт PHP дает мне 6081d190b3ec6de47a74d34f6316ac6b

Тестовый образец (64 байта): необработанные данные:

FFD8FFE0 00104A46 49460001 01010048 00480000 FFE13572 45786966 00004D4D
002A0000 0008000B 01060003 00000001 00020000 010F0002 00000012 00000092

Тест 1, 2 и 3 MD5: 7f0a012239d9fde5a46071640d2d8c83

PHP MD5: 06eb0c71d8839a4ac91ee42c129b8ba3

PHP-код: echo md5($_FILES["file"]["tmp_name"])

3 ответа

Решение

Простой ответ на ваш вопрос:

String(data: someData, encoding: .utf8)

возвращается nil если someData не правильно закодированные данные UTF8. Если вы попытаетесь развернуть nil как это:

String(data: someDate, encoding: .utf8)!

ты получаешь:

фатальная ошибка: неожиданно найден ноль при развертывании необязательного значения

По сути, это не имеет ничего общего с хешированием или криптозащитой.

И вход, и выход MD5 (или любой хэш-алгоритм в этом отношении) являются двоичными данными (а не текстом или строками). Таким образом, вывод MD5 не является данными в кодировке UTF8. Таким образом, почему вышеупомянутый инициализатор String всегда терпел неудачу.

Если вы хотите отобразить двоичные данные в вашей консоли, вам нужно преобразовать их в удобочитаемое представление. Наиболее распространенными являются шестнадцатеричные цифры или кодировка Base 64.

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

Благодаря Джейкобу Кингу я попробовал гораздо более простую инфраструктуру MD5 под названием CryptoSwift.

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

Первоначальный вопрос, однако, заключался не в том, какую платформу использовать, или в предложениях, почему мое приложение и мой PHP-скрипт возвращают разные значения MD5.

Первоначально вопрос был о том, почему я получаю ошибку

фатальная ошибка: неожиданно найден ноль при развертывании необязательного значения

в строке кода, говоря

print(" md5 result: " + String(data: myData.md5, encoding: .utf8)!)

Так что ответ на этот вопрос заключается в том, что я не должен пытаться преобразовать 16-байтовые выходные данные MD5() функция, но вместо этого вызвать подфункцию MD5() называется toHexString(),

Поэтому правильная строка кода должна выглядеть следующим образом:

print("md5 result: " + myData.md5().toHexString())

БОНУС

Мой PHP-скрипт теперь содержит следующий код:

move_uploaded_file($_FILES["file"]["tmp_name"], $target_dir); //save data to disk
$md5_of_data = md5_file ($target_dir); //get MD5 of saved data

БОНУС-БОНУС Проблема и решение - это часть небольшого фреймворка под названием AssetManager, над которым я работаю, который можно найти здесь: https://github.com/aidv/AssetManager

Я использую библиотеку "CryptoSwift" для создания хэшей, а также для шифрования данных перед отправкой / сохранением данных. Это очень просто в использовании.

Его можно найти здесь https://github.com/krzyzanowskim/CryptoSwift и вы даже можете установить его с CocoaPods, добавив pod 'CryptoSwift' на ваш подфайл.

После установки хэширование Data Объект так же просто, как вызов Data.md5()! Это действительно так просто. Он также поддерживает другие алгоритмы хеширования, такие как SHA,

Вы можете просто распечатать MD5 объект и CryptoSwift преобразует его в строку для вас.

Полные документы по созданию дайджестов можно найти здесь: https://github.com/krzyzanowskim/CryptoSwift.

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