gpt4 book ai didi

swift - 为什么 MD5 散列如此困难并且在 Swift 3 中?

转载 作者:可可西里 更新时间:2023-11-01 02:11:17 26 4
gpt4 key购买 nike

好的,所以时不时地,你会遇到在使用各种框架和库之前已经解决的问题,以及在互联网上找不到的东西,你的问题解决得相对快速和容易,你也会了解为什么你的问题是个问题首先。

但是,有时您会遇到绝对意义为 0 的问题,当解决方案具有负面意义时更糟。

我的问题是我想获取 Data 并从中生成 MD5 散列。

我找到了各种解决方案,但都没有用。

真正让我烦恼的是,对于从任何东西中获取 MD5 散列值这样的琐碎任务,解决方案似乎是多么不必要的复杂。

我正在尝试使用 SoffesCryptoCommonCrypto 框架,它们看起来相当简单,对吧?对吧?

是的!

但为什么我仍然收到错误 fatal error: unwrappedly found nil while unwrapping an Optional value

据我了解,SoffesCrypto 扩展中由myData.md5 提供的数据似乎是“可选的”。但是为什么?

我要执行的代码是:

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"])

最佳答案

您问题的简单答案是:

String(data: someData, encoding: .utf8)

如果 someData 不是正确的 UTF8 编码数据,则返回 nil。如果您尝试像这样解包 nil:

String(data: someDate, encoding: .utf8)!

你得到:

fatal error: unexpectedly found nil while unwrapping an Optional value

因此,从本质上讲,它与哈希或加密无关。

MD5(或与此相关的任何哈希算法)的输入和输出都是二进制数据(而不是文本或字符串)。所以MD5的输出不是UTF8编码的数据。这就是为什么上面的字符串初始化器总是失败。

如果您想在控制台中显示二进制数据,您需要将其转换为可读的表示形式。最常见的是十六进制数字或 Base 64 编码。

注意:一些加密库允许您将字符串输入到它们的哈希函数中。他们会使用某种字符编码将字符串默默地转换为二进制表示形式。如果编码不匹配,则散列值在系统和编程语言之间不匹配。因此,您最好尝试了解他们为什么在后台这样做。

关于swift - 为什么 MD5 散列如此困难并且在 Swift 3 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40859459/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com