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



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

bash无法将二进制null字符保存在变量中。

很简单,bash不能使用二进制文件。

解决方案:

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

表示,不需要在变量中存储二进制,只需将其通过管道推到末端- base64-output。

相关内容

最新更新