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

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

483次阅读
没有评论

共计 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、短信等云产品特惠热卖中

星哥玩云

星哥玩云
星哥玩云
分享互联网知识
用户数
4
文章数
19351
评论数
4
阅读量
7997362
文章搜索
热门文章
星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛 NAS-6:抖音视频同步工具,视频下载自动下载保存 前言 各位玩 NAS 的朋友好,我是星哥!...
星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛 NAS-3:安装飞牛 NAS 后的很有必要的操作 前言 如果你已经有了飞牛 NAS 系统,之前...
我把用了20年的360安全卫士卸载了

我把用了20年的360安全卫士卸载了

我把用了 20 年的 360 安全卫士卸载了 是的,正如标题你看到的。 原因 偷摸安装自家的软件 莫名其妙安装...
再见zabbix!轻量级自建服务器监控神器在Linux 的完整部署指南

再见zabbix!轻量级自建服务器监控神器在Linux 的完整部署指南

再见 zabbix!轻量级自建服务器监控神器在 Linux 的完整部署指南 在日常运维中,服务器监控是绕不开的...
飞牛NAS中安装Navidrome音乐文件中文标签乱码问题解决、安装FntermX终端

飞牛NAS中安装Navidrome音乐文件中文标签乱码问题解决、安装FntermX终端

飞牛 NAS 中安装 Navidrome 音乐文件中文标签乱码问题解决、安装 FntermX 终端 问题背景 ...
阿里云CDN
阿里云CDN-提高用户访问的响应速度和成功率
随机文章
安装Black群晖DSM7.2系统安装教程(在Vmware虚拟机中、实体机均可)!

安装Black群晖DSM7.2系统安装教程(在Vmware虚拟机中、实体机均可)!

安装 Black 群晖 DSM7.2 系统安装教程(在 Vmware 虚拟机中、实体机均可)! 前言 大家好,...
星哥带你玩飞牛NAS-4:飞牛NAS安装istore旁路由,家庭网络升级的最佳实践

星哥带你玩飞牛NAS-4:飞牛NAS安装istore旁路由,家庭网络升级的最佳实践

星哥带你玩飞牛 NAS-4:飞牛 NAS 安装 istore 旁路由,家庭网络升级的最佳实践 开始 大家好我是...
星哥带你玩飞牛NAS-8:有了NAS你可以干什么?软件汇总篇

星哥带你玩飞牛NAS-8:有了NAS你可以干什么?软件汇总篇

星哥带你玩飞牛 NAS-8:有了 NAS 你可以干什么?软件汇总篇 前言 哈喽各位玩友!我是是星哥,不少朋友私...
颠覆 AI 开发效率!开源工具一站式管控 30+大模型ApiKey,秘钥付费+负载均衡全搞定

颠覆 AI 开发效率!开源工具一站式管控 30+大模型ApiKey,秘钥付费+负载均衡全搞定

  颠覆 AI 开发效率!开源工具一站式管控 30+ 大模型 ApiKey,秘钥付费 + 负载均衡全...
让微信公众号成为 AI 智能体:从内容沉淀到智能问答的一次升级

让微信公众号成为 AI 智能体:从内容沉淀到智能问答的一次升级

让微信公众号成为 AI 智能体:从内容沉淀到智能问答的一次升级 大家好,我是星哥,之前写了一篇文章 自己手撸一...

免费图片视频管理工具让灵感库告别混乱

一言一句话
-「
手气不错
多服务器管理神器 Nexterm 横空出世!NAS/Win/Linux 通吃,SSH/VNC/RDP 一站式搞定

多服务器管理神器 Nexterm 横空出世!NAS/Win/Linux 通吃,SSH/VNC/RDP 一站式搞定

多服务器管理神器 Nexterm 横空出世!NAS/Win/Linux 通吃,SSH/VNC/RDP 一站式搞...
颠覆 AI 开发效率!开源工具一站式管控 30+大模型ApiKey,秘钥付费+负载均衡全搞定

颠覆 AI 开发效率!开源工具一站式管控 30+大模型ApiKey,秘钥付费+负载均衡全搞定

  颠覆 AI 开发效率!开源工具一站式管控 30+ 大模型 ApiKey,秘钥付费 + 负载均衡全...
星哥带你玩飞牛NAS-16:飞牛云NAS换桌面,fndesk图标管理神器上线!

星哥带你玩飞牛NAS-16:飞牛云NAS换桌面,fndesk图标管理神器上线!

  星哥带你玩飞牛 NAS-16:飞牛云 NAS 换桌面,fndesk 图标管理神器上线! 引言 哈...
150元打造低成本NAS小钢炮,捡一块3865U工控板

150元打造低成本NAS小钢炮,捡一块3865U工控板

150 元打造低成本 NAS 小钢炮,捡一块 3865U 工控板 一块二手的熊猫 B3 工控板 3865U,搭...
一句话生成拓扑图!AI+Draw.io 封神开源组合,工具让你的效率爆炸

一句话生成拓扑图!AI+Draw.io 封神开源组合,工具让你的效率爆炸

一句话生成拓扑图!AI+Draw.io 封神开源组合,工具让你的效率爆炸 前言 作为天天跟架构图、拓扑图死磕的...