【问题标题】:Getting wrong value for SHA 256 for UIImage为 UIImage 获取错误的 SHA 256 值
【发布时间】:2018-11-06 06:22:52
【问题描述】:

我正在使用以下代码获取 UIImage 的 SHA 256

(来源:https://stackoverflow.com/a/50931949/10451073

extension UIImage{

    public func sha256() -> String{
        if let imageData = cgImage?.dataProvider?.data as? Data {
            return hexStringFromData(input: digest(input: imageData as NSData))
        }
        return ""
    }

    private func digest(input : NSData) -> NSData {
        let digestLength = Int(CC_SHA256_DIGEST_LENGTH)
        var hash = [UInt8](repeating: 0, count: digestLength)
        CC_SHA256(input.bytes, UInt32(input.length), &hash)
        return NSData(bytes: hash, length: digestLength)
    }

    private  func hexStringFromData(input: NSData) -> String {
        var bytes = [UInt8](repeating: 0, count: input.length)
        input.getBytes(&bytes, length: input.length)

        var hexString = ""
        for byte in bytes {
            hexString += String(format:"%02x", UInt8(byte))
        }

        return hexString
    }
}

我将它用作:

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {

        if let file = info[UIImagePickerControllerOriginalImage]
        {
            print((file as? UIImage)?.sha256())
        }
        self.dismiss(animated: true, completion: nil)


    }

但是,我得到任何 UIImage 的 SHA 256 错误。例如,在检查此图像的 SHA 256 时 - https://drive.google.com/open?id=1p9n01qOFahr6I1Q7FPzoDCKcjLjYVivl,我得到的值是 1d6a7c377157c4511183706033898c76c090924ecbf9d47ddff7243237dc9243,而不是得到正确的值是 360cd85c64b5e672c48ef948df689a17e41b80a84b9d3d2039143e47a9473395(验证自:https://hash.online-convert.com/sha256-generator

请帮助我了解这里出了什么问题以及我应该如何更改上述代码以获得正确的 SHA 256 值。非常感谢您的帮助。谢谢。

编辑:在与@Paulw11 在下面的回答中讨论后,我知道我需要获取文件的哈希值而不是图像。但是我不确定如何更改此代码以使其相同。请帮助我。

【问题讨论】:

  • A UIImage 不是 PNG 或 JPEG 文件;对于 PNG 和从该 PNG 创建的 UIImage,您不会获得相同的哈希值。您需要对文件执行哈希,而不是 UIImage

标签: ios swift xcode


【解决方案1】:

UIImage 不是 PNG 或 JPEG 文件;对于 PNG 文件和从该文件创建的 UIImage,您不会获得相同的哈希值。

您需要对文件执行哈希,而不是 UIImage,如果您想获得可以与同一文件的另一个哈希进行比较的值。

您可以使用字典的imageURL 条目来获取图像的文件url。

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {

    if let file = info[UIImagePickerControllerImageURL] as? URL
    {

        try {
            let imageData = Data(contentsOf:file)
            let hash = imageData.sha256
        } catch {
            print(error)
        }
    }
    self.dismiss(animated: true, completion: nil)
}

extension Data {

    public var sha256:String {
        get {
            return hexStringFromData(input: digest(input: self as NSData))
        }
    }

    private func digest(input : NSData) -> NSData {
        let digestLength = Int(CC_SHA256_DIGEST_LENGTH)
        var hash = [UInt8](repeating: 0, count: digestLength)
        CC_SHA256(input.bytes, UInt32(input.length), &hash)
        return NSData(bytes: hash, length: digestLength)
    }

    private  func hexStringFromData(input: NSData) -> String {
        var bytes = [UInt8](repeating: 0, count: input.length)
        input.getBytes(&bytes, length: input.length)

        var hexString = ""
        for byte in bytes {
            hexString += String(format:"%02x", UInt8(byte))
        }

        return hexString
    }
}

【讨论】:

  • 你能帮忙为文件而不是 UIImage 重写一个类似的 sha 256 算法吗?谢谢。
  • 代码基本相同,只是你需要从文件中获取Data实例;您可以使用Data(contentsOf:options) 从文件或服务器 url 加载数据
  • 请检查我编辑的问题详细信息,并请帮助我了解我可以在那里解决什么问题?
  • 此代码无法在低于 11.0 的 iOS 版本上运行 :(
  • 在 iOS 11 之前无法获取底层文件。
猜你喜欢
  • 1970-01-01
  • 2013-06-04
  • 1970-01-01
  • 2012-08-09
  • 1970-01-01
  • 1970-01-01
  • 2018-03-11
  • 1970-01-01
相关资源
最近更新 更多