我想将“ abc”之类的字符串转换为MD5哈希。我想在iOS和Swift中做到这一点。我尝试使用下面的解决方案
http://iosdeveloperzone.com/2014/10/03/using-commoncrypto-in-
swift/
更清楚地说,我想在Swift中实现类似于此PHP代码输出的输出:
$str = "Hello";
echo md5($str);
输出:8b1a9953c4611296a827abf8c47804d7
分两个步骤:
1.从字符串创建md5数据
2.将md5数据隐蔽为十六进制字符串
Swift 2.0:
func md5(string string: String) -> String {
var digest = [UInt8](count: Int(CC_MD5_DIGEST_LENGTH), repeatedValue: 0)
if let data = string.dataUsingEncoding(NSUTF8StringEncoding) {
CC_MD5(data.bytes, CC_LONG(data.length), &digest)
}
var digestHex = ""
for index in 0..<Int(CC_MD5_DIGEST_LENGTH) {
digestHex += String(format: "%02x", digest[index])
}
return digestHex
}
//Test:
let digest = md5(string:"Hello")
print("digest: \(digest)")
输出:
摘要:8b1a9953c4611296a827abf8c47804d7
Swift 3.0:
func MD5(string: String) -> Data {
let messageData = string.data(using:.utf8)!
var digestData = Data(count: Int(CC_MD5_DIGEST_LENGTH))
_ = digestData.withUnsafeMutableBytes {digestBytes in
messageData.withUnsafeBytes {messageBytes in
CC_MD5(messageBytes, CC_LONG(messageData.count), digestBytes)
}
}
return digestData
}
//Test:
let md5Data = MD5(string:"Hello")
let md5Hex = md5Data.map { String(format: "%02hhx", $0) }.joined()
print("md5Hex: \(md5Hex)")
let md5Base64 = md5Data.base64EncodedString()
print("md5Base64: \(md5Base64)")
输出:
md5Hex:8b1a9953c4611296a827abf8c47804d7
md5Base64:ixqZU8RhEpaoJ6v4xHgE1w ==
Swift 5.0:
import Foundation
import var CommonCrypto.CC_MD5_DIGEST_LENGTH
import func CommonCrypto.CC_MD5
import typealias CommonCrypto.CC_LONG
func MD5(string: String) -> Data {
let length = Int(CC_MD5_DIGEST_LENGTH)
let messageData = string.data(using:.utf8)!
var digestData = Data(count: length)
_ = digestData.withUnsafeMutableBytes { digestBytes -> UInt8 in
messageData.withUnsafeBytes { messageBytes -> UInt8 in
if let messageBytesBaseAddress = messageBytes.baseAddress, let digestBytesBlindMemory = digestBytes.bindMemory(to: UInt8.self).baseAddress {
let messageLength = CC_LONG(messageData.count)
CC_MD5(messageBytesBaseAddress, messageLength, digestBytesBlindMemory)
}
return 0
}
}
return digestData
}
//Test:
let md5Data = MD5(string:"Hello")
let md5Hex = md5Data.map { String(format: "%02hhx", $0) }.joined()
print("md5Hex: \(md5Hex)")
let md5Base64 = md5Data.base64EncodedString()
print("md5Base64: \(md5Base64)")
输出:
md5Hex:8b1a9953c4611296a827abf8c47804d7
md5Base64:ixqZU8RhEpaoJ6v4xHgE1w ==
注意:
#import <CommonCrypto/CommonCrypto.h>
必须添加到Bridging-Header文件中
有关如何创建Bridging-Header的信息
通常,不应将MD5用于新工作,SHA256是当前的最佳实践。
MD2,MD4,MD5,SHA1,SHA224,SHA256,SHA384,SHA512(Swift 3+)
这些函数将使用八种密码哈希算法之一来哈希String或Data输入。
name参数将哈希函数名称指定为String
支持的函数是MD2,MD4,MD5,SHA1,SHA224,SHA256,SHA384和SHA512 a此示例需要通用加密
必须在项目中具有桥接头: #import <CommonCrypto/CommonCrypto.h>
添加安全性.framework到项目。
此函数采用哈希名称和要哈希的String并返回一个Data:
name:作为字符串的哈希函数的名称
string:要散列的字符串
返回:哈希结果为Data
func hash(name:String, string:String) -> Data? {
let data = string.data(using:.utf8)!
return hash(name:name, data:data)
}
例子:
let clearString = "clearData0123456"
let clearData = clearString.data(using:.utf8)!
print("clearString: \(clearString)")
print("clearData: \(clearData as NSData)")
let hashSHA256 = hash(name:"SHA256", string:clearString)
print("hashSHA256: \(hashSHA256! as NSData)")
let hashMD5 = hash(name:"MD5", data:clearData)
print("hashMD5: \(hashMD5! as NSData)")
输出:
clearString: clearData0123456
clearData: <636c6561 72446174 61303132 33343536>
hashSHA256: <aabc766b 6b357564 e41f4f91 2d494bcc bfa16924 b574abbd ba9e3e9d a0c8920a>
hashMD5: <4df665f7 b94aea69 695b0e7b baf9e9d6>
问题内容: 谁能知道如何将 MD5 转换为 String 。就我而言,我已将密码保存在数据库的 MD5 中。我试图检索密码并以字符串形式显示以进行编辑。 这是我将字符串转换为加密格式所做的工作: 我不知道如何将加密格式转换为字符串以编辑密码。 问题答案:
问题内容: 我从NSData的Web服务响应中接收到base64String,如何快速将base64String转换为String? 如果文件包含某些表格式/图像,则编码和解码都会给出无效的base64String,base64String的编码和解码可以很好地用于仅包含文本的文件。如何将文件转换为base64String进行编码和解码,无论文件内容如何?文件格式为doc,docx,pdf,txt
问题内容: 我正在尝试用快速的语言编写BMI程序。我有一个问题:如何将字符串转换为Double? 在Objective-C中,我可以这样: 但是如何用Swift语言实现呢? 问题答案: Swift 4.2+字符串加倍 您应该使用新的类型初始值设定项在String和数字类型(Double,Float,Int)之间进行转换。它会返回一个可选类型(Double?),该类型将具有正确的值;如果String
问题内容: 我正在尝试找出如何在Swift中将转换为。 我想出一种解决方法,但是我很想弄清楚如何在Swift中做到这一点。 问题答案: 转换为: 而另一种方式-转换为: 或者,如果您使用的是Swift 2或3:
问题内容: 我正在尝试转换从UITextField中获取的数字(我认为这些数字实际上是字符串),并将其转换为Float,因此我可以将它们相乘。 我有两个声明如下: 当用户按下UIButton时,我想计算用户赚取的工资,但是我不能,因为我需要先将其转换为浮动工资,然后才能使用它们。 我知道如何通过执行以下操作将它们转换为整数: 但是,我不知道如何将它们转换为浮点数。 问题答案: 迅捷2.0+ 现在,
PHP5.5中新的password_hash API非常好,我想开始在任何地方使用它。对于一个使用旧数据库的旧项目,密码存储在md5散列中,将旧用户密码迁移到新的、更安全的API的最佳方法是什么? 除了简单地提示用户在下一次登录时重置密码(这对用户来说是不切实际和令人讨厌的)之外,我还考虑了使用当前md5哈希作为所有现有用户的password_hash()输入的可能性。为了验证这些用户的密码(在登