2016-11-29 3 views
1

Хорошо, поэтому время от времени вы сталкиваетесь с проблемами, которые вы решили, прежде чем использовать различные фреймворки и библиотеки, а еще что-то не найти в Интернете, и ваша проблема решена относительно быстро и просто, и вы также узнаете, почему ваша проблема была проблемой в первое место.Почему так сильно хешируется MD5 и в Swift 3?

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

Моя проблема в том, что я хочу взять 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 хэш Data и напечатать его как строку?

Edit:

То, что я пытался

Это работает

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

44445164 +10617451515053691368888

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

Преобразование массива 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 

Test 1, 2 и 3 MD5: 7f0a012239d9fde5a46071640d2d8c83

PHP MD5: 06eb0c71d8839a4ac91ee42c129b8ba3

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

+0

Вы говорите, что 'myData' и' myData.md5' являются действительными, когда вы получаете данные на сервере и счетчик в инструкции печати. Основываясь только на этих данных и глядя на вашу строку кода, единственное, что выделяется, - это кодировка 'utf8', которую вы использовали для преобразования в строку. – lukya

+0

Найдено [этот вопрос SO] (http://stackoverflow.com/questions/24123518/how-to-use-cc-md5-method-in-swift-language), в котором упоминается, что функция 'CC_MD5', используемая в Crypto код не работает в Swift. Хотя это противоречит вашей точке зрения о том, что 'myData.md5' не имеет значения null. – lukya

+0

Да, это очень странно. Я пытаюсь CryptoSwift прямо сейчас, и я получаю такую ​​же ошибку. – vaid

ответ

1

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

String(data: someData, encoding: .utf8) 

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

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

вы получите:

fatal error: unexpectedly found nil while unwrapping an Optional value

Так что на это ядро, это не имеет ничего общего с хэширования или крипто.

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

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

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

0

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

Здесь вы можете найти https://github.com/krzyzanowskim/CryptoSwift, и вы можете даже установить его с помощью CocoaPods, добавив pod 'CryptoSwift' в свой подканал.

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

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

ПОЛНОЙ документы по созданию сборников можно найти здесь: https://github.com/krzyzanowskim/CryptoSwift#calculate-digest

+0

Я пытаюсь CryptoSwift прямо сейчас, я получаю ту же ошибку. – vaid

+0

Где находятся данные, из которых вы пытаетесь хеш? Если это закодированная строка, можно ли попытаться хэшировать эту строку напрямую? –

+0

Данные поступают из 'PHAssetResourceManager.requestData()', который хранится во внешней переменной. Таким образом, мое приложение извлекает данные из актива, хранит эти данные внутри 'myData', которые проживали OUTSIDE' requestData', а THEN пытается MD5 'myData'. – vaid

0

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

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

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

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

fatal error: unexpectedly found nil while unwrapping an Optional value

на линии кода поговорку

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 

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

Смежные вопросы