Je veux convertir une chaîne comme "abc" en un hachage MD5. Je veux faire cela dans iOS et Swift. J'ai essayé d'utiliser les solutions ci-dessous mais elles ne fonctionnaient pas pour moi:
Importer CommonCrypto dans un framework Swift
Comment utiliser la méthode CC_MD5 dans un langage rapide.
http://iosdeveloperzone.com/2014/10/03/using-commoncrypto-in-swift/
Pour être plus clair, je souhaite obtenir une sortie dans Swift similaire à la sortie de ce code PHP:
$str = "Hello";
echo md5($str);
Sortie: 8b1a9953c4611296a827abf8c47804d7
Réponses:
Il y a deux étapes:
1. Créez des données md5 à partir d'une chaîne
2. Convertissez les données md5 en une chaîne hexadécimale
Swift 2.0:
Production:
Swift 3.0:
Production:
Swift 5.0:
Production:
Remarques:
#import <CommonCrypto/CommonCrypto.h>
doit être ajouté à un fichier d'en-tête de pontPour savoir comment créer un en-tête de pont, consultez cette réponse SO .
En général, MD5 ne doit pas être utilisé pour de nouveaux travaux, SHA256 est une bonne pratique actuelle.
Exemple de la section de documentation obsolète:
MD2, MD4, MD5, SHA1, SHA224, SHA256, SHA384, SHA512 (Swift 3+)
Le paramètre name spécifie le nom de la fonction de hachage en tant que chaîne
Les fonctions prises en charge sont MD2, MD4, MD5, SHA1, SHA224, SHA256, SHA384 et SHA512 a Cet exemple nécessite Common Crypto
Il est nécessaire d'avoir un en-tête de pontage pour le projet:
#import <CommonCrypto/CommonCrypto.h>
Ajouter la sécurité .framework au projet.
Cette fonction prend un nom de hachage et une chaîne à hacher et renvoie une donnée:
Exemples:
Production:
la source
String(data: digestData, encoding: String.Encoding.utf8)
lancersfatal error: unexpectedly found nil while unwrapping an Optional value
digestData
c'est. S'il s'agit de données de hachage, il y a des chances que ce soit UTF-8 (ou tout encodage de chaîne est mince à inexistant.Après avoir lu les autres réponses ici (et avoir également besoin de prendre en charge d'autres types de hachage), j'ai écrit une extension String qui gère plusieurs types de hachage et types de sortie.
REMARQUE: CommonCrypto est inclus dans Xcode 10, vous pouvez donc simplement
import CommonCrypto
sans avoir à jouer avec un en-tête de pontage si vous avez la dernière version de Xcode installée ... Sinon, un en-tête de pontage est nécessaire.MISE À JOUR: Les Swift 4 et 5 utilisent le même fichier String + Crypto.swift ci-dessous.
Il existe un fichier Data + Crypto.swift séparé pour Swift 5 (voir ci-dessous) comme l'API pour 'withUnsafeMutableBytes' et 'withUnsafeBytes' changé entre Swift 4 et 5.
String + Crypto.swift - (pour Swift 4 et 5)
SWIFT 5 - Données + Crypto.swift
SWIFT 4 - Données + Crypto.swift
Edit: puisque le hachage se produit réellement sur les données, j'ai divisé l'algorithme de hachage en une extension de données. Cela permet également d'utiliser le même algorithme pour les opérations de hachage d'épinglage de certificats SSL.
Voici un court exemple de la façon dont vous pourriez l'utiliser pour une opération d'épinglage SSL:
retour à la réponse originale
J'ai testé les algorithmes de hachage en utilisant ceci:
et voici les résultats imprimés:
la source
Depuis iOS 13, Apple a ajouté le
CryptoKit
framework afin que vous n'ayez plus besoin d'importer CommonCrypto ou de gérer son API C:la source
SWIFT 3
version demd5 function
:Lien original de http://iosdeveloperzone.com
la source
Swift 4. *, mise à jour Xcode 10:
Dans Xcode 10, vous n'avez plus besoin d'utiliser Bridging-Header , vous pouvez importer directement en utilisant
Et puis écrivez une méthode quelque chose comme:
Utilisation:
Production:
la source
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]) } }
J'ai publié une implémentation Swift pure qui ne dépend pas de CommonCrypto ou de quoi que ce soit d'autre. Il est disponible sous licence MIT.
Le code se compose d'un seul fichier Swift que vous pouvez simplement déposer dans votre projet. Si vous préférez, vous pouvez également utiliser le projet Xcode contenu avec des cibles de framework et de test unitaire.
C'est simple à utiliser:
imprime:
md5: 9e107d9d372bb6826bd81d3542a419d6
Le fichier swift contient de la documentation et d'autres exemples.
la source
L'utilisation de Crypto est trop lourde pour y parvenir.
La réponse acceptée est parfaite! Néanmoins, je voulais juste partager une approche de code Swift ier utilisant Swift 2.2 .
Veuillez garder à l'esprit que vous devez toujours le faire
#import <CommonCrypto/CommonCrypto.h>
dans votre fichier d'en -tête de pontla source
Réponse Swift 5 en tant qu'extension String (basée sur la grande réponse d'Invictus Cody ):
Usage:
la source
Voici une extension basée sur la réponse zaph
Entièrement compatible avec swift 3.0, vous devez toujours le faire
#import <CommonCrypto/CommonCrypto.h>
dans votre fichier Bridging-Headerla source
Dans la programmation rapide, il est préférable de créer une fonction de chaîne, donc l'utilisation sera facile. Ici, je crée une extension String en utilisant l'une des solutions ci-dessus. Merci @wajih
Usage
la source
J'ai utilisé Carthage et Cyrpto pour faire cela.
Installez Carthage si vous ne l'avez pas déjà fait
Installez Crypto dans votre projet
exécuter la 'mise à jour du cartage'
Si vous exécutez à partir de la ligne de commande, ajoutez le framework dans le fichier swift
Ajoutez import Crypto à votre fichier swift.
alors ça marche!
la source
MD5 est un algorithme de hachage, pas besoin d'utiliser la volumineuse bibliothèque CommonCrypto pour cela (et être rejeté par la revue Apple), utilisez simplement n'importe quelle bibliothèque de hachage md5.
Une de ces bibliothèques que j'utilise est SwiftHash , une implémentation pure et rapide de MD5 (basée sur http://pajhome.org.uk/crypt/md5/md5.html )
la source
Sur la base de la solution de Cody , j'ai une idée selon laquelle nous devrions clarifier le résultat de MD5, car nous pouvons utiliser le résultat sous forme de chaîne hexadécimale ou de chaîne Base64.
La fonction ci-dessus renvoie en fait a
[UInt8]
, et sur la base de ce résultat, nous pouvons obtenir n'importe quelle forme de chaîne, telle que hex, base64.Si une chaîne hexadécimale est souhaitée comme résultat final (comme le demande la question), nous pouvons continuer à utiliser le reste de la solution de Cody
Si une chaîne Base64 est souhaitée comme résultat final
la source
Une réponse pour Swift 5 avec une bonne gestion de la mémoire et sans
String
classe à l'intérieur de la méthode:exemple
Résultats:
la source
J'ai trouvé cette bibliothèque qui semble fonctionner plutôt bien.
https://github.com/onmyway133/SwiftHash
la source
mes deux cents (si vous avez besoin rapidement de md5 pour les données / NSData, par exemple vous avez téléchargé ou lu le binaire pour le disque ou le réseau)
(sans vergogne d'après "Swift 5 answer as a String extension (basé sur la grande réponse d'Invictus Cody")):
tester:
la source