生成 JSON 的 md5 哈希并在 Python 和 JavaScript 中进行比较

问题描述 投票:0回答:2

我有一个用例,我必须生成

md5
对象的
JSON
哈希值,并比较服务器和浏览器中的哈希值。

浏览器客户端生成散列,然后向服务器询问同一资源的散列[恰好是一个 JSON 对象],并比较两个散列以决定下一步做什么。

对于服务器,我正在使用

Python
,浏览器客户端在
Javascript
.

对我来说,两种情况下生成的哈希值都不匹配。这是我的代码:

Python

>>> import hashlib
>>> import json

>>> a = {"candidate" : 5, "data": 1}
>>> a = json.dumps(a, sort_keys = True).encode("utf-8")
>>> hashlib.md5(a).hexdigest()
>>> 12db79ee4a76db2f4fc48624140adc7e

JS: 我正在使用 md5 在浏览器中进行哈希

> var hash = require("md5")
> var data = {"candidate":5, "data":1}
> data = JSON.stringify(data)
> md5(data)
> 92e99f0a99ad2a3b5e02f717a2fb83c2

我做错了什么?

javascript python hash md5
2个回答
42
投票

您假设这两种语言生成的 JSON 看起来相同。

>>> json.dumps({"candidate" : 5, "data": 1}, sort_keys=True)
'{"candidate": 5, "data": 1}'

js> JSON.stringify({"candidate" : 5, "data": 1})
"{\"candidate\":5,\"data\":1}"

幸运的是,他们可以。

>>> a = json.dumps({"candidate" : 5, "data": 1}, sort_keys=True, indent=2)
'{\n  "candidate": 5,\n  "data": 1\n}'

js> var a = JSON.stringify({"candidate" : 5, "data": 1}, null, 2)
"{\n  \"candidate\": 5,\n  \"data\": 1\n}"

现在哈希值也一样了。

蟒蛇:

>>> hashlib.md5(a.encode("utf-8")).hexdigest()
>>> d77982d217ec5a9bcbad5be9bee93027

JS:

>>> md5(a)
>>> d77982d217ec5a9bcbad5be9bee93027

1
投票

区别在于

json.dumps
默认应用一些小的漂亮打印,而
JSON.stringify
没有,这就是为什么哈希值不一样的原因。
蟒蛇:

 >>> import json
 >>> json.dumps({"candidate" : 5, "data": 1})
     '{"candidate": 5, "data": 1}'

Java脚本:

 > JSON.stringify({"candidate" : 5, "data": 1})
   '{"candidate":5,"data":1}'

但是通过一些修改,我们可以生成相同的散列。有两种方法:-

  1. 修改
    javascript JSON string
    使其等同于
    python JSON string

    蟒蛇:
    >>> import json,hashlib
    >>> a = json.dumps({"candidate" : 5, "data": 1}, sort_keys=True)
    >>> hashlib.md5(a.encode("utf-8")).hexdigest()
        '12db79ee4a76db2f4fc48624140adc7e'
    
    脚本:
    > const Crypto = require("crypto-js")
      undefined
    > const a = JSON.stringify({"candidate" : 5, "data": 1}).replaceAll(":", ": ").replaceAll(",", ", ")
      undefined
    > Crypto.MD5(a).toString(Crypto.enc.Hex)
      '12db79ee4a76db2f4fc48624140adc7e'
    
  2. 修改
    python JSON string
    使其等同于
    javascript JSON string

    蟒蛇:
    >>> import json,hashlib
    >>> a = json.dumps({"candidate" : 5, "data": 1}, separators=(',', ':'))
    >>> hashlib.md5(a.encode("utf-8")).hexdigest()
        '92e99f0a99ad2a3b5e02f717a2fb83c2'
    
    脚本:
    > const Crypto = require("crypto-js")
      undefined
    > const a = JSON.stringify({"candidate" : 5, "data": 1})
      undefined
    > Crypto.MD5(a).toString(Crypto.enc.Hex)
      '92e99f0a99ad2a3b5e02f717a2fb83c2'
    

    注意:- 要运行 javascript 代码,crypto-js npm pkg 应该安装在启动节点 shell 的相同位置。

© www.soinside.com 2019 - 2024. All rights reserved.