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

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

dgst指令用法介绍如下

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

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

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

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

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

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

4、HMAC的使用

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

[email protected]:~/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……

时间: 2024-08-28 06:55:12

openssl 摘要和签名验证指令dgst使用详解的相关文章

grep指令的运用详解

功能说明:查找文件里符合条件的字符串. 语 法:grep [-abcEFGhHilLnqrsvVwxy][-A<显示列数>][-B<显示列数>][-C<显示列数>][-d<进行动作>][-e<范本样式>][-f<范本文件>][--help][范本样式][文件或目录...] 补充说明:grep 指令用于查找内容包含指定的范本样式的文件,如果发现某文件的内容符合所指定的范本样式,预设grep指令会把含有范本样式的那一列显示出来.若不指定任

AngularJS指令进阶 -- ngModelController详解

大家都知道AngularJS中的指令是其尤为复杂的一个部分,但是这也是其比较好玩的地方.这篇文章我们就来说一说如何在我们自定义的指令中,利用ngModel的controller来做双向数据绑定,本文对大家学习AngularJS具有一定的参考借鉴价值,有需要的朋友们可以参考借鉴. 前言 在Angular应用中,ng-model指令时不可缺少的一个部分,它用来将视图绑定到数据,是双向绑定魔法中重要的一环.ngModelController则是ng-model指令中所定义的controller.这个c

AngularJS学习之指令命名规则详解

本文和大家分享的主要是AngularJS指令命名规则相关内容,一起来看看吧,希望对大家学习AngularJS有所帮助. 同一个AngularJS指令,在js文件和html文件中有着不同的命名规范:在js文件中使用标准的 小驼峰命名法 ,在html文件中使用"小写字母+连接符 "的命名法.如下表所示 在js文件中在html文件中 ngAppng-app myDirectivemy-directive 处理机制 AngularJS之所以选择这样的命名方式,是因为html文件不区分大小写,而

AT指令(中文详解版)(一)

一 . 一 般 命 令1.AT+CGMI      给出模块厂商的标识.2.AT+CGMM    获得模块标识.这个命令用来得到支持的频带(GSM 900,DCS 1800    或PCS 1900).当模块有多频带时,回应可能是不同频带的结合.3.AT+CGMR    获得模块的软件版本.4.AT+CGSN    获得 GSM  模块的 IMEI(国际移动设备标识)序列号.5.AT+CSCS    选择TE  特征设定.这个命令报告TE  用的是哪个状态设定上的 ME.ME于是可以转换每一个输

Linux 指令详解 df 检查文件系统的磁盘空间使用情况

指令:df 检查文件系统的磁盘空间使用情况 可以查看所有已挂载磁盘的总容量.使用空间.剩余空间.挂载位置等 语法:# df [OPTION] [FILE] FILE是一个或多个路径名的可选列表,如选择这项则显示文件所在的文件系统的磁盘使用情况 Ps: 1:所有用户均有使用df命令的权限 2:默认情况下以1KB为单位显示磁盘空间 3:默认显示当前所有被挂载的文件系统的可用空间 4:超级权限用户使用df命令时会发现某个分区的容量会超过100%,原因如下: Linux系统为超级用户保留了10%的空间.

详解OS X和iOS图像处理框架Core Image

转自:http://www.csdn.net/article/2015-02-13/2823961-core-image 摘要:本 文结合实例详解了OS X和iOS图像处理框架Core Image的使用,如何通过Core Image来创建和使用iOS的内置滤镜,非常适合初学者学习.虽然示例代码是用Swift写的iOS程序,不过实现概念很容易转换到 Objective-C和OS X. 这篇文章会为初学者介绍一下Core Image,一个OS X和iOS的图像处理框架. 如果你想跟着本文中的代码学习

09.openssl信息摘要和数字签名指令

9.1 信息摘要算法和数字签名 信息摘要算法是现代密码学算法中不可缺少的一部分,与对称算法和非对称加密算法不同,他不是一种可逆的操作,经过它进行处理的数据,输出数据长度一般来说总是固定的,并且理论上很难从输出恢复输入. 数字签名操作一般采用非对称算法(公开密钥算法),其实质是使用费对称加密算法密钥对的私钥对数据进行加密,而数字签名的验证操作则是使用公钥对数据进行解密操作,然后比较得到的原始文件跟解密得到的文件信息是否一致,如果一致,则认为数字签名有效,从而确认文件的有效性. 指令 指令功能描述

Linux的加密认证功能以及openssl详解

一.详细介绍加密.解密技术 现在的加密/解密技术主要有三种:对称加密,非对称加密,和单向加密 这三种加密解密技术的组合就是现在电子商务的基础,它们三个有各自最适合的领域,而且所要完成的功能也是不同的,大家都知道,只要我们连上互联网,那么我们就相当于大门洞开,我们的一些隐私,跟其他人对话内容等都有可能会被人窃听,最常见的比如man in the middle(中间人),它主要是因为双方身份无法验证的时候回话被劫持造成的,就是说通信双方都以为是在跟对方交流,其实内容都可能已经被这个“中间人”修改过,

使用OpenSSL做RSA签名验证 支付宝移动快捷支付 的server异步通知

因为业务须要.我们须要使用支付宝移动快捷支付做收款.支付宝给了我们<移动快捷支付应用集成接入包支付接口>见支付宝包<WS_SECURE_PAY_SDK>. 支付宝给的serverdemo仅仅有Java.C#.PHP三种,而我们server端使用的是C++. 这当中就涉及到接收支付宝的server异步通知.为了确保接收到的server异步通知来至支付宝,我们就必须验证支付宝的签名. 坑爹的是,原来PC端使用MD5做签名,预计支付宝考虑到移动端的风险更高,于是改用RSA做移动快捷支付应