消息摘要可以对任意长度的消息产生固定长度(16或20个字节)的信息摘要,理论基于单向HASH函数,根据消息摘要无法恢复出原文,所以是安全的;消息原文和消息摘要是一一对应的,所以又被称作指纹。
dgst, md5, md4, md2, sha1, sha, mdc2, ripemd160 - message digests
openssl可以通过标准命令dgst或直接调用消息摘要,例如
E:\OpenSSL\foo>openssl dgst -md5 a.txt
MD5(a.txt)= 6049d6013872759678435a04b1e0c4c0
E:\OpenSSL\foo>openssl md5 a.txt
MD5(a.txt)= 6049d6013872759678435a04b1e0c4c0
md5的结果是16个字节,“6049d6013872759678435a04b1e0c4c0”是16进制的表示方法,也可以使用二进制。
openssl dgst[-md5|-md4|-md2|-sha1|-sha|-mdc2|-ripemd160|-dss1] [-c] [-d] [-hex] [-binary] [-out filename] [-sign filename] [-keyform arg] [-passin arg] [-verify filename] [-prverify filename] [-signature filename] [-hmac key] [file...]
[md5|md4|md2|sha1|sha|mdc2|ripemd160] [-c] [-d] [file...]
-c 分号(colons),16进制(HEX)表示方法中,在每个字节(每两个16进制数字)之间加入一个分号。E:\OpenSSL\foo>openssl dgst -md5 -c a.txt
MD5(a.txt)= 60:49:d6:01:38:72:75:96:78:43:5a:04:b1:e0:c4:c0
-binary 输出结果是二进制
E:\OpenSSL\foo>openssl dgst -md5 -binary a.txt
`I?8ru杧CZ编睦
E:\OpenSSL\foo>openssl dgst -md5 -binary -out md5.binary a.txt
E:\OpenSSL\foo>xxd md5.binary
0000000: 6049 d601 3872 7596 7843 5a04 b1e0 c4c0 `I..8ru.xCZ.....
-hmac key 消息认证码(Message Authorization Code),生成消息摘要的同时,又使用key进行了加密(我也不知道是什么算法@_@)
E:\OpenSSL\foo>openssl dgst -hmac "123" -md5 a.txt
HMAC-MD5(a.txt)= 5548903c81f04ec99afd4a73dd460d44
E:\OpenSSL\foo>openssl dgst -md5 -sign rsa_pri.pem -out signed_md5.binary a.txt
E:\OpenSSL\foo>openssl dgst -md5 -verify rsa_pub.pem -signature signed_md5.binary a.txt
Verified OK
rsa私钥文件rsa_pri.pem的产生
E:\OpenSSL\foo>openssl genrsa -out rsa_pri.pem 1024
Loading 'screen' into random state - done
Generating RSA private key, 1024 bit long modulus
..........++++++
..............................................++++++
e is 65537 (0x10001)
E:\OpenSSL\foo>openssl rsa -in rsa_pri.pem -out rsa_pub.pem -pubout
writing RSA key
E:\OpenSSL\foo>openssl dgst -md5 -prverify rsa_pri.pem -signature signed_md5.binary a.txt
Verified OK
算法介绍
openssl 手册也介绍,除非为了兼容性考虑,新的应用程序应使用sha1消息摘要算法。
md5 产生16字节数据
sha1产生20字节数据
E:\OpenSSL\foo>openssl dgst -sha a.txt
SHA(a.txt)= efe6be521da0e06fcc940fde11decc3c5ce8a13a
E:\OpenSSL\foo>openssl dgst -sha1 a.txt
SHA1(a.txt)= 3b7ef90a7908a832dc925e2941329d8c16912928
E:\OpenSSL\foo>openssl dgst -ripemd160 a.txt
RIPEMD160(a.txt)= d82ad8351eda617af7c24c23189b4ef52c2697c0
E:\OpenSSL\foo>openssl dgst -md5 a.txt
MD5(a.txt)= 6049d6013872759678435a04b1e0c4c0