hmac return different result with json string

在用 Python 的 hmac module 做 hash 的時候發現每次執行的結果都不一樣,鬼打牆了一陣子才知道原因囧,以下是簡單的 sample code:

import json  
import hmac  
import hashlib  
import base64

data = {  
    'msg': 'hello',
    'result': 'test',
    'meta': 'yeah',
}
msg = json.dumps(data).encode('utf-8')  
secret = '123'  
dig = hmac.new(secret.encode('utf-8'), msg, digestmod=hashlib.sha256).digest()  
computed_signature = base64.b64encode(dig).decode()  

後來發現問題是因為 dict 是 unordered 的,所以在 json.dumps() 裡不能保證每次的順序會是一樣的,這邊可以加上參數來固定順序: json.dumps(data, sort_keys=True),就能保證 return 的 string 會是一致的。

Ref:
Items in JSON object are out of order using “json.dumps”?

carlcarl

Read more posts by this author.