[英]Why the packages object-hash and crypto / hashlib return different values for sha1?
我有一個 javascript 前端,它比較兩個object-hash
sha1 哈希以確定輸入是否已更改(在這種情況下需要重新運行處理管道)。
我開始構建一個 python 接口來與使用hashlib
生成 sha1 的相同后端進行交互,但不幸的是,即使輸入相同,這兩個函數也會返回不同的 hash 值。
我設法使用crypto
生成與hashlib
相同的 hash 值,這意味着問題出自object-hash
。
哈希庫
import json
import hashlib
data = {
'key1': 'value1',
'key2': 'value2',
'key3': 'value3',
};
json_data = json.dumps(data, separators=(',', ':')).encode('utf-8')
hash = hashlib.sha1()
hash.update(json_data)
print(hash.hexdigest())
# outputs f692755b3c38bc6b0dc376d775db8b07d6d5f256
密碼
const crypto = require('crypto');
const data = {
key1: 'value1',
key2: 'value2',
key3: 'value3',
};
const stringData = JSON.stringify(data)
const shasum = crypto.createHash('sha1')
shasum.update(stringData)
console.log(shasum.digest('hex'));
// (same as hashlib) outputs f692755b3c38bc6b0dc376d775db8b07d6d5f256
object-hash (經過和不經過字符串化測試均未成功)
const data = {
key1: 'value1',
key2: 'value2',
key3: 'value3',
};
const stringData = JSON.stringify(data)
const objectHash = require('object-hash');
console.log(objectHash.sha1(stringData));
// outputs b5b0a100d7852748fe2e35bf00eeb536ad2d17d1
我在object-hash
文檔中看到 package 正在使用crypto
,因此兩個輸出不同是沒有意義的。
如何使object-hash
和hashlib
/ crypto
都產生相同的 sha1 值?
事實證明, object-hash
為散列變量加上了它的類型前綴。 對於字符串,我需要將string:{string_length}:
添加到 hash stream。
hash = hashlib.sha1()
hash.update(f'string:{len(json_data)}:'.encode('utf-8')) # The line in question
hash.update(json_data)
res = hash.hexdigest()
print(res)
完成后, hashlib
和crypto
生成的哈希值與object-hash
相同。
注意:這沒有記錄在案,我不得不查看源代碼以找到具體如何為字符串添加前綴。 其他類型有不同的前綴。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.