如何使用Swift在iOS中将String转换为MD5哈希? [英] How can I convert a String to an MD5 hash in iOS using Swift?

查看:391
本文介绍了如何使用Swift在iOS中将String转换为MD5哈希?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想将"abc"之类的字符串转换为MD5哈希.我想在iOS和Swift中做到这一点.我尝试使用下面的解决方案,但它们对我不起作用:

I want to convert a string like "abc" to an MD5 hash. I want to do this in iOS and Swift. I have tried using the solutions below but they were not working for me:

在Swift框架中导入CommonCrypto

如何在快速语言中使用CC_MD5方法.

http://iosdeveloperzone.com/2014/10/03 /using-commoncrypto-in-swift/

更清楚地说,我想在Swift中实现类似于此PHP代码输出的输出:

To be more clear, I want to achieve an output in Swift similar to this PHP code's output:

$str = "Hello";

echo md5($str);

输出:8b1a9953c4611296a827abf8c47804d7

Output: 8b1a9953c4611296a827abf8c47804d7

推荐答案

有两个步骤:
1.从字符串创建md5数据
2.将md5数据隐藏为十六进制字符串

There are two steps:
1. Create md5 data from a string
2. Covert the md5 data to a hex string

Swift 2.0:

func md5(string string: String) -> String {
    var digest = [UInt8](count: Int(CC_MD5_DIGEST_LENGTH), repeatedValue: 0)
    if let data = string.dataUsingEncoding(NSUTF8StringEncoding) {
        CC_MD5(data.bytes, CC_LONG(data.length), &digest)
    }

    var digestHex = ""
    for index in 0..<Int(CC_MD5_DIGEST_LENGTH) {
        digestHex += String(format: "%02x", digest[index])
    }

    return digestHex
}

//Test:
let digest = md5(string:"Hello")
print("digest: \(digest)")

输出:

摘要:8b1a9953c4611296a827abf8c47804d7

digest: 8b1a9953c4611296a827abf8c47804d7

Swift 3.0:

func MD5(string: String) -> Data {
    let messageData = string.data(using:.utf8)!
    var digestData = Data(count: Int(CC_MD5_DIGEST_LENGTH))

    _ = digestData.withUnsafeMutableBytes {digestBytes in
        messageData.withUnsafeBytes {messageBytes in
            CC_MD5(messageBytes, CC_LONG(messageData.count), digestBytes)
        }
    }

    return digestData
}

//Test:
let md5Data = MD5(string:"Hello")

let md5Hex =  md5Data.map { String(format: "%02hhx", $0) }.joined()
print("md5Hex: \(md5Hex)")

let md5Base64 = md5Data.base64EncodedString()
print("md5Base64: \(md5Base64)")

输出:

md5Hex:8b1a9953c4611296a827abf8c47804d7
md5Base64:ixqZU8RhEpaoJ6v4xHgE1w ==

md5Hex: 8b1a9953c4611296a827abf8c47804d7
md5Base64: ixqZU8RhEpaoJ6v4xHgE1w==

Swift 5.0:

import Foundation
import var CommonCrypto.CC_MD5_DIGEST_LENGTH
import func CommonCrypto.CC_MD5
import typealias CommonCrypto.CC_LONG

func MD5(string: String) -> Data {
        let length = Int(CC_MD5_DIGEST_LENGTH)
        let messageData = string.data(using:.utf8)!
        var digestData = Data(count: length)

        _ = digestData.withUnsafeMutableBytes { digestBytes -> UInt8 in
            messageData.withUnsafeBytes { messageBytes -> UInt8 in
                if let messageBytesBaseAddress = messageBytes.baseAddress, let digestBytesBlindMemory = digestBytes.bindMemory(to: UInt8.self).baseAddress {
                    let messageLength = CC_LONG(messageData.count)
                    CC_MD5(messageBytesBaseAddress, messageLength, digestBytesBlindMemory)
                }
                return 0
            }
        }
        return digestData
    }

//Test:
let md5Data = MD5(string:"Hello")

let md5Hex =  md5Data.map { String(format: "%02hhx", $0) }.joined()
print("md5Hex: \(md5Hex)")

let md5Base64 = md5Data.base64EncodedString()
print("md5Base64: \(md5Base64)")

输出:

md5Hex:8b1a9953c4611296a827abf8c47804d7
md5Base64:ixqZU8RhEpaoJ6v4xHgE1w ==

md5Hex: 8b1a9953c4611296a827abf8c47804d7
md5Base64: ixqZU8RhEpaoJ6v4xHgE1w==

注意:
#import <CommonCrypto/CommonCrypto.h>必须添加到桥接头文件中

Notes:
#import <CommonCrypto/CommonCrypto.h> must be added to a Bridging-Header file

有关如何创建桥接头的信息,请参见此SO答案.

For how to create a Bridging-Header see this SO answer.

通常,不应将MD​​5用于新工作,SHA256是当前的最佳实践.

In general MD5 should not be used for new work, SHA256 is a current best practice.

MD2,MD4,MD5,SHA1,SHA224,SHA256,SHA384,SHA512(Swift 3 +)

这些函数将使用八种密码哈希算法之一来哈希String或Data输入.

These functions will hash either String or Data input with one of eight cryptographic hash algorithms.

name参数将哈希函数名称指定为String
支持的功能是MD2,MD4,MD5,SHA1,SHA224,SHA256,SHA384和SHA512 一种 此示例需要通用加密
必须有一个项目的桥接头:
#import <CommonCrypto/CommonCrypto.h>
将Security.framework添加到项目中.

The name parameter specifies the hash function name as a String
Supported functions are MD2, MD4, MD5, SHA1, SHA224, SHA256, SHA384 and SHA512 a This example requires Common Crypto
It is necessary to have a bridging header to the project:
#import <CommonCrypto/CommonCrypto.h>
Add the Security.framework to the project.

此函数接受要哈希的哈希名称和String并返回一个数据:

This function takes a hash name and String to be hashed and returns a Data:


name: A name of a hash function as a String  
string: The String to be hashed  
returns: the hashed result as Data  

func hash(name:String, string:String) -> Data? {
    let data = string.data(using:.utf8)!
    return hash(name:name, data:data)
}

示例:

let clearString = "clearData0123456"
let clearData   = clearString.data(using:.utf8)!
print("clearString: \(clearString)")
print("clearData: \(clearData as NSData)")

let hashSHA256 = hash(name:"SHA256", string:clearString)
print("hashSHA256: \(hashSHA256! as NSData)")

let hashMD5 = hash(name:"MD5", data:clearData)
print("hashMD5: \(hashMD5! as NSData)")

输出:

clearString: clearData0123456
clearData: <636c6561 72446174 61303132 33343536>

hashSHA256: <aabc766b 6b357564 e41f4f91 2d494bcc bfa16924 b574abbd ba9e3e9d a0c8920a>
hashMD5: <4df665f7 b94aea69 695b0e7b baf9e9d6>

这篇关于如何使用Swift在iOS中将String转换为MD5哈希?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