Quero converter uma string como "abc" em um hash MD5. Eu quero fazer isso no iOS e Swift. Tentei usar as soluções abaixo, mas não funcionaram para mim:
Importando CommonCrypto em uma estrutura Swift
Como usar o método CC_MD5 em linguagem rápida.
http://iosdeveloperzone.com/2014/10/03/using-commoncrypto-in-swift/
Para ser mais claro, quero obter uma saída em Swift semelhante à saída deste código PHP:
$str = "Hello";
echo md5($str);
Saída: 8b1a9953c4611296a827abf8c47804d7
Respostas:
Existem duas etapas:
1. Crie dados md5 a partir de uma string
2. Converta os dados md5 em uma string hexadecimal
Swift 2.0:
Resultado:
Swift 3.0:
Resultado:
Swift 5.0:
Resultado:
Notas:
#import <CommonCrypto/CommonCrypto.h>
deve ser adicionado a um arquivo Bridging-HeaderPara saber como criar um Bridging-Header, consulte esta resposta do SO .
Em geral, o MD5 não deve ser usado para novos trabalhos, SHA256 é uma prática recomendada atual.
Exemplo da seção de documentação obsoleta:
MD2, MD4, MD5, SHA1, SHA224, SHA256, SHA384, SHA512 (Swift 3+)
O parâmetro name especifica o nome da função hash como uma String
As funções suportadas são MD2, MD4, MD5, SHA1, SHA224, SHA256, SHA384 e SHA512 a Este exemplo requer Common Crypto.
É necessário ter um cabeçalho de ponte para o projeto:
#import <CommonCrypto/CommonCrypto.h>
Adicione a Segurança .framework para o projeto.
Esta função usa um nome hash e String para fazer o hash e retorna um Data:
Exemplos:
Resultado:
fonte
String(data: digestData, encoding: String.Encoding.utf8)
arremessafatal error: unexpectedly found nil while unwrapping an Optional value
digestData
é. Se forem dados hash, as chances de serem UTF-8 (ou qualquer codificação de string éDepois de ler as outras respostas aqui (e precisar oferecer suporte a outros tipos de hash também), escrevi uma extensão String que lida com vários tipos de hash e tipos de saída.
NOTA: CommonCrypto está incluído no Xcode 10, portanto, você pode simplesmente
import CommonCrypto
sem ter que mexer com um cabeçalho de ponte se tiver a versão mais recente do Xcode instalada ... Caso contrário, um cabeçalho de ponte é necessário.ATUALIZAÇÃO: Swift 4 e 5 usam o mesmo arquivo String + Crypto.swift abaixo.
Há um arquivo Data + Crypto.swift separado para o Swift 5 (veja abaixo) como a API para 'withUnsafeMutableBytes' e 'withUnsafeBytes' alterado entre o Swift 4 e 5.
String + Crypto.swift - (para Swift 4 e 5)
SWIFT 5 - Data + Crypto.swift
SWIFT 4 - Data + Crypto.swift
Editar: uma vez que o hash realmente acontece nos dados, divido o algoritmo de hash em uma extensão de dados. Isso permite que o mesmo algoritmo seja usado para operações de hash de fixação de certificado SSL também.
Aqui está um pequeno exemplo de como você pode usá-lo para uma operação de fixação de SSL:
de volta à resposta original
Testei os algoritmos de hash usando isto:
e estes são os resultados impressos:
fonte
A partir do iOS 13, a Apple adicionou a
CryptoKit
estrutura para que você não precise mais importar CommonCrypto ou lidar com sua API C:fonte
SWIFT 3
versão demd5 function
:Link original de http://iosdeveloperzone.com
fonte
Swift 4. *, atualização do Xcode 10:
No Xcode 10 você não precisa mais usar o Bridging-Header , você pode importar diretamente usando
E então escreva um método como:
Uso:
Resultado:
fonte
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]) } }
Eu lancei uma implementação Swift pura que não depende de CommonCrypto ou qualquer outra coisa. Está disponível sob licença do MIT.
O código consiste em um único arquivo swift que você pode simplesmente soltar em seu projeto. Se preferir, você também pode usar o projeto Xcode contido com alvos de estrutura e teste de unidade.
É simples de usar:
estampas:
md5: 9e107d9d372bb6826bd81d3542a419d6
O arquivo swift contém documentação e mais exemplos.
fonte
Usar a criptografia é uma sobrecarga muito grande para conseguir exatamente isso.
A resposta aceita é perfeita! No entanto, eu só queria compartilhar uma abordagem de código Swift ier usando Swift 2.2 .
Por favor, tenha em mente que você ainda precisa
#import <CommonCrypto/CommonCrypto.h>
em seu arquivo Bridging-Headerfonte
Resposta do Swift 5 como uma extensão String (baseada na ótima resposta de Invictus Cody ):
Uso:
fonte
Aqui está uma extensão baseada na resposta zaph
Totalmente compatível com o swift 3.0. Você ainda precisa
#import <CommonCrypto/CommonCrypto.h>
no seu arquivo Bridging-Headerfonte
Na programação rápida, é melhor fazer uma string funcionar, então o uso será fácil. Aqui estou fazendo uma extensão de String usando uma das soluções fornecidas acima. Obrigado @wajih
Uso
fonte
Usei Cartago e Cyrpto para fazer isso.
Instale Cartago se ainda não o tiver feito
Instale o Crypto em seu projeto
execute 'atualização de cartage'
Se você estiver executando a partir da linha de comando, adicione na estrutura no arquivo swift
Adicione importação Crypto ao seu arquivo rápido.
então ele simplesmente funciona!
fonte
MD5 é um algoritmo de hash, não há necessidade de usar a biblioteca CommonCrypto volumosa para isso (e foi rejeitado pela revisão da Apple), basta usar qualquer biblioteca de hash md5.
Uma dessas bibliotecas que uso é o SwiftHash , uma implementação pura e rápida do MD5 (com base em http://pajhome.org.uk/crypt/md5/md5.html )
fonte
Com base na solução de Cody , tenho a ideia de que devemos esclarecer qual é o resultado do MD5, porque podemos usar o resultado como uma string hexadecimal ou uma string Base64.
A função acima realmente retorna a
[UInt8]
, e com base nesse resultado, podemos obter qualquer forma de string, como hex, base64.Se uma string hexadecimal é desejada como o resultado final (como a pergunta pede), podemos continuar usando o resto da solução de Cody
Se uma string Base64 for desejada como o resultado final
fonte
Uma resposta para o Swift 5 com gerenciamento de memória adequado e sem
String
classe dentro do método:exemplo
Resultados:
fonte
Achei esta biblioteca que parece funcionar muito bem.
https://github.com/onmyway133/SwiftHash
fonte
meus dois centavos (se você precisar rapidamente md5 para Data / NSData, por exemplo, você baixou ou leu binário para disco ou rede)
(desavergonhado de "Swift 5 answer as a String extension (baseado na ótima resposta de Invictus Cody")):
teste:
fonte