【发布时间】:2016-11-29 06:49:50
【问题描述】:
好的,所以你时不时会遇到在使用各种框架和库之前解决的问题,以及在互联网上找不到的东西,你的问题得到了相对快速和容易的解决,你也了解了为什么你的问题是一个问题首先。
但是,有时您会遇到绝对 0 意义的问题,当解决方案具有负面意义时,情况会更糟。
我的问题是我想使用 Data 并从中生成一个 MD5 哈希。
我找到了各种解决方案,但没有一个有效。
真正让我烦恼的是,对于从任何事物中获取 MD5 哈希值这样的微不足道的任务来说,解决方案似乎是多么不必要地复杂。
我正在尝试使用Soffes 的Crypto 和CommonCrypto 框架,它们看起来相当简单,对吧?对吧?
是的!
但是为什么我仍然收到错误fatal error: unexpectedly found nil while unwrapping an Optional value?
据我了解,myData.md5 在Crypto 的扩展中提供的数据Soffes 似乎是“可选的”。但是为什么呢?
我要执行的代码是:
print(" md5 result: " + String(data: myData.md5, encoding: .utf8)!)
其中myData 100% 有数据,因为在上面的代码行之后,我将该数据发送到服务器,并且数据存在。
最重要的是,通过print(String(myData.md5.count)) 打印myData.md5.count 的计数非常有效。
所以我的问题基本上是:我如何对数据进行 MD5 散列并将其打印为字符串?
编辑:
我的尝试
行得通
MD5:在 PHP 脚本中输入字符串 test 给我 098f6bcd4621d373cade4e832627b4f6
Swift 代码"test".md5() 也给了我098f6bcd4621d373cade4e832627b4f6
那行不通
将UInt8 字节数组从Data.md5() 转换为代表正确MD5 值的字符串。
我做过的不同测试如下:
var hash = ""
for byte in myData.data.md5() {
hash += String(format: "%02x", byte)
}
print("loop = " + hash) //test 1
print("myData.md5().toHexString() = " + myData.md5().toHexString()) //test 2
print("CryptoSwift.Digest.md5([UInt8](myData)) = " + CryptoSwift.Digest.md5([UInt8](myData)).toHexString()) //test 3
所有三个 500 字节测试数据的测试都给了我 MD5 值56f6955d148ad6b6abbc9088b4ae334d
而我的 PHP 脚本给了我6081d190b3ec6de47a74d34f6316ac6b
测试样本(64 字节): 原始数据:
FFD8FFE0 00104A46 49460001 01010048 00480000 FFE13572 45786966 00004D4D
002A0000 0008000B 01060003 00000001 00020000 010F0002 00000012 00000092
测试 1、2 和 3 MD5:7f0a012239d9fde5a46071640d2d8c83
PHP MD5:06eb0c71d8839a4ac91ee42c129b8ba3
PHP 代码:echo md5($_FILES["file"]["tmp_name"])
【问题讨论】:
-
您说
myData和myData.md5在服务器上获取数据和打印语句中的计数时都有效。仅基于此数据,并查看您的代码行,唯一突出的是您用于将其转换为字符串的编码utf8。 -
发现 this SO question 提到 Crypto 代码中使用的
CC_MD5函数在 Swift 中不起作用。尽管这与您关于myData.md5不为空的观点相矛盾。 -
是的,这很奇怪。我现在正在尝试 CryptoSwift,我得到了同样的错误。
-
当您说
print(String(myData.md5.count))完美运行时,您的意思是它实际上显示了正确的计数吗?你是如何验证的。 -
就是这样,我得到了
16的计数,但是我怎么知道这 16 个字节是什么?在打印之前我无法验证,对吧?
标签: swift swift3 cryptography md5 cryptoswift