• OpenSSL中的dgst、dh、dhparam、enc命令使用说明


    OpenSSL中的dgst、dh、dhparam、enc命令使用说明

    dgst

    主要用于数据摘要、数据签名以及验证签名。

    概要

    openssl dgst [-digest] [-help] [-c] [-d] [-list] [-hex] [-binary] [-r] [-out filename] [-sign filename] [-keyform arg] [-passin arg] [-verify filename] [-prverify filename] [-signature filename] [-sigopt nm:v] [-hmac key] [-fips-fingerprint] [-rand file...] [-engine id] [-engine_impl] [file...]
    

    dgst函数输出十六进制的摘要文件,默认的摘要算法是sha256,输入如下命令查看可选摘要算法

    openssl dgst -list
    

    选项说明

    • -digest ——摘要算法名称

      Supported digests:
      -blake2b512                -blake2s256                -md4                      
      -md5                       -md5-sha1                  -ripemd                   
      -ripemd160                 -rmd160                    -sha1                     
      -sha224                    -sha256                    -sha3-224                 
      -sha3-256                  -sha3-384                  -sha3-512                 
      -sha384                    -sha512                    -sha512-224               
      -sha512-256                -shake128                  -shake256                 
      -sm3                       -ssl3-md5                  -ssl3-sha1                
      -whirlpool
      
    • -help ——查找帮助

    • -c ——当设置了-hex,输出结果每两个字符中加一个冒号

    • -d ——打印出BIO调试信息值。

    • -hex ——以十六进输出结果,二选一

    • -binary ——以二进制输出结果,二选一

    • -r —— 以sha1sum的“coreutils”格式输出摘要

    • -non-fips-allow —— 允许在FIPS模式使用非FIPS算法

    • -out filename —— 输出文件,默认标准输出

    • -sign filename —— 使用文件中的私钥签名

    • -keyform arg —— 私钥格式,PEM | DER

    • -passin arg —— 私钥密码

    • -verify filename ——公钥验签

    • -prverify filename ——私钥验签

    • -signature filename ——签名文件

    • -hmac key ——hmac 秘钥

    • -non-fips-allow ——允许在FIPS模式使用非FIPS算法

    • -fips-fingerprint ——在某些openssl-FIPS中使用特殊密钥计算HMAC

    • -engine id ——指定硬件引擎

    • file ——输入文件,不指定则为标准输入

    注意事项

    • 所有新应用程序的选择的摘要算法是SHA1。 然而其他摘要算法仍然被广泛使用。
    • 在签名时,dgst将根据私钥的ASN.1信息自动确定用于签名的算法(RSA,ECC等)。
      当验证签名时,它只处理RSA,DSA或ECDSA签名本身,而不是分析相关数据来识别签名者和相关算法,如x.509,CMS和S / MIME的签名者和算法。
    • 某些签名算法,特别是ECDSA和DSA需要一个随机数源
    • 仅当单个文件要签名或验证时,才能使用签名和验证选项。
    • 十六进制签名无法使用openssl进行验证。使用“xxd -r”或类似程序在验证之前将十六进制签名转换为二进制签名。
    • 在OpenSSL 1.1.0中默认的摘要算法是sha256

    示例

    //计算摘要
    openssl dgst -md5 -hex file.txt
    openssl dgst -sh1 -c -hex -out md.sha1 file.txt
    
    //私钥签名
    openssl dgst -sha256 -sign privatekey.pem -out signature.sign file.txt
    //公钥验签
    openssl dgst -sha256 -verify publickey.pem -signature signature.sign file.txt
    
    //私钥签名
    openssl dgst -sign rsa_pri.key -keyform PEM -passin pass:123456 -out rsa_sign.sig file.txt
    //私钥验签
    openssl dgst -prverify rsa_pri.key -keyform PEM -passin pass:123456 -signature rsa_sign.sig file.txt
    //公钥验签
    openssl dgst -verify rsa_pub.key -keyform PEM -signature rsa_sign.sig file.txt
    
    //hmac
    openssl dgst -hmac rsa_pri.key -keyform PEM -passin pass:123456 -sha1 -out rsa.hmac file.txt
    

    dh、dhparam

    dh是Diffie-Hellman参数管理命令,现已被dhparam替代

    dhparam命令用于生成和管理Diffie-Hellman参数。

    概要

    openssl dhparam [-help] [-inform DER|PEM] [-outform DER|PEM] [-in filename] [-out filename] [-dsaparam] [-check] [-noout] [-text] [-C] [-2] [-5] [-rand file...] [-writerand file] [-engine id] [numbits]
    

    选项说明

    • -help ——查找帮助
    • -inform DER|PEM ——输入文件格式,DER或者PEM格式。DER格式采用ASN1的DER标准格式。一般用的多的都是PEM格式,就是base64编码格式。
    • -outform DER|PEM ——输出文件格式,DER或者PEM格式。
    • -in filename ——读取DH参数的文件,默认为标准输入。
    • -out filename ——dh参数输出文件,默认为标准输出。
    • -dsaparam ——如果本选项被设置,那么无论输入还是输入都会当做DSA的参数。它们再被转化成DH的参数格式。这样子产生DH参数和DH key都会快很多。会使SSL握手的时间缩短。当然时间是以安全性做牺牲的,所以如果这样子最好每次使用不同的参数,以免给人破掉你的密钥值。如果没有被设置,大素数会被作为DH参数的产生器。
    • -noout ——不打印参数编码的版本信息。
    • -check ——检查DH密钥参数。
    • -text ——打印DH参数信息值。
    • -C ——以C语言风格打印信息。
    • -2、-5 ——指定2或5为发生器,默认为2,如果指定这些项,输入DH参数文件将被忽略,自动生成DH参数。
    • -rand file(s) ——随机数产生种子。
    • -engine id ——指定硬件引擎。
    • numbits ——指定素数位数,必须是最后一个参数,默认为512。

    注意事项

    • PEM格式的DH密钥参数用下面的头部和尾部:

      -----BEGIN DH PARAMETERS-----
      -----END DH PARAMETERS-----
      
    • OpenSSL目前仅仅支持老版本的PKCS#3格式的DH,不是最新的X9.42DH。

    • 这个命令操作的是DH参数而不是key。

    BUGS

    • 应该使用其他的命令生成和操作DH的key。

    示例

    //生成DH参数
    openssl dhparam -2 -out dhparam.pem -text 1024
    

    通过vim dhparam.pem可以查看这个文件

        DH Parameters: (1024 bit)
            prime:
                00:ca:4a:ac:a4:ad:c3:9f:6c:08:dd:cb:00:bd:79:
                47:b9:3e:53:e1:6e:38:2d:fb:47:10:e0:d9:d3:16:
                82:b4:dc:33:5f:32:a6:b7:20:b6:1a:f3:1c:67:ec:
                5a:ab:3d:cf:42:61:6e:a1:a2:ea:a1:19:55:d8:54:
                0c:cd:cc:1d:ea:70:ca:a9:4d:a5:b3:ea:7c:19:54:
                40:dc:a8:67:06:57:32:94:96:d9:ec:97:f3:ff:df:
                8a:5f:69:7c:9e:a3:02:73:ad:42:7a:c5:b3:3f:10:
                5d:e3:11:b2:50:e8:b4:98:1f:a3:c1:46:be:f5:3c:
                b5:ee:ec:7e:3e:ba:13:f3:fb
            generator: 2 (0x2)
    -----BEGIN DH PARAMETERS-----
    MIGHAoGBAMpKrKStw59sCN3LAL15R7k+U+FuOC37RxDg2dMWgrTcM18yprcgthrz
    HGfsWqs9z0JhbqGi6qEZVdhUDM3MHepwyqlNpbPqfBlUQNyoZwZXMpSW2eyX8//f
    il9pfJ6jAnOtQnrFsz8QXeMRslDotJgfo8FGvvU8te7sfj66E/P7AgEC
    -----END DH PARAMETERS-----
    
    //检查生成的DH参数
    openssl dhparam -in dhparam.pem -check
    

    enc

    这是一个对称加密算法工具。能够运用多种块密码算法或者流密码算法对数据进行加密解密,还可以对明文和密文进行base64的编码和解码。

    概要

    openssl enc -cipher [-help] [-list] [-ciphers] [-in filename] [-out filename] [-pass arg] [-e] [-d] [-a] [-base64] [-A] [-k password] [-kfile filename] [-K key] [-iv IV] [-S salt] [-salt] [-nosalt] [-z] [-md digest] [-iter count] [-pbkdf2] [-p] [-P] [-bufsize number] [-nopad] [-debug] [-none] [-rand file...] [-writerand file] [-engine id]
    

    输入如下命令可以查看可选加解密算法:

    openssl enc -list
    

    选项说明

    • -ciphername ——对称算法名称

      Supported ciphers:
      -aes-128-cbc               -aes-128-cfb               -aes-128-cfb1             
      -aes-128-cfb8              -aes-128-ctr               -aes-128-ecb              
      -aes-128-ofb               -aes-192-cbc               -aes-192-cfb              
      -aes-192-cfb1              -aes-192-cfb8              -aes-192-ctr              
      -aes-192-ecb               -aes-192-ofb               -aes-256-cbc              
      -aes-256-cfb               -aes-256-cfb1              -aes-256-cfb8             
      -aes-256-ctr               -aes-256-ecb               -aes-256-ofb              
      -aes128                    -aes128-wrap               -aes192                   
      -aes192-wrap               -aes256                    -aes256-wrap              
      -aria-128-cbc              -aria-128-cfb              -aria-128-cfb1            
      -aria-128-cfb8             -aria-128-ctr              -aria-128-ecb             
      -aria-128-ofb              -aria-192-cbc              -aria-192-cfb             
      -aria-192-cfb1             -aria-192-cfb8             -aria-192-ctr             
      -aria-192-ecb              -aria-192-ofb              -aria-256-cbc             
      -aria-256-cfb              -aria-256-cfb1             -aria-256-cfb8            
      -aria-256-ctr              -aria-256-ecb              -aria-256-ofb             
      -aria128                   -aria192                   -aria256                  
      -bf                        -bf-cbc                    -bf-cfb                   
      -bf-ecb                    -bf-ofb                    -blowfish                 
      -camellia-128-cbc          -camellia-128-cfb          -camellia-128-cfb1        
      -camellia-128-cfb8         -camellia-128-ctr          -camellia-128-ecb         
      -camellia-128-ofb          -camellia-192-cbc          -camellia-192-cfb         
      -camellia-192-cfb1         -camellia-192-cfb8         -camellia-192-ctr         
      -camellia-192-ecb          -camellia-192-ofb          -camellia-256-cbc         
      -camellia-256-cfb          -camellia-256-cfb1         -camellia-256-cfb8        
      -camellia-256-ctr          -camellia-256-ecb          -camellia-256-ofb         
      -camellia128               -camellia192               -camellia256              
      -cast                      -cast-cbc                  -cast5-cbc                
      -cast5-cfb                 -cast5-ecb                 -cast5-ofb                
      -chacha20                  -des                       -des-cbc                  
      -des-cfb                   -des-cfb1                  -des-cfb8                 
      -des-ecb                   -des-ede                   -des-ede-cbc              
      -des-ede-cfb               -des-ede-ecb               -des-ede-ofb              
      -des-ede3                  -des-ede3-cbc              -des-ede3-cfb             
      -des-ede3-cfb1             -des-ede3-cfb8             -des-ede3-ecb             
      -des-ede3-ofb              -des-ofb                   -des3                     
      -des3-wrap                 -desx                      -desx-cbc                 
      -id-aes128-wrap            -id-aes128-wrap-pad        -id-aes192-wrap           
      -id-aes192-wrap-pad        -id-aes256-wrap            -id-aes256-wrap-pad       
      -id-smime-alg-CMS3DESwrap  -rc2                       -rc2-128                  
      -rc2-40                    -rc2-40-cbc                -rc2-64                   
      -rc2-64-cbc                -rc2-cbc                   -rc2-cfb                  
      -rc2-ecb                   -rc2-ofb                   -rc4                      
      -rc4-40                    -seed                      -seed-cbc                 
      -seed-cfb                  -seed-ecb                  -seed-ofb                 
      -sm4                       -sm4-cbc                   -sm4-cfb                  
      -sm4-ctr                   -sm4-ecb                   -sm4-ofb                  
      
    • -in filename —— 输入文件

    • -out filename ——输出文件,省略则为标准输出

    • -pass arg —— 口令设置,用于没有提供密钥时,采用摘要算法从口令中生成一个密钥,如果加密时使用了口令,则解密也要使用口令,arg如下所示:

      -pass pass:"123"      #密码是123  
      -pass pass:123        #密码是123  
      -pass evn:VAR         #密码从环境变量VAR中去  
      -pass file:p.txt      #密码从文件p.txt第一行取,不包括换行符,注意DOS格式的^M及回车符。  
      -pass fd:3            #密码从文件描述符3中读  
      -pass stdin           #标准输入123456
      
    • -e —— 加密,二选一

    • -d —— 解密,二选一

    • -a/-base64 —— 加密时设置结果以base64编码,,解密时设置输入为base64

    • -A ——加密时设置结果以base64编码成一行,解密时设置输入为一行base64

    • -k password —— 口令,已经被-pass代替,二选一

    • -kfile filename —— 口令文件 已经被-pass代替,二选一

    • -K key —— 加密秘钥,16进制

    • -iv IV ——初始向量,16进制

    • -S salt ——指定16进制盐值

    • -salt ——带有随机盐值 二选一

    • -nosalt ——不带盐值,已经关闭此选项,二选一

    • -z ——是否压缩,需要编译时选择了zlib库

    • -md digstname —— 摘要算法,当没有提供密钥时候,用于从口令中生成一个密钥,默认md5

    • -p ——打印出使用的salt、口令以及初始化向量IV。二选一

    • -P ——打印出使用的salt、口令以及初始化向量IV。不做加解密,二选一

    • -bufsize number ——缓冲区大小

    • -nopad ——无填充

    • -debug ——打印调试信息

    • -none ——不执行加 解密

    • -engine id ——引擎

    注意事项

    • 该程序可以通过openssl ciphername或者openssl enc -ciphername 两种方式调用,但是前一种不支持引擎加密.
    • 应在配置文件中配置提供全新加密算法的引擎(如提供gost89算法的ccgost引擎)。在命令行中使用-engine选项指定的引擎只能用于由配置文件中指定的OpenSSL内核或其他引擎支持的密码的硬件辅助实现。
    • 当enc命令列出支持的加密算法时,也列出了配置文件中指定的引擎提供的算法。
    • 如果需要,将提示输入密钥以获得密钥。
    • 如果从密码派生密钥,则应使用-salt选项,除非您希望与以前版本的OpenSSL和SSLeay兼容。没有-salt选项,可以对密码执行有效的字典攻击,并攻击流密码加密数据。原因是没有slat,相同的密码总是生成相同的加密密钥。当slat被使用时,加密数据的前八个字节被保留给盐:它在加密文件时被随机生成,并且在被解密时从加密文件读取。
    • 一些密码没有大的密钥,如果不正确使用,会带来安全隐患。建议初学者在CBC模式下使用强分组密码,如bf或des3。
    • 所有块密码通常使用PKCS#5填充也称为标准块填充:这允许执行基本的完整性或密码检查。然而,由于随机数据通过测试的机会优于256中的1,这不是一个非常好的测试。
    • 如果禁止填充,则输入数据必须是密码块长度的倍数。
    • 所有RC2密码具有相同的密钥和有效的密钥长度。
    • Blowfish和RC5算法使用128位密钥。

    示例

    //将一个二进制文件转换为base64编码的文件
    openssl base64 -in file.bin -out file.b64
    //将这个base64编码的文件解码原来的二进制文件
    openssl base64 -d -in file.b64 -out file.bin
    
    //以AES-128算法使用一个口令和派生的PBKDF2密钥加密一个文件
    openssl enc -aes128 -pbkdf2 -in file.txt -out file.aes128
    //以AES-128算法使用同样的口令解密刚才的文件
    openssl enc -aes128 -pbkdf2 -d -in file.aes128 -out file.txt -pass pass:<password>
    
    //以AES-256-ctr算法使用一个口令和派生的PBKDF2密钥加密一个文件并用Base64编码
    openssl enc -aes-256-ctr -pbkdf2 -a -in file.txt -out file.aes256
    //用Base64解码刚刚那个文件并用同样的算法和口令解密
    openssl enc -aes-256-ctr -pbkdf2 -d -a -in file.aes256 -out file.txt -pass file:<passfile>
    
    //加入-k和-iv参数
    //加密(提供密钥)
    openssl enc -aes-128-cbc -e -K 000 -iv 000 -in test.txt -out test.cipher  -a -A  -p
    //解密
    openssl enc -aes-128-cbc -d -K 000 -iv 000 -in test.ciphet -a -A  -out test.plain   -p
    
    //加盐
    //加密(提供口令)
    openssl enc -aes-128-cbc -e  -pass pass:123456 -S a1bec3d4e5f6 -salt -md sha1 -iv 000 in test.txt -out test.cipher  -a -A  -p
    //解密
    openssl enc -aes-128-cbc -d  -pass pass:123456 -S a1bec3d4e5f6 -salt -md sha1 -iv 000 in test.cipher -out test.plain  -a -A  -p
    

    BUGS

    • -A选项在遇到大文件时将不会起作用
    • enc命令只支持它本身提供的具有固定数字参数的算法
  • 相关阅读:
    全网首发|阿里资深技术专家数仓调优经验分享(上)
    用跨进程子类化技术实现对其它进程消息的拦载
    字符串与16进制互转
    Windows消息前缀
    Delphi 关于钩子函数HOOK (二)
    ACCESS SQL语法参考
    从内存中加载并运行exe
    浅谈Delphi中进程间的数据共享
    字符串排序等算法
    利用内存映射文件在两个进程间共享数据
  • 原文地址:https://www.cnblogs.com/blingblingXY/p/13942687.html
Copyright © 2020-2023  润新知