• (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
  • 相关阅读:
    netty
    python统计订单走势
    log4j日志写入数据库
    struts 在Action中访问web元素(request,session等)
    struts 简单前台用户名校验
    struts 页面调用Action的指定方法并传递参数
    简单的对象监听器 观察者设计模式
    servlet 简单filter避免中文乱码等
    Struts 第一个Hello页面
    JDBC 使用SimpleJdbcTemplate实现Dao
  • 原文地址:https://www.cnblogs.com/wyzhou/p/9739021.html
Copyright © 2020-2023  润新知