gpt4 book ai didi

ios - 保存到相册后相机图像的SHA256哈希不同

转载 作者:行者123 更新时间:2023-11-28 11:34:38 24 4
gpt4 key购买 nike

Xcode 10.2Swift 5

我从相机中选取一张图像,计算图像的 SHA256 哈希值作为字符串,并将图像保存到 iPhone 相册。

//Save photo to album. Photo comes from UIImagePickerController
UIImageWriteToSavedPhotosAlbum(self.photo, self, #selector(saveimage(_:didFinishSavingWithError:contextInfo:)), nil)

//Calculate hash
let imageData : Data = self.photo!.pngData()!
let imageHash : String = getImageHash(data: imageData)

func getImageHash(data : Data) -> String {

var hashBytes = [UInt8](repeating: 0, count: Int(CC_SHA256_DIGEST_LENGTH))
data.withUnsafeBytes {
_ = CC_SHA256($0.baseAddress, CC_LONG(data.count), &hashBytes)
}

var hex = ""
for index in 0..<Int(CC_SHA256_DIGEST_LENGTH) {
hex += String(format: "%02x", hashBytes[index])
}
print(hex)
return hex
}

然而,代码为我提供了与保存后不同的图像 SHA256。我将照片传输到我的 Mac 并通过 shasum -a 256 检查哈希,然后将它直接从 iPhone 上传到在线哈希生成器,该生成器为我提供了与 Mac 相同的哈希。

所以,要么是我计算散列的代码有误,要么是在使用 UIImageWriteToSavedPhotosAlbum(...) 存储照片时更改了名称或属性等内容。有什么解决办法吗?

最佳答案

我对此事做了一些进一步的研究,看来您在 UIImage 中拥有的数据确实与您作为文件打开的数据不同,我相信这正是导致问题。请注意,为了便于阅读,我已经缩短了 base64 数据。

swift

func getImageHash(data: Data) -> String {
var hashBytes = [UInt8](repeating: 0, count: Int(CC_SHA256_DIGEST_LENGTH)
data.withUnsafeBytes {
_ = CC_SHA256($0.baseaddress, CC_LONG(data.count), &hashBytes)
}
var hex = ""
for index in 0 ..< Int(CC_SHA256_DIGEST_LENGTH) {
hex += String(format: "%02x", hashbytes[index])
}
return hex
}

功能没问题,我就用iOS的assets文件夹来举例

let imageData = UIImage(named: "Example")!.pngData()!
print(imageData.base64EncodedString())
// 'iVBORw0KGgoAAAANSUhEUgAAAG8AAACACAQAAACv3v+8AAAM82lD [...] gAAAABJRU5ErkJggg=='
let imageHash = getImageHash(data: imageData)
print(imageHash)
// '145036245c9f675963cc8de2147887f9feded5813b0539d2320d201d9ce63397'

就我们目前而言,哈希计算正确。我对 base64 数据很感兴趣,所以我也可以在其他平台上使用它。

python

import hashlib
import base64

img_d = base64.b64decode('iVBORw0KGgoAAAANSUhEUgAAAG8AAACACAQAAACv3v+8AAAM82lD [...] gAAAABJRU5ErkJggg==')
m = hashlib.sha256()
m.update(img_d)
m.digest().hex()
# '145036245c9f675963cc8de2147887f9feded5813b0539d2320d201d9ce63397'

所以看起来哈希计算正确,但仅适用于 base64 数据。那么区别是什么呢?让我们再次使用 Python 进行研究。我用PIL直接加载图片。

import hashlib
from PIL import Image

i = Image.open('/path/to/file')
img_d = i.tobytes()
m = hashlib.sha256()
m.update(img_d)
m.digest().hex()
# 'f650b1b95a50c3a2b77da7a0825c3c01066385a12c8fe50b449ffc8c7249e370'

所以现在我们确实有了一个不同的散列。让我们尝试最后一件事,openssl dgst 在终端中。

终端

echo 'iVBORw0KGgoAAAANSUhEUgAAAG8AAACACAQAAACv3v+8AAAM82lD [...] gAAAABJRU5ErkJggg==' | base64 --decode | openssl dgst -sha256
145036245c9f675963cc8de2147887f9feded5813b0539d2320d201d9ce63397

好吧,确实如此,openssl digest 可以计算 base64 数据的哈希值,它确实匹配。

openssl dgst -sha256 /path/to/file
SHA256(/path/to/file)= d15c2d0c186a46b41c34a312eaf1c7e4b0f7a51bdb9c53a91dc361385ba23e64

所以这很有趣。 base64 数据散列有 100% 的成功率,但是在 Python 和终端中加载它,导致两个不同的散列。我不知道他们为什么不同的原因。我相信我之前在评论中提到的是正确的,对文件进行哈希处理将产生不同的哈希值,因为文件的元数据也被哈希处理。

为了提供一个解决方案:尝试散列你的原始图像数据,而不是文件。这样成功的几率最大。希望这会有所帮助。

关于ios - 保存到相册后相机图像的SHA256哈希不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55868751/

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