Quiero convertir una cadena como "abc" en un hash MD5. Quiero hacer esto en iOS y Swift. Intenté usar las soluciones a continuación, pero no me funcionaron:
Importación de CommonCrypto en un marco Swift
Cómo utilizar el método CC_MD5 en lenguaje rápido.
http://iosdeveloperzone.com/2014/10/03/using-commoncrypto-in-swift/
Para ser más claro, quiero lograr una salida en Swift similar a la salida de este código PHP:
$str = "Hello";
echo md5($str);
Salida: 8b1a9953c4611296a827abf8c47804d7
Respuestas:
Hay dos pasos:
1. Crear datos md5 a partir de una cadena.
2. Convertir los datos md5 en una cadena hexadecimal.
Swift 2.0:
Salida:
Swift 3.0:
Salida:
Swift 5.0:
Salida:
Notas:
#import <CommonCrypto/CommonCrypto.h>
debe agregarse a un archivo de encabezado puentePara saber cómo crear un encabezado de puente, consulte esta respuesta SO .
En general, MD5 no debe usarse para trabajos nuevos, SHA256 es una de las mejores prácticas actuales.
Ejemplo de la sección de documentación obsoleta:
MD2, MD4, MD5, SHA1, SHA224, SHA256, SHA384, SHA512 (Swift 3+)
El parámetro de nombre especifica el nombre de la función hash como una cadena
Las funciones admitidas son MD2, MD4, MD5, SHA1, SHA224, SHA256, SHA384 y SHA512 a Este ejemplo requiere Common Crypto
Es necesario tener un encabezado puente para el proyecto:
#import <CommonCrypto/CommonCrypto.h>
Agregar la seguridad .framework al proyecto.
Esta función toma un nombre hash y una cadena para ser hash y devuelve un dato:
Ejemplos:
Salida:
fuente
String(data: digestData, encoding: String.Encoding.utf8)
lanzafatal error: unexpectedly found nil while unwrapping an Optional value
digestData
es. Si se trata de datos hash, las posibilidades de que sea UTF-8 (o cualquier codificación de cadena es escasa o inexistente.)Después de leer las otras respuestas aquí (y necesitar también admitir otros tipos de hash), escribí una extensión de cadena que maneja múltiples tipos de hash y tipos de salida.
NOTA: CommonCrypto está incluido en Xcode 10, por lo que puede simplemente
import CommonCrypto
sin tener que meterse con un encabezado puente si tiene instalada la última versión de Xcode ... De lo contrario, es necesario un encabezado puente.ACTUALIZACIÓN: Ambos Swift 4 y 5 usan el mismo archivo String + Crypto.swift a continuación.
Hay un archivo Data + Crypto.swift separado para Swift 5 (ver más abajo) como la API para 'withUnsafeMutableBytes' y 'withUnsafeBytes' cambiada entre Swift 4 y 5.
String + Crypto.swift - (para Swift 4 y 5)
SWIFT 5 - Datos + Crypto.swift
SWIFT 4 - Datos + Crypto.swift
Editar: dado que el hash realmente ocurre en los datos, divido el algoritmo de hash en una extensión de datos. Esto permite que el mismo algoritmo se utilice también para operaciones hash de fijación de certificados SSL.
Aquí hay un breve ejemplo de cómo puede usarlo para una operación de fijación de SSL:
de vuelta a la respuesta original
Probé los algoritmos hash usando esto:
y estos son los resultados impresos:
fuente
A partir de iOS 13, Apple ha agregado el
CryptoKit
marco, por lo que ya no necesita importar CommonCrypto o manejar su API C:fuente
SWIFT 3
versión demd5 function
:Enlace original de http://iosdeveloperzone.com
fuente
Swift 4. *, actualización de Xcode 10:
En Xcode 10 ya no tiene que usar Bridging-Header , puede importar directamente usando
Y luego escribe un método como:
Uso:
Salida:
fuente
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]) } }
Lancé una implementación Swift pura que no depende de CommonCrypto ni de nada más. Está disponible bajo licencia MIT.
El código consta de un único archivo rápido que puede colocar en su proyecto. Si lo prefiere, también puede usar el proyecto Xcode contenido con objetivos de prueba unitaria y marco.
Es simple de usar:
huellas dactilares:
md5: 9e107d9d372bb6826bd81d3542a419d6
El archivo rápido contiene documentación y más ejemplos.
fuente
Usar Crypto es demasiado para lograr esto.
¡La respuesta aceptada es perfecta! Sin embargo, solo quería compartir un enfoque de código Swift ier utilizando Swift 2.2 .
Tenga en cuenta que aún tiene que hacerlo
#import <CommonCrypto/CommonCrypto.h>
en su archivo de encabezado puentefuente
Respuesta de Swift 5 como una extensión de cadena (basada en la gran respuesta de Invictus Cody ):
Uso:
fuente
Aquí hay una extensión basada en la respuesta de zaph
Totalmente compatible con swift 3.0, todavía tiene que hacerlo
#import <CommonCrypto/CommonCrypto.h>
en su archivo Bridging-Headerfuente
En la programación rápida, es mejor hacer una función de cadena, por lo que el uso será fácil. Aquí estoy haciendo una extensión String usando una de las soluciones dadas anteriormente. Gracias @wajih
Uso
fuente
Usé Carthage y Cyrpto para hacer esto.
Instale Carthage si aún no lo ha hecho
Instale Crypto en su proyecto
ejecutar 'actualización de transporte'
Si está ejecutando desde la línea de comandos, agregue el marco en el archivo rápido
Agregue Importar Crypto a su archivo rápido.
entonces simplemente funciona!
fuente
MD5 es un algoritmo de hash, no es necesario usar la enorme biblioteca CommonCrypto para esto (y ser rechazado por la revisión de Apple), solo use cualquier biblioteca de hash md5.
Una de esas bibliotecas que uso es SwiftHash , una implementación pura y rápida de MD5 (basada en http://pajhome.org.uk/crypt/md5/md5.html )
fuente
Según la solución de Cody , tengo la idea de que deberíamos aclarar cuál es el resultado de MD5, porque podemos usar el resultado como una cadena hexadecimal o una cadena Base64.
La función anterior en realidad devuelve a
[UInt8]
, y en base a este resultado, podemos obtener cualquier forma de cadena, como hex, base64.Si se desea una cadena hexadecimal como resultado final (como pide la pregunta), podemos seguir usando el resto de la solución de Cody
Si se desea una cadena Base64 como resultado final
fuente
Una respuesta para Swift 5 con una gestión de memoria adecuada y sin
String
clase dentro del método:ejemplo
Resultados:
fuente
Encontré esta biblioteca que parece funcionar bastante bien.
https://github.com/onmyway133/SwiftHash
fuente
mis dos centavos (si necesita rápidamente md5 para Data / NSData, por ejemplo, descargó o leyó binario para disco o netwkork)
(descarado de "Swift 5 responde como una extensión de String (basado en la gran respuesta de Invictus Cody")):
prueba:
fuente