Я хочу преобразовать строку типа «abc» в хеш MD5. Я хочу сделать это в iOS и Swift. Я пробовал использовать приведенные ниже решения, но они не помогли мне:
Импорт CommonCrypto в Swift framework
Как использовать метод CC_MD5 на быстром языке.
http://iosdeveloperzone.com/2014/10/03/using-commoncrypto-in-swift/
Чтобы быть более ясным, я хочу добиться вывода в Swift, аналогичного выводу этого кода PHP:
$str = "Hello";
echo md5($str);
Выход: 8b1a9953c4611296a827abf8c47804d7
Ответы:
Есть два шага:
1. Создать данные md5 из строки
2. Преобразовать данные md5 в шестнадцатеричную строку.
Swift 2.0:
Вывод:
Swift 3.0:
Вывод:
Swift 5.0:
Вывод:
Примечания:
#import <CommonCrypto/CommonCrypto.h>
необходимо добавить в файл Bridging-HeaderО том, как создать Bridging-Header, см. Этот ответ SO .
В общем, MD5 не следует использовать для новой работы, SHA256 - это лучшая практика.
Пример из раздела устаревшей документации:
MD2, MD4, MD5, SHA1, SHA224, SHA256, SHA384, SHA512 (Swift 3+)
Параметр name указывает имя хэш-функции в виде строки.
Поддерживаемые функции: MD2, MD4, MD5, SHA1, SHA224, SHA256, SHA384 и SHA512 a В этом примере требуется Common Crypto.
Необходимо иметь заголовок моста для проекта:
#import <CommonCrypto/CommonCrypto.h>
Добавить безопасность. .framework к проекту.
Эта функция принимает хеш-имя и строку для хеширования и возвращает данные:
Примеры:
Вывод:
источник
String(data: digestData, encoding: String.Encoding.utf8)
throwsfatal error: unexpectedly found nil while unwrapping an Optional value
digestData
. Если это хеш-данные, скорее всего, это UTF-8 (или любая строковая кодировка от тонкой до несуществующей.После прочтения других ответов здесь (и необходимости поддержки других типов хешей) я написал расширение String, которое обрабатывает несколько типов хешей и типов вывода.
ПРИМЕЧАНИЕ: CommonCrypto включен в Xcode 10, поэтому вы можете просто
import CommonCrypto
не возиться с заголовком моста, если у вас установлена последняя версия Xcode ... В противном случае необходим заголовок моста.ОБНОВЛЕНИЕ: оба Swift 4 и 5 используют один и тот же файл String + Crypto.swift, указанный ниже.
Существует отдельный файл Data + Crypto.swift для Swift 5 (см. Ниже), так как api для withUnsafeMutableBytes и withUnsafeBytes изменен между Swift 4 и 5.
String + Crypto.swift - (для Swift 4 и 5)
SWIFT 5 - Данные + Crypto.swift
SWIFT 4 - Данные + Crypto.swift
Изменить: поскольку хеширование фактически происходит с данными, я разделил алгоритм хеширования на расширение данных. Это позволяет использовать тот же алгоритм для хеш-операций закрепления SSL-сертификатов.
Вот краткий пример того, как вы можете использовать его для операции SSL-закрепления:
вернуться к исходному ответу
Я тестировал алгоритмы хеширования, используя это:
и это напечатанные результаты:
источник
Начиная с iOS 13, Apple добавила
CryptoKit
фреймворк, поэтому вам больше не нужно импортировать CommonCrypto или иметь дело с его C API:источник
SWIFT 3
версияmd5 function
:Исходная ссылка с http://iosdeveloperzone.com
источник
Swift 4. *, обновление Xcode 10:
В Xcode 10 вам не нужно использовать Bridging-Header Anymore, вы можете напрямую импортировать, используя
А затем напишите метод примерно так:
Использование :
Вывод:
источник
func MD5(_ string: String) -> String? { let length = Int(CC_MD5_DIGEST_LENGTH) var digest = [UInt8](repeating: 0, count: length) if let d = string.data(using: .utf8) { _ = d.withUnsafeBytes { body -> String in CC_MD5(body.baseAddress, CC_LONG(d.count), &digest) return "" } } return (0..<length).reduce("") { $0 + String(format: "%02x", digest[$1]) } }
Я выпустил чистую реализацию Swift , которая не зависит от CommonCrypto или чего-либо еще. Он доступен по лицензии MIT.
Код состоит из одного быстрого файла, который вы можете просто добавить в свой проект. Если вы предпочитаете, вы также можете использовать содержащийся проект Xcode с целями фреймворка и модульного тестирования.
Использовать просто:
печатает:
md5: 9e107d9d372bb6826bd81d3542a419d6
Файл swift содержит документацию и другие примеры.
источник
Использование Crypto - слишком много накладных расходов для достижения этой цели.
Общепринятый ответ прекрасен! Тем не менее, я просто хотел поделиться подходом кода Swift ier с использованием Swift 2.2 .
Имейте в виду, что вам все еще нужно
#import <CommonCrypto/CommonCrypto.h>
в файле заголовка мостаисточник
Swift 5 ответ как расширение String (на основе отличного ответа Invictus Cody ):
Использование:
источник
Вот расширение, основанное на ответе zaph
Полностью совместим с swift 3.0. Вам все еще нужно
#import <CommonCrypto/CommonCrypto.h>
в файле Bridging-Headerисточник
В быстром программировании лучше сделать строковую функцию, чтобы ее было легко использовать. Здесь я делаю расширение String, используя одно из приведенных выше решений. Спасибо @wajih
использование
источник
Для этого я использовал Карфаген и Кирпто.
Установите Carthage, если вы еще этого не сделали
Установите Crypto в свой проект
выполнить 'обновление перевозки'
Если вы запускаете из командной строки, добавьте фреймворк в быстрый файл
Добавьте импорт Crypto в свой быстрый файл.
тогда это просто работает!
источник
MD5 - это алгоритм хеширования, нет необходимости использовать для этого громоздкую библиотеку CommonCrypto (и получить отказ от обзора Apple), просто используйте любую библиотеку хеширования md5.
Одна из таких библиотек, которые я использую, - SwiftHash , чистая быстрая реализация MD5 (на основе http://pajhome.org.uk/crypt/md5/md5.html )
источник
Основываясь на решении Коди , у меня есть идея, что мы должны уточнить, каков результат MD5, потому что мы можем использовать результат как шестнадцатеричную строку или строку Base64.
Приведенная выше функция фактически возвращает a
[UInt8]
, и на основе этого результата мы можем получить любую форму строки, например, hex, base64.Если в качестве окончательного результата требуется шестнадцатеричная строка (как задается вопросом), мы можем продолжать использовать остальную часть решения Коди
Если в качестве окончательного результата требуется строка Base64
источник
Ответ для Swift 5 с правильным управлением памятью и без
String
класса внутри метода:пример
Полученные результаты:
источник
Я нашел эту библиотеку, которая, кажется, работает очень хорошо.
https://github.com/onmyway133/SwiftHash
источник
мои два цента (если вам нужно быстро md5 для Data / NSData, например, вы загрузили или прочитали двоичный файл для диска или netwkork)
(бесстыдно из «Swift 5 ответ как расширение String (на основе великого ответа Invictus Cody»)):
тест:
источник