在通过管道传输时,如何在原始摘要哈希中保留最新的0?

2024-10-03 13:25:17 发布

您现在位置:Python中文网/ 问答频道 /正文

Python 2.7.9版

uname-a:Linux kali 4.0.0-kali1-amd64 #1 SMP Debian 4.0.4-1+kali2 (2015-06-03) x86_64 GNU/Linux

python代码:

#!/usr/bin/python

import hashlib
import base64

def f( msg ):
        print 'f():'
        print 'msg: ' + msg
        m = hashlib.md5()
        m.update( msg )
        print 'm.hexdigest(): ' + str( m.hexdigest() )
        print 'm.digest(): ' + str( m.digest() )
        b64 = base64.b64encode( m.digest() )
        print 'b64: ' + str( b64)

msg="hello"
f(msg)
msg='{"HelloId": 2}'
f(msg)
msg='{"HelloHelloId": 2}'
f(msg)

bash代码:

#!/bin/bash


f(){
echo 'f():'
msg="$@"
echo "msg: $msg"
md5="$(echo -n $msg | openssl dgst -md5 -binary)"
md5_hex="$(echo -n $msg | openssl dgst -md5 | awk '{print $2}')"
echo "m.hexdigest(): $md5_hex"
echo "m.digest(): $md5"
b64=$(echo -n "${md5}" | python -c 'import base64; import sys; print base64.b64encode( sys.stdin.read() ),')
echo "b64: $b64"
}

msg="hello"
f $msg
msg='{"HelloId": 2}'
f $msg
msg='{"HelloHelloId": 2}'
f $msg

似乎纯python是对的,它是哈希和中最新的0:

python输出:

$ python base64_test.py
f():
msg: hello
m.hexdigest(): 5d41402abc4b2a76b9719d911017c592
m.digest(): ]A@*�K*v�q��Œ
b64: XUFAKrxLKna5cZ2REBfFkg==
f():
msg: {"HelloId": 2}
m.hexdigest(): 7a6c4e0b7be519c95941fc0018581ae0
m.digest(): zlN
               {��YA�X�
b64: emxOC3vlGclZQfwAGFga4A==
f():
msg: {"HelloHelloId": 2}
m.hexdigest(): 72dc42e42036d7068010b2598780ab2d
m.digest(): r�B� 6���Y���-
b64: ctxC5CA21waAELJZh4CrLQ==

bash输出:

$ bash base64_test.sh
f():
msg: hello
m.hexdigest(): 5d41402abc4b2a76b9719d911017c592
m.digest(): ]A@*�K*v�q��Œ
b64: XUFAKrxLKna5cZ2REBfFkg==
f():
msg: {"HelloId": 2}
m.hexdigest(): 7a6c4e0b7be519c95941fc0018581ae0
m.digest(): zlN
               {��YA�X�
b64: emxOC3vlGclZQfwYWBrg
f():
msg: {"HelloHelloId": 2}
m.hexdigest(): 72dc42e42036d7068010b2598780ab2d
m.digest(): r�B� 6���Y���-
b64: ctxC5CA21waAELJZh4CrLQ==

看一看

  1. "hello"-两者相等

  2. '{"HelloId": 2}'-错误的最新base64。但是md5哈希的摘要是相等的

  3. '{"HelloHelloId": 2}'-再次相等

它不是空格或大写字母或其他类似的东西

似乎,它是第二个哈希...c0018581ae0中的最新0。如何保持这个0


Tags: importechobashhellolinuxmsgmd5print
1条回答
网友
1楼 · 发布于 2024-10-03 13:25:17

问题在于bash无法在变量中保留二进制null字符

简单地说,bash不能使用二进制文件

解决方案:

b64=$(echo -n $msg | openssl dgst -md5 -binary | python -c 'import base64; import sys; print base64.b64encode( sys.stdin.read() ),')

意味着,不需要将二进制存储在变量中,只需通过管道将其推送到end-base64输出

相关问题 更多 >