java openssl dgst_(7) openssl dgst(生成和验证数字签名)

该伪命令是单向加密工具,用于生成文件的摘要信息

也可以进行数字签名,及验证数字签名。

首先要明白的是,数字签名的过程是计算出摘要信息,然后使用私钥对摘要信息进行加密得到数字签名,而摘要是使用md5、sha512等单向散列算法计算得出的(而通过私钥加密摘要信息得到数字签名),理解了这一点,openssl dgst命令的用法就完全掌握了。

openssl dgst [-md5|-sha1|...] [-hex | -binary] [-out filename] [-sign filename] [-passin arg] [-verify filename] [-prverify filename] [-signature filename]   [file...]

选项说明:

file...                       :指定待(数字)签名的文件。

-hex                        :以hex格式输出摘要信息。如果不以-hex显示,签名或验证签名时很可能乱码。

-binary                    :以二进制格式输出摘要信息,或以二进制格式进行数字签名。这是默认格式。

-out filename          :指定输出文件,若不指定则输出到标准输出。

-sign filename         :使用私钥filename对file数字签名。签名时绝对不能加-hex等格式的选项,否则验证签名失败

-signature filename :指定待验证的签名文件(验证数字签名时使用)。

-verify filename        :使用公钥filename验证数字签名(验证数字签名时使用)。

-prverify filename     :使用私钥filename验证数字签名(验证数字签名时使用)。

-passin arg               :传递解密密码。若验证签名时使用的公钥或私钥文件是被加密过的,则需要传递密码来解密。

支持如下几种单向加密算法,即信息摘要算法

-md4            to use the md4 message digest algorithm

-md5            to use the md5 message digest algorithm

-ripemd160      to use the ripemd160 message digest algorithm

-sha            to use the sha message digest algorithm

-sha1           to use the sha1 message digest algorithm

-sha224         to use the sha224 message digest algorithm

-sha256         to use the sha256 message digest algorithm

-sha384         to use the sha384 message digest algorithm

-sha512         to use the sha512 message digest algorithm

-whirlpool      to use the whirlpool message digest algorithm

注意:openssl dgst -md5和openssl md5的作用是一样的,其他单向加密算法也一样,例如openssl dgst -sha等价于openssl sha。

例如:

(1).随机生成一段摘要信息(即单向加密)

[root@docker121 ssl]# echo "123456"|openssl md5

(stdin)= f447b20a7fcbf53a5d5be013ea0b15af

(2).对/tmp/a.txt文件生成MD5和sha512摘要信息。

[root@docker121 ssl]# openssl dgst -md5 /tmp/a.txt

MD5(/tmp/a.txt)= f447b20a7fcbf53a5d5be013ea0b15af

[root@docker121 ssl]# openssl md5 /tmp/a.txt

MD5(/tmp/a.txt)= f447b20a7fcbf53a5d5be013ea0b15af

[root@docker121 ssl]# openssl dgst sha512 /tmp/a.txt

[root@docker121 ssl]# openssl dgst -sha512 /tmp/a.txt

SHA512(/tmp/a.txt)= 1caced6fca2237153d65adfb0f3dbe33b9375e9eb6df17c379f80cd37deb6e6a70159c7e898576db568b871ca1c2ffd1a2cc3205f1b50be5396096335fc29c40

[root@docker121 ssl]# openssl sha512 /tmp/a.txt

SHA512(/tmp/a.txt)= 1caced6fca2237153d65adfb0f3dbe33b9375e9eb6df17c379f80cd37deb6e6a70159c7e898576db568b871ca1c2ffd1a2cc3205f1b50be5396096335fc29c40

(3).生成一个私钥,然后使用该私钥对/tmp/a.txt文件签名。使用-hex选项,否则默认输出格式为二进制会乱码。

[root@docker121 ssl]# openssl genrsa -out private.pem

Generating RSA private key, 2048 bit long modulus

............................+++

...............+++

e is 65537 (0x10001)

[root@docker121 ssl]# openssl dgst -md5 -hex -sign private.pem /tmp/a.txt

RSA-MD5(/tmp/a.txt)= 2bccbdc6eafd75408063fef47aaaf7cd5d304911193250dec88a03185a7e59823e7fc18617bc00334f7310fac7ad12be574ebe14c67a3fee243082daff4cd831cbdb38378f995d8982a55a9093d149f117d5783721d8674ab77f08fd3df5eb6cbacbb7dbea88c2c284c552b622d1291cbaf7fe6190182f264c2a5ba964755cff160f81d66f19cfbc787004ecafede12f56bf357a0130ca9e63f8905aa314ca530d0f4c8a71d3283363033f9c93280dbcbaf2f959540cc8ba9e067676938f6d848032b9da21673877da6c444118b09444c431a67bd6122979b2f4fe43610ba1edf273e428e2fb3aef6cbd2b0f1a7fcb9784f03d59ce6101d0c191450b6a2206b3

