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[]:ctrl() - FILE pointer
BIO[]:ctrl return
BIO[]:ctrl() - FILE pointer
BIO[]:ctrl return
BIO[]:read(,) - FILE pointer
BIO[]:read return
BIO[]:read(,) - FILE pointer
BIO[]:read return
SHA1(file.txt)= c994aec2a9007221a9b9113b8ab60a60144740c9
BIO[]:ctrl() - FILE pointer
BIO[]:ctrl return
BIO[]:Free - FILE pointer
/*指定-c -hex参数,以16进制打印结果*/
xlzh@cmos:~/test$ openssl dgst -sha1 -c -hex file.txt
SHA1(file.txt)= c9::ae:c2:a9::::a9:b9::3b:8a:b6:0a:::::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摘要算法,但是本实验证明使用其他摘要算法也可以签名验证。此处不明白,希望大牛指点……
4、HMAC的使用
MAC 消息认证码,构造方法可以基于hash,也可以基于对称加密算法,HMAC是基于hash的消息认证码。数据和密钥作为输入,摘要信息作为输出,常用于认证。
xlzh@cmos:~/test$ openssl dgst -sha256 -hmac 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 摘要和签名验证指令dgst使用详解的更多相关文章
- AngularJS指令进阶 – ngModelController详解
AngularJS指令进阶 – ngModelController详解 在自定义Angular指令时,其中有一个叫做require的字段,这个字段的作用是用于指令之间的相互交流.举个简单的例子,假如我 ...
- PHP 7中利用OpenSSL代替Mcrypt加解密的方法详解
php7.1发布后新特性吸引了不少PHPer,大家都在讨论新特性带来的好处与便利.但是从php7.0 升级到 php7.1 废弃(过时)了一个在过去普遍应用的扩展(mcrypt扩展).官方提供了相应的 ...
- AngularJS指令进阶 -- ngModelController详解
大家都知道AngularJS中的指令是其尤为复杂的一个部分,但是这也是其比较好玩的地方.这篇文章我们就来说一说如何在我们自定义的指令中,利用ngModel的controller来做双向数据绑定,本文对 ...
- Vue自定义指令使用方法详解 和 使用场景
Vue自定义指令的使用,具体内容如下 1.自定义指令的语法 Vue自定义指令语法如下: Vue.directive(id, definition) 传入的两个参数,id是指指令ID,definitio ...
- AT指令(中文详解版)(一)
一 . 一 般 命 令1.AT+CGMI 给出模块厂商的标识.2.AT+CGMM 获得模块标识.这个命令用来得到支持的频带(GSM 900,DCS 1800 或PCS 1900) ...
- 详解OS X和iOS图像处理框架Core Image
转自:http://www.csdn.net/article/2015-02-13/2823961-core-image 摘要:本 文结合实例详解了OS X和iOS图像处理框架Core Image的使 ...
- openssl详解
openssl详解 摘自:https://blog.csdn.net/liguangxianbin/article/details/79665100 目录 目录 第一章 前言 第二章 证书 第三章 加 ...
- [转载]OpenSSL中文手册之命令行详解(未完待续)
声明:OpenSSL之命令行详解是根据卢队长发布在https://blog.csdn.net/as3luyuan123/article/details/16105475的系列文章整理修改而成,我自己 ...
- Linux的加密认证功能以及openssl详解
一.详细介绍加密.解密技术 现在的加密/解密技术主要有三种:对称加密,非对称加密,和单向加密 这三种加密解密技术的组合就是现在电子商务的基础,它们三个有各自最适合的领域,而且所要完成的功能也是不同的, ...
随机推荐
- rpm软件包类型
rpm软件包 在linux世界里有两种流行的包管理方式,分别是redhat系的rpm和debian系的deb.其中rpm是RedHat Package Manager(RedHat软件包管理工具)的简 ...
- Combo( 自定义下拉框) 组件
本节课重点了解 EasyUI 中 Combo(自定义下拉框)组件的使用方法,这个组件依赖于ValidateBox(验证框)组件 一. 加载方式自定义下拉框不能通过标签的方式进行创建.<input ...
- 简单实用 “易忘” 的SQL 语句语法,新老皆宜
--创建数据库 create database 数据库名 on primary ( name='数据库名_data', filename='数据库储存路径', size=数据库初始大小(MB), ...
- Nginx的安装及反向代理设置
因为项目的缘故,接触到了Nginx的安装和反向代理设置,和大家分享下. 一.Nginx的下载.安装cd /homewget http://nginx.org/download/nginx-1.0.5. ...
- AngularJS指令的作用域
参考文章:https://segmentfault.com/a/1190000002773689
- CSS3控制元素排列
需求: 将改变为. 代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset=& ...
- C语言基础学习基本数据类型-int类型与int变量
int类型与int变量 针对不同的用途,C语言提供了多种整数类型.各种整数类型的区别在于所提供数值的范围,以及数值是否可以取负值. 在之前的实例中你已经看到过,int关键字用于声明整型变量. int类 ...
- python construct文档
The Basics Fields Fields are the most fundamental unit of construction: they parse (read data from t ...
- vector容器
vector<int> ivec; vector<Sales_item> Sales_vec; 和其他变量定义一样,定义 vector 对象要指定类型和一个变量的列表.上 面的 ...
- AFNetworking 2.0 新特性讲解之AFHTTPSessionManager
AFNetworking 2.0 新特性讲解之AFHTTPSessionManager (2014-02-17 11:56:24) 转载▼ AFNetworking 2.0 相比1.0 API ...