openssl 摘要和签名验证指令dgst使用详解

1、信息摘要和数字签名概述

信息摘要:对数据进行处理,得到一段固定长度的结果,其特点输入:

1,输出长度固定。即输出长度和输入长度无关。

2,不可逆。即由输出数据理论上不能推导出输入数据

如图4所示,对输入数据敏感。当输入数据变化极小时,输出数据也会发生明显的变化

5,防碰撞。即不同的数据数据得到相同输出数据的可能性极低。

由于信息摘要有上述特点,一般保证数据的完整性,对一个大文件进行摘要运算,得到其摘要值。通过网络或者其他渠道传输后,通过验证其摘要值,确定大文件本身有没有发生变化。

数字签名:数字签名其实分成两步,首先对原始文件进行摘要运算,得到摘要值,然后使用公开密钥算法中的私钥对摘要值进行加密其签名和验证过程如下图所示

有数字签名的过程可以知道,对发送信息进行数字签名,可以保证数字签名的完整性,真实性,不可抵赖性。即接收者可以确认消息的来源,消息的真实,发送者不可以抵赖自己发送的消息,与现实生活中签名的作用大致相同。

2,摘要算法和数字签名相关指令及用法

目前openssl提供的摘要算法有md4,md5,ripemd160,sha,sha1,sha224,sha256,sha512,sha384,wirlpool。可以通过openssl dgst - 命令查看。

上面我们已经提到了,数字签名分为摘要和加密两部分。在openssl提供的指令中,并没有区分两者。而是在摘要算法指令中包含了签名和校验参数。例如我们适用openssl md5 - 命令可以看到它提供的选项有签名和验证等参数。

在OpenSSL的中单独使用摘要算法指令完成摘要或者签名操作,也可以通过DGST完成相同的操作。在签名的时候多数使用RSA私钥或者DSA私钥,当使用RSA私钥的时候,我们可以使用单独的摘要算法指令指定摘要算法进行签名,但当使用DSA使用签名的时候,就必须使用DGST指令,因为使用DSA签名的时候必须使用DSA自身的摘要算法,而OpenSSL的没有为它提供相应的指令。

/*有明文文件file.txt和RSA密钥RSA.pem*/
xlzh@cmos:~/test$ ls
file.txt  RSA.pem
/*使用md5指令指定sha1算法,对file.txt进行签名,生成签名文件sign1.txt*/
xlzh@cmos:~/test$ openssl md5 -sha1 -sign RSA.pem -out sign1.txt file.txt
/*使用md5指令指定sha1算法,对file.txt进行签名,生成签名文件sign1.txt*/
xlzh@cmos:~/test$ openssl dgst -sha1 -sign RSA.pem -out sign2.txt file.txt
/*两个签名文件一样,说明两个指令完成相同的功能*/
xlzh@cmos:~/test$ diff sign1.txt sign2.txt

可以看到MD5和DGST完成相同的功能。不过让人纠结的是使用MD5进行签名的时候可以指定其他摘要算法,笔者觉得太别扭了。所以建议做摘要和签名验证时使用DGST指令,忘记其他... ...

DGST指令用法介绍如下

xlzh@cmos:~/test$ openssl dgst -
unknown option '-'
options are
-c              to output the digest with separating colons        //输出的摘要信息以分号隔离,和-hex同时使用
-r              to output the digest in coreutils format           //指定输出的格式
-d              to output debug info                               //输出BIO调试信息
-hex            output as hex dump                                 //以16进制打印输出结果
-binary         output in binary form                              //输出二进制结果
-hmac arg       set the HMAC key to arg                            //指定hmac的key
-non-fips-allow allow use of non FIPS digest                       //允许使用不符合fips标准的摘要算法
-sign   file    sign digest using private key in file              //执行签名操作,后面指定私钥文件
-verify file    verify a signature using public key in file        //执行验证操作,后面指定公钥文件,与prverfify不能同时使用
-prverify file  verify a signature using private key in file       //执行验证操作,后面指定密钥文件,与verfify不能同时使用
-keyform arg    key file format (PEM or ENGINE)                    //指定密钥文件格式,pem或者engine
-out filename   output to filename rather than stdout              //指定输出文件,默认标准输出
-signature file signature to verify                                //指定签名文件,在验证签名时使用
-sigopt nm:v    signature parameter                                //签名参数
-hmac key       create hashed MAC with key                         //制作一个hmac 使用key
-mac algorithm  create MAC (not neccessarily HMAC)                 //制作一个mac
-macopt nm:v    MAC algorithm parameters or key                    //mac算法参数或者key
-engine e       use engine e, possibly a hardware device.          //使用硬件或者三方加密库
-md4            to use the md4 message digest algorithm            //摘要算法使用md4
-md5            to use the md5 message digest algorithm            //摘要算法使用md5
-ripemd160      to use the ripemd160 message digest algorithm      //摘要算法使用ripemd160
-sha            to use the sha message digest algorithm            //摘要算法使用sha
-sha1           to use the sha1 message digest algorithm           //摘要算法使用sha1
-sha224         to use the sha224 message digest algorithm         //摘要算法使用sha223
-sha256         to use the sha256 message digest algorithm         //摘要算法使用sha256
-sha384         to use the sha384 message digest algorithm         //摘要算法使用sha384
-sha512         to use the sha512 message digest algorithm         //摘要算法使用sha512
-whirlpool      to use the whirlpool message digest algorithm      //摘要算法使用whirlpool

