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

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

首先要明白的是,数字签名的过程是计算出摘要信息,然后使用私钥对摘要信息进行加密得到数字签名,而摘要是使用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

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

  1. openssl gmssl SM2 公私钥生成 加密解密命令

    openssl 从 1.1.1 开始支持 sm2.gmssl 基于openssl 添加了对国密的支持. 检测 openssl 是否支持 SM2 openssl ecparam -list_curves ...

  2. openssl给内网IP生成ca证书(ssl证书)

    一.要使用 OpenSSL 为内网 IP 生成 CA 证书,您需要遵循以下步骤: 1.创建一个存放证书的文件夹 mkdir /opt/zhengshu 注意:大家自己按照自己的目录创建就行,我的直接放 ...

  3. Android 获取android密钥哈希码(keytool -exportcert -alias openssl sha1 -binary | openssl base64)

    由于业务需求需要集成国外的SDK,而国外的sdk需要Android端提供一个签名哈希值 起初我以为是跟集成国内的高德地址一样提供个SHA1的值即可,之前我也写过一篇博客:Android获取SHA1值的 ...

  4. OpenSSL之六:OpenSSL源码编译安装

    OpenSSL源码编译安装 一.OpenSSL在Linux平台的编译 打包环境 源码准备 编译安装 二.OpenSSL在Windows平台的编译 打包环境 编译32位库 编译64位库 错误处理 编译低 ...

  5. keytool -exportcert -alias key0 -keystore key.jks | openssl sha1 -binary | openssl base64--生成28位加密签名

    Android想生成28位base64加密签名,生成签名一共有两种方法. 第一种方法:首先要下载openssl这个工具-----Google Code Archive - Long-term stor ...

  6. windows7下,Java中利用JNI调用c++生成的动态库的使用步骤

    1.从http://www.oracle.com/technetwork/java/javase/downloads/jdk-7u2-download-1377129.html下载jdk-7u2-wi ...

  7. Java 快速开发二维码生成服务

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 来源 | 公众号「码农小胖哥」 1. 前言 不知道从什么 ...

  8. java token生成和验证_java生成定长度的随机验证码

    平凡也就两个字: 懒和惰;成功也就两个字: 苦和勤;优秀也就两个字: 你和我.跟着我从0学习JAVA.spring全家桶和linux运维等知识,带你从懵懂少年走向人生巅峰,迎娶白富美!每一篇文章都是心 ...

  9. 菜鸟学Java(六)——简单验证码生成(Java版)

    转载自  菜鸟学Java(六)--简单验证码生成(Java版) 验证码大家都知道,它的作用也不用我多说了吧.如果不太清楚请参见百度百科中的解释,一般验证码的生成就是随机产生字符(数字.字母或者汉字等) ...

最新文章

  1. 什么是CPI指数和GDP
  2. .Net Core 项目引用本地类库方式(二)
  3. springmvc教程--整合mybatis开发(spring+springMVC+mybatis整合开发)
  4. 阿里副总裁肖利华:数智化转型的7个关键词
  5. Django websocket 长连接使用
  6. JZOJ 5691. 【GDOI2018Day2模拟4.25】求和
  7. QtWebkit包含的类简介
  8. JS-随机生成的密码
  9. 不属于html5表单元素的是,HTML5 表单元素
  10. JavaScript引用数据类型
  11. 2、Python_Day_1_作业
  12. paip.解决问题Unable to access jarfile E:\resin-4.0.22\lib\resin.jar
  13. python与mongodb更新_Python对MongoDB增删改查
  14. linux安全擦除ssd命令,如何在不破坏SSD的情况下安全擦除SSD | MOS86
  15. 前端导出 pdf 分页带表头,导出pdf 不分页
  16. DELL 1420 笔记本 BIOS设置
  17. 计算机上面的字体怎么应用,字魂字体怎么放PS里面用 应用到PS的方法
  18. SSMS 18 安装过程中出现严重错误
  19. java生成树形Excel_poi从excel中读取父子关系型(树形)数据结构到数据库
  20. 搜狗输入法自动打开问题

热门文章

  1. spring mvc学习(23):eclipse创建Maven项目没有src/main/java并不能新建的问题
  2. 62 getproperty对象
  3. 实例33:python
  4. hbase简介(大数据技术)
  5. [Python技巧]如何加快循环操作和Numpy数组运算速度
  6. oracle数据同步异常,案例:DataGuard同步异常问题处理记录
  7. opencv支持python3吗_Python3.4+opencv3
  8. 元组、字典、集合的常用方法
  9. phalcon无限重定向
  10. 通过CMD命令行创建和使用Android 模拟器 AVD