[root@docker121 ssl]# openssl dgst -md5 -sign private.pem /tmp/a.txt

+̽@z0I2PZ~Y3Os$087l"/&L*[/V0ʞcL3c?YT

Ⱥ!g8w1)ya

:˗j"ot@docker121 ssl]#

如果要验证签名,那么这个生成的签名要保存到一个文件中,且一定不能使用"-hex"选项,否则验证签名必失败。以下分别生成使用和不使用hex格式的签名文件以待验证签名测试。

[root@docker121 ssl]# openssl dgst -md5 -hex -sign private.pem -out md5_hex.sign /tmp/a.txt

[root@docker121 ssl]# ll

total 8

-rw-r--r-- 1 root root 534 Oct 4 00:03 md5_hex.sign

-rw-r--r-- 1 root root 1679 Oct 3 23:54 private.pem

[root@docker121 ssl]# cat md5_hex.sign

RSA-MD5(/tmp/a.txt)= 2bccbdc6eafd75408063fef47aaaf7cd5d304911193250dec88a03185a7e59823e7fc18617bc00334f7310fac7ad12be574ebe14c67a3fee243082daff4cd831cbdb38378f995d8982a55a9093d149f117d5783721d8674ab77f08fd3df5eb6cbacbb7dbea88c2c284c552b622d1291cbaf7fe6190182f264c2a5ba964755cff160f81d66f19cfbc787004ecafede12f56bf357a0130ca9e63f8905aa314ca530d0f4c8a71d3283363033f9c93280dbcbaf2f959540cc8ba9e067676938f6d848032b9da21673877da6c444118b09444c431a67bd6122979b2f4fe43610ba1edf273e428e2fb3aef6cbd2b0f1a7fcb9784f03d59ce6101d0c191450b6a2206b3

[root@docker121 ssl]#

[root@docker121 ssl]# openssl dgst -md5 -sign private.pem -out md5_nohex.sign /tmp/a.txt

[root@docker121 ssl]# ll

total 12

-rw-r--r-- 1 root root 534 Oct 4 00:03 md5_hex.sign

-rw-r--r-- 1 root root 256 Oct 4 00:04 md5_nohex.sign

-rw-r--r-- 1 root root 1679 Oct 3 23:54 private.pem

[root@docker121 ssl]# cat md5_nohex.sign

+̽@z0I2PZ~Y3Os$087l"/&L*[/V0ʞcL3c?YT

Ⱥ!g8w1)ya

:˗j"ot@docker121 ssl]#

(4).验证签名。验证签名的过程实际上是对待验证文件新生成签名,然后与已有签名文件进行比对,如果比对结果相同,则验证通过。所以,在验证签名时不仅要给定待验证的签名文件,也要给定相同的算法,相同的私钥或公钥文件以及待签名文件以生成新签名信息。

以下先测试以私钥来验证数字签名文件。

首先对未使用hex格式的签名文件md5_nohex.sign进行验证。由于生成md5_nohex.sign时使用的是md5算法,所以这里必须也要指定md5算法。

[root@docker121 ssl]# openssl dgst -md5   -prverify private.pem  -signature md5_nohex.sign    /tmp/a.txt

Verified OK

再对使用了hex格式的签名文件md5_hex.sign进行验证,不论在验证时是否使用了hex选项,结果都是验证失败。

[root@docker121 ssl]# openssl dgst -md5 -prverify private.pem -signature md5_hex.sign /tmp/a.txt

Verification Failure

[root@docker121 ssl]# openssl dgst -md5 -hex -prverify private.pem -signature md5_hex.sign /tmp/a.txt

Verification Failure

再测试使用公钥来验证数字签名。

[root@docker121 ssl]# openssl rsa -in genrsa.pri -pubout -out rsa.pub        #从私钥中提取公钥

[root@docker121 ssl]# openssl dgst -md5 -verify rsa.pub -signature md5_nohex.sign /tmp/a.txt

Verified OK

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/422209.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

