在Swift中获取Base64编码的SHA12 MD5摘要

问题描述

我正在尝试使用Bas64编码将字符串转换为SHA512 MD5哈希。我在下面的代码中尝试了同样的方法,但是返回了错误的字符串。

func sha512Base64(string: String) -> String {
        let digest = NSMutableData(length: Int(CC_SHA512_DIGEST_LENGTH))!
        if let data = string.data(using: String.Encoding.utf8) {
    
            let value =  data as NSData
            let uint8Pointer = UnsafeMutablePointer<UInt8>.allocate(capacity: digest.length)
            CC_SHA512(value.bytes,CC_LONG(data.count),uint8Pointer)
    
        }
        return digest.base64EncodedString(options: NSData.Base64EncodingOptions([]))
    }

请向我建议上述方法的确切解决方案或缺陷。

谢谢。

解决方法

我稍微重写了您的代码。试试这个

func sha512Base64(string: String) -> String? {
    guard let data = string.data(using: String.Encoding.utf8) else {
        return nil
    }

    var digest = Data(count: Int(CC_SHA512_DIGEST_LENGTH))
    _ = digest.withUnsafeMutableBytes { digestBytes -> UInt8 in
        data.withUnsafeBytes { messageBytes -> UInt8 in
            if let mb = messageBytes.baseAddress,let db = digestBytes.bindMemory(to: UInt8.self).baseAddress {
                let length = CC_LONG(data.count)
                CC_SHA512(mb,length,db)
            }
            return 0
        }
    }
    return digest.base64EncodedString()
}

我喜欢这个答案https://stackoverflow.com/a/52120827

使用他的方法,您可以像使用它

"123".hashed(.sha512,output: .base64)
,

在您的问题标题中,您提到SHA512和MD5,这是两件事。由于您的代码似乎试图计算SHA512,因此我假设这就是您想要的。

调用C函数时,可以使用适当类型的Swift数组来省去很多麻烦。利用这一点,您可以按如下方式重写代码:

func sha512Base64(string: String) -> String {
    guard let data = string.data(using: .utf8) else {
        fatalError("Failed to convert string to data")
    }
    var digest = [UInt8](repeating: 0,count: Int(CC_SHA512_DIGEST_LENGTH))
    let dataArray = Array(data)
    CC_SHA512(dataArray,CC_LONG(data.count),&digest)
    return Data(digest).base64EncodedString()
}

我应该提一下,如果您可以使用Apple的CryptoKit,那就容易多了:

import CryptoKit

func sha512Base64(string: String) -> String {
    guard let data = string.data(using: .utf8) else {
        fatalError("Failed to convert string to data")
    }
    let hash = SHA512.hash(data: data)
    return Data(hash).base64EncodedString()
}

iOS 13.0及更高版本支持CryptoKit。