阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

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

250次阅读
没有评论

共计 6564 个字符,预计需要花费 17 分钟才能阅读完成。

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

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

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

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

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

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

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

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

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

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

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*/
linuxidc@linuxidc:
~/test$ ls file.txt RSA.pem/*使用 md5 指令指定 sha1 算法,对 file.txt 进行签名,生成签名文件 sign1.txt*/
linuxidc@linuxidc:
~/test$ openssl md5 -sha1 -sign RSA.pem –out sign1.txt file.txt
/*使用 md5 指令指定 sha1 算法,对 file.txt 进行签名,生成签名文件 sign1.txt*/
linuxidc@linuxidc:
~/test$ openssl dgst -sha1 -sign RSA.pem –out sign2.txt file.txt
/*两个签名文件一样,说明两个指令完成相同的功能*/
linuxidc@linuxidc:
~/test$ diff sign1.txt sign2.txt

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

dgst 指令用法介绍如下

linuxidc@linuxidc:~/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 运算*/
linuxidc@linuxidc:
~/test$ openssl dgst –sha1 file.txt
SHA1(file.txt)
= c994aec2a9007221a9b9113b8ab60a60144740c9
/* 指定–non-fips-allow 参数,与 fips 标准有关,尚待研究*/
linuxidc@linuxidc:~/test$ openssl dgst –sha1 –non-fips-allow file.txt 
SHA1(file.txt)= c994aec2a9007221a9b9113b8ab60a60144740c9 
/*指定 - d 参数, 打印调试消息*/
linuxidc@linuxidc:~/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 进制打印结果*/
linuxidc@linuxidc:~/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 参数,输出结果如下所示,然并卵……*/
linuxidc@linuxidc:~/test$ openssl dgst -sha1 -r file.txt 
c994aec2a9007221a9b9113b8ab60a60144740c9 *file.txt
/*指定 -binary 参数,输入结果为二进制*/
linuxidc@linuxidc:~/test$ openssl dgst -sha1 -binary file.txt 
ɔ�©r!��;��
`G@linuxidc@linuxidc:~/test$

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

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

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

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

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

4、HMAC 的使用

MAC 消息认证码,构造方法可以基于 hash,也可以基于对称加密算法,HMAC 是基于 hash 的消息认证码。数据和密钥作为输入,摘要信息作为输出,常用于认证。

linuxidc@linuxidc:~/test$ openssl dgst  -sha256 -hmac 123456  file.txt 
HMAC-SHA256(file.txt)= b8e92990b9fc2ac9b58fde06f4738dceb4fb1fc47b4d2234a9c3f152907b333a

例如用户登录服务器

1、服务器给客户端发送一个随机数

2、客户端使用随机数作为密钥和用户密码做 HMAC,结果发送给服务器

3、服务器去除存储的用户密码,也是用随机数与用户密码做 HMAC,根据 HMAC 结果是否一样确认用户身份。

4、遗留问题

dgst 中 sigopt、mac、macopt 参数的含义即使用方法,因为 doc 都没给出具体例子,待研究 openssl 源码后进行补充

为什么使用 DSA 签名的时候可以选择其他 hash 算法(man 手册说只能使用 dss1)

还有 dgst 的 hmac 和 hmac 参数,没错,你没看错,它的确提供了两个完全一样的参数,给出的解释还不一样,还是研究源码去吧.

可恶的 openssl……

更多 OpenSSL 相关内容可以查看以下的有用链接

使用 OpenSSL 命令行构建 CA 及证书  http://www.linuxidc.com/Linux/2015-10/124682.htm

Ubuntu 安装 OpenSSL  http://www.linuxidc.com/Linux/2015-10/124001.htm

通过 OpenSSL 提供 FTP+SSL/TLS 认证功能,并实现安全数据传输 http://www.linuxidc.com/Linux/2013-05/84986.htm

Linux 下使用 OpenSSL 生成证书 http://www.linuxidc.com/Linux/2015-05/117034.htm

利用 OpenSSL 签署多域名证书 http://www.linuxidc.com/Linux/2014-10/108222.htm

在 OpenSSL 中添加自定义加密算法  http://www.linuxidc.com/Linux/2015-08/121749.htm

OpenSSL 的详细介绍:请点这里
OpenSSL 的下载地址
:请点这里

本文永久更新链接地址:http://www.linuxidc.com/Linux/2016-04/130492.htm

正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-21发表,共计6564字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中