open dgst命令的主要功能是,计算信息摘要(哈希), 给文件生成数字签名以及验证数字签名。
信息摘要算法的特点是:
1,输出数据定长, 即任意长度的输入数据,经过摘要算法都会得到订场的输出数据。
2,不可逆行, 由输出数据不能得到输入数据。
3,防碰撞, 对同一摘要算法, 输入数据不同,输出结果不同。 碰撞性有一定的概率,这也是衡量摘要算法的一个维度。
4,均匀分布, 输出结果尽量保持均匀分布,这也是衡量摘要算法的一个方面
数字签名的生成和验证
原数据可以是明文,也可以是密文
E() 代表非对称加密的加密算法 和 公钥配合使用, 公钥作为E()的参数
D() 代表非对称加密的解密算法 和 私钥配合使用, 私钥作为D()的参数
私钥 SK
公钥 PK
E(PK,D(SK,stuff)) = D(SK,E(PK,stuff)) = stuff
数字签名生成:客户端
摘要算法 D(SK)
原数据----------------> 信息摘要 ------------> 数字签名
数字签名验证:服务端, 分别从原数据使用摘要算法计算信息摘要, 使用公钥根据数字签名推到出信息摘要,
两者进行对比,如果过一致有两种可能 1, 数据传输出错 2,数据被篡改
摘要算法
原数据----------------> 信息摘要
E(PK)
数据签名--------------> 信息摘要
openssl dgst 命令:
主要选项:
-out filename #指定输出文件,默认标准输出
-sign file #执行签名操作,后面指定私钥文件
-verify file #执行验证操作,后面指定公钥文件,与prverfify不能同时使用
-prverify file #执行验证操作,后面指定密钥文件,与verfify不能同时使用
-d #输出BIO调试信息
-binary #输出二进制结果
-signature file #指定签名文件,在验证签名时使用
-md4 #摘要算法使用md4
-md5 #摘要算法使用md5
-ripemd160 #摘要算法使用ripemd160
-sha #摘要算法使用sha
-sha1 #摘要算法使用sha1
-sha224 #摘要算法使用sha223
-sha256 #摘要算法使用sha256
-sha384 #摘要算法使用sha384
-sha512 #摘要算法使用sha512
-whirlpool #摘要算法使用whirlpool
#使用openssl dgst仅仅做哈希(摘要),不做数字签名
openssl dgst -sha1 ./plain.txt
#摘要算法选取sha256,密钥RSA密钥,对file.txt进行签名*/
openssl dgst -sign rsa.key -sha256 -out sign.txt file.txt
#使用RSA密钥验证签名(prverify参数),验证成功
openssl dgst -prverify rsa.key -sha256 -signature sign.txt file.txt
#从密钥中提取公钥
openssl rsa -in rsa.key -out pub.key -pubout
#使用RSA公钥验证签名(verify参数),验证成功
openssl dgst -verify pub.key -sha256 -signature sign.txt file.txt
#HMAC的使用, MAC 消息认证码,构造方法可以基于hash,也可以基于对称加密算法,
#HMAC是基于hash的消息认证码。数据和密钥作为输入,摘要信息作为输出,常用于认证。
openssl dgst -sha256 -hmac 123456 file.txt
例如用户登录服务器
1、服务器给客户端发送一个随机数123456
2、客户端使用随机数作为密钥和用户密码做HMAC,结果发送给服务器
3、服务器去除存储的用户密码,也是用随机数与用户密码做HMAC,根据HMAC结果是否一样确认用户身份。
具体的HMAC算法,可以参考以下描述
1、HMAC概述
HMAC算法首先它是基于信息摘要算法的。目前主要集合了MD和SHA两大系列消息摘要算法。其中MD系列的算法有HmacMD2、HmacMD4、HmacMD5三种算法;SHA系列的算法有HmacSHA1、HmacSHA224、HmacSHA256、HmacSHA384、HmacSHA512五种算法。
HMAC算法除了需要信息摘要算法外,还需要一个密钥。HMAC的密钥可以是任何长度,如果密钥的长度超过了摘要算法信息分组的长度,则首先使用摘要算法计算密钥的摘要作为新的密钥。一般不建议使用太短的密钥,因为密钥的长度与安全强度是相关的。通常选取密钥长度不小于所选用摘要算法输出的信息摘要的长度。
2、HMAC算法分析
HMAC算法本身并不复杂,起需要有一个哈希函数,我们记为H。同时还需要有一个密钥,我们记为K。每种信息摘要函数都对信息进行分组,每个信息块的长度是固定的,我们记为B(如:SHA1为512位,即64字节)。每种信息摘要算法都会输出一个固定长度的信息摘要,我们将信息摘要的长度记为L(如MD5为16字节,SHA-1为20个字节)。正如前面所述,K的长度理论上是任意的,一般为了安全强度考虑,选取不小于L的长度。
HMAC算法其实就是利用密钥和明文进行两轮哈希运算,以公式可以表示如下:
HMAC(K,M)=H(K⊕opad∣H(K⊕ipad∣M)),其中:
Ipad为0x36重复B次
Opad为0x5c重复B次
M 代表一个消息输入
根据上面的算法表示公式,我们可以描述HMAC算法的运算步骤:
(1)检查密钥K的长度。如果K的长度大于B则先使用摘要算法计算出一个长度为L的新密钥。如果后K的长度小于B,则在其后面追加0来使其长度达到B。
(2)将上一步生成的B字长的密钥字符串与ipad做异或运算。
(3)将需要处理的数据流text填充至第二步的结果字符串中。
(4)使用哈希函数H计算上一步中生成的数据流的信息摘要值。
(5)将第一步生成的B字长密钥字符串与opad做异或运算。
(6)再将第四步得到的结果填充到第五步的结果之后。
(7)使用哈希函数H计算上一步中生成的数据流的信息摘要值,输出结果就是最终的HMAC值。
由上述描述过程,我们知道HMAC算法的计算过程实际是对原文做了两次类似于加盐处理的哈希过程。