使用 CryptoSwift 从文件中获取哈希
Get hash from file using 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
不需要框架来计算哈希值。您可以使用 CommonCrypto 做任何事情。您只需要添加一个包含
的桥接头
#import <CommonCrypto/CommonCrypto.h>
您可以查看here如何添加桥接头。
extension Data {
var hexString: String {
return map { String(format: "%02hhx", [=11=]) }.joined()
}
var sha256: Data {
var digest = [UInt8](repeating: 0, count: Int(CC_SHA256_DIGEST_LENGTH))
self.withUnsafeBytes({
_ = CC_SHA256([=11=], CC_LONG(self.count), &digest)
})
return Data(bytes: digest)
}
}
[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())
应该会产生预期的结果。
所以我尝试从文件中获取散列。使用 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
不需要框架来计算哈希值。您可以使用 CommonCrypto 做任何事情。您只需要添加一个包含
的桥接头#import <CommonCrypto/CommonCrypto.h>
您可以查看here如何添加桥接头。
extension Data {
var hexString: String {
return map { String(format: "%02hhx", [=11=]) }.joined()
}
var sha256: Data {
var digest = [UInt8](repeating: 0, count: Int(CC_SHA256_DIGEST_LENGTH))
self.withUnsafeBytes({
_ = CC_SHA256([=11=], CC_LONG(self.count), &digest)
})
return Data(bytes: digest)
}
}
[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())
应该会产生预期的结果。