Python 和 PHP 之间的 MD5 不匹配

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

我正在尝试比较 PHP 和 Python 之间的 MD5 字符串,我们的服务器与 PHP 客户端运行良好,但是当我们尝试在 python 中执行相同操作时,我们总是从服务器得到无效响应。

我有以下Python代码

import hashlib
keyString = '96f6e3a1c4748b81e41ac58dcf6ecfa0'
decodeString = ''
length = len(keyString)
for i in range(0, length, 2):
   subString1 = keyString[i:(i + 2)]
   decodeString += chr(int(subString1, 16))
print(hashlib.md5(decodeString.encode("utf-8")).hexdigest())

Produces: 5a9536a1490714cb77a02080f902be4c

现在,PHP 中的概念相同:

$serverRandom = "96f6e3a1c4748b81e41ac58dcf6ecfa0";
$length = strlen($serverRandom);
$server_rand_code = '';
for($i = 0; $i < $length; $i += 2)
  {
    $server_rand_code .= chr(hexdec(substr($serverRandom, $i, 2)));
  }
echo 'SERVER CODE: '.md5($server_rand_code).'<br/>';

Produces: b761f889707191e6b96954c0da4800ee

我尝试检查编码,但没有运气,两个MD5输出根本不匹配,有什么帮助吗?

python php md5
2个回答
1
投票

看来你生成字节串的方法不正确,所以

hashlib.md5
的输入是错误的:

print(decodeString.encode('utf-8'))
# b'\xc2\x96\xc3\xb6\xc3\xa3\xc2\xa1\xc3\x84t\xc2\x8b\xc2\x81\xc3\xa4\x1a\xc3\x85\xc2\x8d\xc3\x8fn\xc3\x8f\xc2\xa0'

将字符串解释为十六进制字节字符串的最简单方法是使用

binascii.unhexlify
,或
bytes.fromhex
:

import binascii

decodeString  = binascii.unhexlify(keyString)
decodeString2 = bytes.fromhex(keyString)

print(decodeString)
# b'\x96\xf6\xe3\xa1\xc4t\x8b\x81\xe4\x1a\xc5\x8d\xcfn\xcf\xa0'

print(decodeString == decodeString2)
# True

您现在可以直接在

bytes
中使用生成的
hashlib.md5
对象:

import hashlib

result = hashlib.md5(decodeString)
print(result.hexdigest())
# 'b761f889707191e6b96954c0da4800ee'

0
投票

我发现相同的,只有一个字节不同......对于像“banana”这样的纯ascii字符串......尝试看看香蕉的python hashlib和php md5。问题是哪个是正确的?

366ab6641e9a20bd52100e07235fce6b
366ab6641e9a20bd52100000235fce6b
#--------------------^
© www.soinside.com 2019 - 2024. All rights reserved.