【问题标题】:MD5 hash Go to PythonMD5 哈希 转到 Python
【发布时间】:2020-03-09 10:55:35
【问题描述】:

我有以下代码:

package main

import (
    "crypto/md5"
    "encoding/json"
    "fmt"
)

type Payload struct {
    HVIN []byte `json:"hvin"`
}

func main() {
    vin := "1GBJC34R1VF063154"
    md5 := md5.New()
    md5Vin := md5.Sum([]byte(vin))
    payload := &Payload{
        HVIN: md5Vin,
    }
    b, _ := json.Marshal(payload)
    fmt.Printf("%s", string(b))

}

如果我在https://play.golang.org/ 运行代码,我会得到以下输出:

{"hvin":"MUdCSkMzNFIxVkYwNjMxNTTUHYzZjwCyBOmACZjs+EJ+"}

如何在 Python 3 中复制它?

我尝试了以下操作:

import hashlib 

result = hashlib.md5(b'1GBJC34R1VF063154')
print(result.hexdigest()) 

得到以下与 Go 给出的输出不匹配的输出:

a40f771ea430ae32dbc5e818387549d3

谢谢。

【问题讨论】:

  • 如果将fmt.Printf("%s", string(b)) 替换为fmt.Printf("%x", md5Vin) 会得到什么?
  • 仅供参考,Go 输出 Base64 编码的输入,最后加上一些垃圾:将其通过管道输送到 base64 -D 打印 1GBJC34R1VF063154 加上一些尾随的不可打印字节。
  • 问题是,如果我采用哈希并进行 base64 编码,我得到: YTQwZjc3MWVhNDMwYWUzMmRiYzVlODE4Mzg3NTQ5ZDM 与 MUdCSkMzNFIxVkYwNjMxNTTUHYzZjwCyBOmACZjs+EJ+ 不匹配

标签: python python-3.x go hash md5


【解决方案1】:

另一个答案中的 cmets 表明目标与 Go 代码匹配,即使 Go 代码不计算 VIN 的哈希值。

这里的 python3 代码与 Go 代码匹配。此代码 base64 对 VIN 和 MD5 初始值的串联进行编码。

vin := "1GBJC34R1VF063154"
b0 = vin.encode('utf-8')
b1 = hashlib.md5(b'').digest()
s =  base64.b64encode(b0 + b1).decode('ascii') // to match Go's encoding/json
print(f'{{"hvin":"{s}"}}')

Go 代码的作者可能打算这样写:

vin := "1GBJC34R1VF063154"
md5Vin := md5.Sum([]byte(vin))
payload := &Payload{
    HVIN: md5Vin[:],
}
b, _ := json.Marshal(payload)
fmt.Printf("%s", string(b))

【讨论】:

    【解决方案2】:

    您错误地使用了哈希:

        vin := "1GBJC34R1VF063154"
        md5 := md5.New()
        md5.Write([]byte(vin))
        md5Vin := md5.Sum(nil)
        // This should give a40f771ea430ae32dbc5e818387549d3
        fmt.Printf("%x",md5Vin)
        payload := &Payload{
            HVIN: md5Vin,
        }
        b, _ := json.Marshal(payload)
        // This will print the base64-encoded version of the hash
        fmt.Printf("%s", string(b)) 
    

    【讨论】:

    • 您好,感谢您的回答,但我需要能够匹配输出。哈希的 base64 编码版本是: YTQwZjc3MWVhNDMwYWUzMmRiYzVlODE4Mzg3NTQ5ZDM 与 MUdCSkMzNFIxVkYwNjMxNTTUHYzZjwCyBOmACZjs+EJ+ 不匹配
    • 你的go程序输出错误,不要尝试用python匹配。 base64 输出应该是 YTQw... 而不是 MUdC...
    • 您错误地使用了md5.Sum。检查我的代码。您的代码中缺少md5.Write。你的程序输出的不是hash的base64编码,是VIN+binarydata的base64编码
    • 问题是我很遗憾不能影响这一点,即使你说的哈希的使用不正确,这就是我依赖的程序的工作方式,我不能影响这一点,你能解释一下 VIN +二进制数据?哈希的二进制数据?也许我可以将它们连接在一起并编码64以获得所需的格式?
    • 阅读hash.Sum() 的文档。您不是通过调用md5.Sum(vin) 来计算哈希值。您将md5 中的当前哈希值附加到vin。由于您刚刚创建了 md5,因此使用 md5 初始化向量对其进行了初始化。所以输出是 VIN+md5 初始化向量。您只是将一个常量二进制值附加到您拥有的任何 VIN 上。如果要在 python 中模拟损坏的哈希,则获取长度为 0 的输入的哈希,将该二进制哈希连接到 VIN,然后使用 base64 连接。但这是错误的。
    【解决方案3】:

    您好,您只需按照 https://golang.org/pkg/crypto/md5/#example_New 中的示例进行操作即可

    Golang

    package main
    
    import (
        "crypto/md5"
        "fmt"
        "io"
    )
    
    func main() {
        h := md5.New()
        vin := "1GBJC34R1VF063154"
        io.WriteString(h, vin)
        fmt.Printf("%x", h.Sum(nil)) // a40f771ea430ae32dbc5e818387549d3
    }
    

    Python

    Python 3.6.8 (default, Oct  7 2019, 12:59:55) 
    [GCC 8.3.0] on linux
    Type "help", "copyright", "credits" or "license" for more information.
    >>> import hashlib 
    >>> 
    >>> result = hashlib.md5(b'1GBJC34R1VF063154')
    >>> print(result.hexdigest()) 
    a40f771ea430ae32dbc5e818387549d3
    
    

    fmt 中的 Golang 的 %x 打印“... base 16,小写字母表示 a-f”。 更多:https://golang.org/pkg/fmt/

    【讨论】:

      猜你喜欢
      • 2012-03-20
      • 2019-04-24
      • 1970-01-01
      • 1970-01-01
      • 2012-08-17
      • 1970-01-01
      • 2018-09-23
      • 2020-12-08
      相关资源
      最近更新 更多