微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决在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。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。