烙饼啊烙饼{转自ITEO

一摞烙饼 博客分类: 编程1.有一些服务员会把上面的一摞饼子放在自己头顶上(放心,他们都戴着洁白的帽子),然后再处理其他饼子,在这个条件下,我们的算法能有什么改进? Java代码 int[] …

前端学习(553):node实现登录和注册第一部分代码

const http require(http); const url require(url) const querystring require(querystring) let user{admin:123456 } http.createServer((req,res)>{let path,get,post//如果是get请求if(req.methodGET){let{pathname,query} url.parse(req.url,true)pathpathname,ge…

java 不同分辨率_java9新特性-14-多分辨率图像 API

1.官方FeatureWindows and Linux2.产生背景在Mac上,JDK已经支持视网膜显示,但在Linux和Windows上,它并没有。在那里,Java程序在当前的高分辨率屏幕上可能看起来很小,不能使用它们。这是因为像素用于这些系统的大小计算…

前端学习(554):node实现登录和注册第二部分代码

jquery.min.js npm安装jQuery并引入 app.js const http require(http); const url require(url) const querystring require(querystring) const fs require(fs) let user{admin:12345 } http.createServer((req,res)>{let path,get,post//如果是get请求if(req.method…

[转]关于数据库的并发性的一个解决方案

我先把流程说出来,,比如修改一个记录:当用户点修改时,从数据库读出数据并显示到编辑菜单中,然后再编辑数据,再点确定保存到数据库中。如果多 个用户,当A用户点修改到保存该数据这一时间段&#…

encapsulation java_Java - 封装(Encapsulation)

Java - 封装(Encapsulation)Encapsulation是四个基本OOP概念之一。 其他三个是继承,多态和抽象。Java中的封装是将数据(变量)和作用于数据(方法)的代码作为一个单元包装在一起的机制。 在封装中,类的变量将从其他类隐藏,并且只能通过其当前类…

『AA』AutoAnchor自动猫

2012-09-17 19:40:31:嘿嘿,给自己出了道编程题,难度不大(YY都可以), 大家有兴趣可以自己去实现下。 文章目录 引子思路用法bug源代码 & 可执行文件引子 一篇博文如果太长的话,为博文标题添加…

前端学习(557):css与百分比单位

普通元素的百分比是按照元素的宽度决定的 绝对定位的百分比是按照第一个定位元素的容器的宽度计算的

java 微信隐藏右上角_React Js 微信禁止复制链接分享禁止隐藏右上角菜单功能

废话不多说了,直接给大家贴代码了,具体代码如下所示:/*** Created by wuyakun on 2017/5/23.*/let wxUtils {};/*** 是否开启右上角Menu* param open*/wxUtils.optionMenu function (open true) {if (open) {openOptionMenu();} else {dis…

JSP中文及传中文参数乱码解决方法小结

在使用JSP的过程中,最使人头疼的一个问题就是中文乱码问题,以下是我在软件开发中遇到的乱码问题以及解决方法。 1、JSP页面乱码 这种乱码的原因是应为没有在页面里指定使用的字符集编码,解决方法:只要在页面开始地方用下面代码指定…

java递归遍历xml所有元素_Java学习之Xml系列二:xml按条件查询、xml递归遍历所有元素和属性...

2019独角兽企业重金招聘Python工程师标准>>>xml中加入了几条,为了方便查询时作为示例。话不多说见代码注释:DTD文件:SwordTypeDefinition.dtdXML文件:SwordLib.xmlSwordLibrary SYSTEM "SwordTypeDefinition.dtd&qu…

调用IOS邮件系统发送邮件

1.导入MessageUI.framework框架2.在需要应用的控制器头文件&#xff1a;#import <MessageUI/MessageUI.h>&#xff0c;并加入委托&#xff1a;<MFMailComposeViewControllerDelegate>3.实现方法&#xff1a;-(void)displayComposerSheet { MFMailComposeViewCon…

list python 转tensor_Pytorch--Tensor, Numpy--Array,Python--List 相互之间的转换。

版权声明&#xff1a;本文为博主原创文章&#xff0c;遵循CC 4.0 by-sa版权协议&#xff0c;转载请附上原文出处链接和本声明。本文链接&#xff1a;https://blog.csdn.net/weixin_37589575/article/details/994463941.1 List --> Arrary: np.array(List 变量)a [1, 2, 3, …

上传文件的跨域处理(转)

&#xff08;文章转自&#xff1a;http://blog.robotercoding.com/?p62&#xff09; 为了减轻主服务器的负担&#xff0c;希望把图片的处理单独拿出来&#xff0c;由图片服务器来处理图片上传&#xff0c;浏览等操作。图片上传使用了ajax方式&#xff0c;采用了ajaxfileupload…

嵌入式开发中利用strstr()对部分模块回传数据进行解析的问题(坑)

受到以下博文的启发&#xff1a; https://www.cnblogs.com/yup1983/p/11337837.html 验证&#xff1a; 最近通过ESP8266远程控制小车&#xff0c;在wifi回传的数据解析过程中遇到标题所述的烦恼 如上截图所示&#xff0c;数据回传过程中会接受到‘\0’字节对应的ASCII码为0x0…

前端学习(561):解决margin重叠第二种情况父子

第一种方法 第二种方法 第三种方法 第四种方法 第五种方式

HDU 4417 Super Mario

划分树 二分 二分枚举第k小的数与h比较大小。 #include <stdio.h> #include <string.h> #include <stdlib.h> #include <algorithm> using namespace std; const int MAXN 100100; struct Node {int l, r; }T[MAXN << 2];int d[MAXN], s[MAXN]…