【问题标题】:Get Base64 encoded SHA12 MD5 digest in Swift在 Swift 中获取 Base64 编码的 SHA12 MD5 摘要
【发布时间】:2021-02-08 12:05:21
【问题描述】:

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

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

提前致谢。

【问题讨论】:

  • 您能否提供更多详细信息,如何验证输出字符串或在哪里使用它?
  • 没必要使用NSMutableData

标签: ios swift swift3


【解决方案1】:

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

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)

【讨论】:

    【解决方案2】:

    在您的问题标题中,您提到了 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。

    【讨论】:

      猜你喜欢
      • 2020-09-06
      • 2015-09-06
      • 1970-01-01
      • 2011-07-25
      • 1970-01-01
      • 2020-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多