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

Get Base64 encoded SHA12 MD5 digest in Swift

我正在尝试使用 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()
}

我喜欢这个回答

通过他的方法,您可以像使用它一样

"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。