Python md5一个字符串多次在不同的平台上得到不同的结果
t、 c 还有t.pyPython md5一个字符串多次在不同的平台上得到不同的结果,python,openssl,md5,Python,Openssl,Md5,t、 c 还有t.py all: cc t.c -Wall -L/usr/local/lib -lcrypto 在Debian6 x86和MacOS 10.6上使用python脚本的结果是相同的: #!/usr/bin/env python import hashlib import binascii src = 'abcdef' a = hashlib.md5(src).digest() b = hashlib.md5(a).digest() c = hashlib.md5(b).he
all:
cc t.c -Wall -L/usr/local/lib -lcrypto
在Debian6 x86和MacOS 10.6上使用python脚本的结果是相同的:
#!/usr/bin/env python
import hashlib
import binascii
src = 'abcdef'
a = hashlib.md5(src).digest()
b = hashlib.md5(a).digest()
c = hashlib.md5(b).hexdigest().upper()
print binascii.b2a_hex(a)
print binascii.b2a_hex(b)
print c
MacOS上的c版本是:
e80b5017098950fc58aad83c8c14978e
b91282813df47352f7fe2c0c1fe9e5bd
85E4FBD1BD400329009162A8023E1E4B
为什么它不同于Debian6?
Debian环境:
len: 6
e80b5017098950fc58aad83c8c14978e
len: 48
eac9eaa9a4e5673c5d3773d7a3108c18
len: 64
73f83fa79e53e9415446c66802a0383f
gcc (Debian 4.4.5-8) 4.4.5
Python 2.6.6
Linux shuge-lab 2.6.26-2-686 #1 SMP Thu Nov 25 01:53:57 UTC 2010 i686 GNU/Linux
OpenSSL是从测试存储库安装的
MacOS环境:
len: 6
e80b5017098950fc58aad83c8c14978e
len: 48
eac9eaa9a4e5673c5d3773d7a3108c18
len: 64
73f83fa79e53e9415446c66802a0383f
gcc (Debian 4.4.5-8) 4.4.5
Python 2.6.6
Linux shuge-lab 2.6.26-2-686 #1 SMP Thu Nov 25 01:53:57 UTC 2010 i686 GNU/Linux
OpenSSL是从MacPort安装的
i686-apple-darwin10-gcc-4.2.1 (GCC) 4.2.1 (Apple Inc. build 5666) (dot 3)
Python 2.7.1
Darwin Lees-Box.local 10.7.0 Darwin Kernel Version 10.7.0: Sat Jan 29 15:17:16 PST 2011; root:xnu-1504.9.37~1/RELEASE_I386 i386
我认为您正为MD5结果分配字节,而没有结束
\0
。然后,您将计算内存块的MD5,该内存块以先前MD5计算的结果开始,但后面有一些随机字节。您应该为结果多分配一个字节,并将其设置为\0
我的建议:
openssl @1.0.0d (devel, security)
OpenSSL SSL/TLS cryptography library
您不会终止传递给
md5
的字符串('\0'
)
假设接受一个以'\0'
结尾的字符串,因为您没有将
长度)。代码
...
unsigned char * result1 = (unsigned char *)malloc(MD5_DIGEST_LENGTH + 1);
result1[MD5_DIGEST_LENGTH] = 0;
...
完全损坏:sizeof(strlen(i))
与
sizeof(size\u t)
,在典型机器上为4或8。但是你不想要这个
memset
无论如何。尝试将这些替换为:
memset( data, 0, sizeof( strlen( i ) ) );
memcpy( data, i, strlen( i ) );
或者更好:
strcpy( data, i );
,然后将i.c_str()
传递到md5
(并声明md5
以获取字符
const*
(我也会在md5()
中使用std::vector
,
然后让它返回它。unsigned\u to\u signed\u char
将接受
std::vector
和returnstd::string
)到目前为止,我认为答案似乎没有足够清楚地说明问题。具体而言,问题在于这行:
std::string i( "abcdef" );
您传入的数据块未被终止,因此更新调用可能会尝试处理MD5_DIGEST_长度缓冲区结尾以外的更多字节。简而言之,停止使用
strlen()
计算任意字节缓冲区的长度:您知道缓冲区应该有多长,所以请传递长度。您能在MD5_Init()和MD5_Update()之间打印strlen(in)
的结果吗这个代码是不是应该是C或C++的?这就是代码的结果。我认为MD5结果不是问题;它是一个数组的代码:>无符号char < /> >固定长度的二进制数据,他使用<代码> SaMPTF< <代码>转换为<代码> char const */COD>,它附加了<代码> 0”< />代码>。(但是对于二进制数据使用std::vector
,对于字符串使用std::string
)整个过程更简单更清晰。)James,长度是固定的,但对于strlen()
。我的建议是添加空终止符,但作者也可以为md5()添加第二个参数
具有该函数将计算的内存块长度的函数。