3,DGST使用示例

如图1所示,仅做摘要运算而不做签名操作

/*对file.txt文件使用sha1算法进行hash运算*/
xlzh@cmos:~/test$ openssl dgst -sha1 file.txt 
SHA1(file.txt)= c994aec2a9007221a9b9113b8ab60a60144740c9
/*指定–non-fips-allow参数,与fips标准有关,尚待研究*/
xlzh@cmos:~/test$ openssl dgst –sha1 –non-fips-allow file.txt 
SHA1(file.txt)= c994aec2a9007221a9b9113b8ab60a60144740c9 
/*指定-d参数,打印调试消息*/
xlzh@cmos:~/test$ openssl dgst -sha1 -d file.txt 
BIO[02469910]:ctrl(6) - FILE pointer
BIO[02469910]:ctrl return 0
BIO[02469910]:ctrl(108) - FILE pointer
BIO[02469910]:ctrl return 1
BIO[02469910]:read(0,8192) - FILE pointer
BIO[02469910]:read return 37
BIO[02469910]:read(0,8192) - FILE pointer
BIO[02469910]:read return 0
SHA1(file.txt)= c994aec2a9007221a9b9113b8ab60a60144740c9
BIO[02469910]:ctrl(1) - FILE pointer
BIO[02469910]:ctrl return 0
BIO[02469910]:Free - FILE pointer
/*指定-c -hex参数,以16进制打印结果*/
xlzh@cmos:~/test$ openssl dgst -sha1 -c -hex file.txt 
SHA1(file.txt)= c9:94:ae:c2:a9:00:72:21:a9:b9:11:3b:8a:b6:0a:60:14:47:40:c9
/*指定-r参数,输出结果如下所示,然并卵……*/
xlzh@cmos:~/test$ openssl dgst -sha1 -r file.txt 
c994aec2a9007221a9b9113b8ab60a60144740c9 *file.txt
/*指定-binary参数,输入结果为二进制*/
xlzh@cmos:~/test$ openssl dgst -sha1 -binary file.txt 
ɔ�©r!��;��
`G@xlzh@cmos:~/test$

2,使用RSA密钥进行签名验证操作

/*摘要算法选取sha256,密钥RSA密钥,对file.txt进行签名*/
xlzh@cmos:~/test$ openssl dgst -sign RSA.pem -sha256 -out sign.txt file.txt
/*使用RSA密钥验证签名(prverify参数),验证成功*/ 
xlzh@cmos:~/test$ openssl dgst -prverify RSA.pem -sha256 -signature sign.txt file.txt 
Verified OKt 
/*从密钥中提取公钥*/
xlzh@cmos:~/test$ openssl rsa -in RSA.pem -out pub.pem -pubout
writing RSA key
/*使用RSA公钥验证签名(verify参数),验证成功*/
xlzh@cmos:~/test$ openssl dgst -verify pub.pem -sha256 -signature sign.txt file.txt 
Verified OK

3,使用DSA密钥进行签名验证操作

/*使用DSA算法,摘要算法sha256,对file.txt进行签名*/
xlzh@cmos:~/test$ openssl dgst -sign DSA.pem -sha256 -out sign.txt file.txt 
/*使用DSA密钥验证签名*/
xlzh@cmos:~/test$ openssl dgst -prverify DSA.pem -sha256 -signature sign.txt file.txt
Verified OK
/*使用DSA算法,摘要算法dss1,对file.txt进行签名*/
xlzh@cmos:~/test$ openssl dgst -sign DSA.pem -dss1 -out sign1.txt file.txt 
/*使用DSA密钥验证签名*/
xlzh@cmos:~/test$ openssl dgst -prverify DSA.pem -dss1 -signature sign1.txt file.txt
Verified OK
/*提取公钥*/
xlzh@cmos:~/test$ openssl dsa -in DSA.pem -out pub.pem -pubout
read DSA key
writing DSA key
/*使用DSA公钥验证签名*/
xlzh@cmos:~/test$ openssl dgst -verify pub.pem -dss1 -signature sign1.txt file.txt 
Verified OK
/*使用DSA公钥验证签名*/
xlzh@cmos:~/test$ openssl dgst -verify pub.pem -sha256 -signature sign.txt file.txt 
Verified OK
xlzh@cmos:~/test$

根据dgst man手册的定义,如果使用DSA算法进行签名验证,必须使用dss1摘要算法,但是本实验证明使用其他摘要算法也可以签名验证。此处不明白,希望大牛指点......

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值