簡體   English   中英

為什么包 object-hash 和 crypto / hashlib 為 sha1 返回不同的值?

[英]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-hashhashlib / 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)

完成后, hashlibcrypto生成的哈希值與object-hash相同。

注意:這沒有記錄在案,我不得不查看源代碼以找到具體如何為字符串添加前綴。 其他類型有不同的前綴。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM