在 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。
我正在尝试使用 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。