簡體   English   中英

從 javascript 參考案例在 python 中重現 hmac 操作

[英]Reproducing an hmac operation in python from the javascript reference case

我有一個運行正常的 javascript 片段:

let seed = '319aa8124bbcddac2bae8438cfd5e658aeca56d524736739622dfb0a09942b22';
let salt = '0000000000000000004d6ec16dafe9d8370958664c1dc422f452892264c59526';
// 1. HMAC_SHA256(message=seed, key=salt)  
const hmac = CryptoJS.HmacSHA256(CryptoJS.enc.Hex.parse(seed), salt);
let foo = hmac.toString(CryptoJS.enc.Hex);
console.log("foo", hmac.toString(CryptoJS.enc.Hex));  //foo fe6a57f08b9970b7cd497e627afac956203a8ef829d2d97c7967775c1c0b6f6a

我嘗試在 python 中重現它:

seed = "319aa8124bbcddac2bae8438cfd5e658aeca56d524736739622dfb0a09942b22"
salt = "0000000000000000004d6ec16dafe9d8370958664c1dc422f452892264c59526"
hm = hmac.new(str.encode(seed), b'', hashlib.sha256)
hm.update(salt.encode("utf-8"))
h = hm.hexdigest()
print(h)   # returns 01703d8db07432ca416151099533b60baea7a6450fc5b88788c7ca9af921b4a1

但結果不正確。

我認為我缺少的步驟是在 javascript 中發生的CryptoJS.enc.Hex.parse(seed)操作。 我不明白這對種子價值有什么影響。 我嘗試使用console.log()該值,但它返回一個我不理解的復雜對象。

所以我的問題是:

  1. 該函數對seed什么作用
  2. 如何在python中做等價的。

這些算法適用於原始字節。 您的種子以十六進制表示這些字節,即31是一個字節, 9a是另一個字節。 CryptoJS.enc.Hex.parse將十六進制解析為字節。 Python 中的等效項是codecs.decode("...", "hex")

salt 也看起來像十六進制,但你的 JS 不會這樣解析它,所以我也只是在 python 中將它視為 UTF8。

import hmac
import hashlib
import codecs

seed = codecs.decode(b"319aa8124bbcddac2bae8438cfd5e658aeca56d524736739622dfb0a09942b22", "hex")
salt = u"0000000000000000004d6ec16dafe9d8370958664c1dc422f452892264c59526".encode("utf8")
hm = hmac.new(salt, seed, hashlib.sha256)
h = hm.hexdigest()
print(h)   # returns fe6a57f08b9970b7cd497e627afac956203a8ef829d2d97c7967775c1c0b6f6a

暫無
暫無

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

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