MD5哈希转到Python

MD5哈希转到Python,python,python-3.x,go,hash,md5,Python,Python 3.x,Go,Hash,Md5,我有以下代码: 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 :

我有以下代码:

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))

}
如果在以下位置运行代码:我将获得以下输出:

{"hvin":"MUdCSkMzNFIxVkYwNjMxNTTUHYzZjwCyBOmACZjs+EJ+"}
我如何在Python3中复制它

我尝试了以下几点:

import hashlib 

result = hashlib.md5(b'1GBJC34R1VF063154')
print(result.hexdigest()) 
获取与Go给定的输出不匹配的以下输出:

a40f771ea430ae32dbc5e818387549d3

谢谢。

您没有正确使用哈希:

    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)) 

另一个答案中的注释表示目标与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))

您好,您只需按照

戈兰

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 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

Golang在
fmt
中的
%x
打印“…以16为底,小写字母表示a-f”。
更多信息:

如果将
fmt.Printf(“%s”,字符串(b))
替换为
fmt.Printf(“%x”,md5Vin)
,您会得到什么?仅供参考,Go输出Base64编码输入,最后加上一些垃圾:将其输送到
base64-D
prints
1GBJC34R1VF063154
上,再加上一些尾随的不可打印字节。问题是,如果我采用哈希并进行base64编码,我得到的结果是:YTqwzjc3mWndmWyWuzmmriyzvlode4mZG3NTQDM与MudCsKmFznFixVkyWnWnjxNtuhyzzjWcybomaczjs+EJ+Hi不匹配,谢谢你的回答,但我需要能够匹配输出。哈希的base64编码版本是:YTQwZjc3MWVhNDMwYWUzMmRiYzVlODE4Mzg3NTQ5ZDM,它与MUdCSkMzNFIxVkYwNjMxNTTUHYzZjwCyBOmACZjs+EJ+不匹配。如果go程序输出错误,请不要尝试将其与python匹配。base64输出应为YTQw。。。不是MUdC…您正在错误地使用
md5.Sum
。检查我的代码。您缺少
md5。请在代码中写入
。你的程序输出不是哈希的base64编码,而是VIN+binarydata的base64编码。问题是,不幸的是,我不能影响它,即使你说使用哈希是不正确的,这就是我所依赖的程序的工作方式,我不能影响它,你能解释一下VIN+binarydata吗?散列的二进制数据?也许我可以将其合并并编码64以获得所需的格式?请阅读
hash.Sum()
的文档。您没有通过调用
md5.Sum(vin)
来计算哈希值。您正在将
md5
中的当前哈希值附加到
vin
。因为您刚刚创建了md5,所以它是用md5初始化向量初始化的。因此,输出为VIN+md5初始化向量。您只需将一个常量二进制值附加到您拥有的任何VIN。如果您想在python中模拟断开的散列,那么获取0长度输入的散列,将该二进制散列连接到VIN,并将其base64。但这是错误的。