使用CryptoSwift从文件获取哈希

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用CryptoSwift从文件获取哈希相关的知识,希望对你有一定的参考价值。

所以我尝试从文件中获取哈希值。使用CryptoSwift库。 truth是我从VLC网站获得的散列的变量,所以这应该是真的。但是,我生成的哈希与我知道的哈希是不同的。

我想念哪一步?

码:

let filePath = "/Users/pjc/Desktop/vlc-3.0.0.dmg"

let fileURL = URL(fileURLWithPath: filePath)
let truth = "e6f7179cb06809b6101803da3ac4191edb72ecf82f31b8ae7dbf010e1a78ba26"

do {
   let fileData = try Data.init(contentsOf: fileURL)
   print(fileData)
   let fileBytes = fileData.bytes
   let hash = fileBytes.sha256()
   print(hash.debugDescription)

} catch {

   //handle error
   print(error)
}

print(hash)
print(truth)

日志:

fileData: 46818658 bytes
hash.debugDescription: [230, 247, 23, 156, 176, 104, 9, 182, 16, 24, 3, 218, 58, 196, 25, 30, 219, 114, 236, 248, 47, 49, 184, 174, 125, 191, 1, 14, 26, 120, 186, 38]
hash: 105553117580736
truth: e6f7179cb06809b6101803da3ac4191edb72ecf82f31b8ae7dbf010e1a78ba26
答案
[230, 247, 23, 156, 176, 104, 9, 182, 16, 24, 3, 218, 58, 196, 25, 30, 219, 114, 236, 248, 47, 49, 184, 174, 125, 191, 1, 14, 26, 120, 186, 38]

e6f7179cb06809b6101803da3ac4191edb72ecf82f31b8ae7dbf010e1a78ba26

只是两个不同的相同散列值的表示:第一个作为整数数组,第二个作为字符串的十六进制表示。

因此,CryptoSwift库的.toHexString()方法会从数组中创建一个十六进制字符串

print(hash.toHexString())

应该产生预期的结果。

另一答案

计算哈希值不需要框架。你可以用CommonCrypto做任何事情。您只需要添加一个包含的桥接头

#import <CommonCrypto/CommonCrypto.h>

你可以查看here如何添加桥接头。

extension Data {

    var hexString: String {
        return map { String(format: "%02hhx", $0) }.joined()
    }

    var sha256: Data {
        var digest = [UInt8](repeating: 0, count: Int(CC_SHA256_DIGEST_LENGTH))
        self.withUnsafeBytes({
            _ = CC_SHA256($0, CC_LONG(self.count), &digest)
        })
        return Data(bytes: digest)
    }

}

以上是关于使用CryptoSwift从文件获取哈希的主要内容,如果未能解决你的问题,请参考以下文章

如何从 URL 获取片段标识符(哈希 # 后的值)?

使用CryptoSwift和CryptoJS进行AES加密

如何使用 php 从 torrent 文件中获取哈希信息?

常用python日期日志获取内容循环的代码片段

如何在Swift中将字符串哈希到SHA512?

如何从设置中获取数据并发送到此片段