前言
一篇简单的OpenSSL 散列使用经验,偶尔更新。
获取帮助
1 | openssl dgst -h |
输出如下:
1 | Usage: dgst [options] [file...] |
计算文件摘要
这是openssl dgst
中最简单也是最常见的命令,例如计算一个文件的SHA-256摘要:
1 | openssl dgst -SHA-256 _config.yml |
此命令通过SHA-256散列算法计算当前工作目录下_config.yml
文件的摘要,这是它的输出:
1 | SHA2-256(_config.yml)= 10d90acf0a106d5258830937cf59bb8ecc3078c91efaecccd2212b9a8b93f98b |
列出散列算法
OpenSSL可以使用以下指令列出其支持的散列算法,根据版本而异:
1 | openssl dgst -list |
个人使用的OpenSSL是3.1.2,它的输出如下:
1 | Supported digests: |
散列算法简单介绍
BLAKE2B-512
基于Chacha20的一种非常强大的散列函数,强度超过SHA-2,接近SHA-3,同时运行效率超过SHA-3,输出为512位。
BLAKE2S-256
基于Chacha20的一种非常强大的散列函数,强度超过SHA-2,接近SHA-3,同时运行效率超过SHA-3,输出为256位。
MD4
Ron Rivest设计的一种散列函数,输出128位,已经被证明存在碰撞。
MD5
Ron Rivest设计的一种散列函数,输出128位,已经被证明存在碰撞。虽然非常常用,但是已经过时。
SSL3-MD5
就是MD5。
MD5-SHA-1
一种双重散列,计算MD5值的SHA-1摘要以避免这两个算法各自的弱点。个人觉得不如SHA-256,这个用法也不常见。
MDC-2
基于分组密码的一种散列函数,输出取决于底层使用的分组密码。
RIPEMD
基于MD4设计的一种散列算法,输出默认为160位,不常见,并且存在碰撞。
RIPEMD-160
RIPEMD的160位版本,也就是默认实现。
RMD-160
就是RIPEMD-160。
SHA-1
NIST发布的一个早期散列算法,输出为160位,极为常见,虽然安全性比MD5要高一些,但仍然存在碰撞和前缀冲突攻击。
SSL3-SHA-1
就是SHA-1。
SHA-224
NIST SHA-2散列算法标准之一,采用SHA-256不同的初始值并截断输出而来,输出224位。安全性强大。
SHA-256
NIST SHA-2散列算法标准之一,最为常见的散列函数之一,输出256位,安全性强大,常用于HMAC、文件校验等。
SHA-384
NIST SHA-2散列算法标准之一,采用SHA-512不同的初始值并截断输出而来,输出384位,安全性强大。
SHA-512
NIST SHA-2散列算法标准之一,最为常见的散列函数之一,输出512位,安全性强大,常用于HMAC、文件校验等。
SHA-512-224
把SHA-512的输出截断为224位得到,常用于HMAC。
SHA-512-256
把SHA-512的输出截断为256位得到,常用于HMAC。
SHA-3-224
NIST SHA-3散列算法标准之一,可用于替换SHA-224,输出224位。SHA-3通常被认为比SHA-2更安全。
SHA-3-256
NIST SHA-3散列算法标准之一,可用于替换SHA-256,输出256位。SHA-3通常被认为比SHA-2更安全。
SHA-3-384
NIST SHA-3散列算法标准之一,可用于替换SHA-384,输出384位。SHA-3通常被认为比SHA-2更安全。
SHA-3-384
NIST SHA-3散列算法标准之一,可用于替换SHA-512,输出512位。SHA-3通常被认为比SHA-2更安全。
SHAKE-128
NIST SHA-3散列算法标准之一,输出可扩展,默认128位。
SHAKE-256
NIST SHA-3散列算法标准之一,输出可扩展,默认256位。
SM3
国密算法散列函数,输出256位,设计方面强度对标SHA-256,安全性可靠,但并未经过广泛验证,使用场景有限。
Whirlpool
一个基于大幅修改的AES结构的散列算法,输出512位,安全性非常强大。
输出选项说明
-c
通过冒号,逐字节分隔16进制输出,两个十六进制数为一组,例如:
1 | openssl dgst -SHA-256 -c _config.yml |
输出如下:
1 | SHA2-256(_config.yml)= 10:d9:0a:cf:0a:10:6d:52:58:83:09:37:cf:59:bb:8e:cc:30:78:c9:1e:fa:ec:cc:d2:21:2b:9a:8b:93:f9:8b |
-r
以Coreutils格式打印摘要,使其更容易与GNU工具集成,例如:
1 | openssl dgst -SHA-256 -r _config.yml |
输出如下:
1 | 10d90acf0a106d5258830937cf59bb8ecc3078c91efaecccd2212b9a8b93f98b *_config.yml |
-out outfile
将摘要输出到一个文件中,而非stdout,例如:
1 | openssl dgst -SHA-256 -out hash.txt _config.yml |
摘要值将被输出到hash.txt
文件当中。
-keyform format
指定密钥文件格式,可以接受PEM, DER, ENG等格式,例如:
1 | openssl dgst -SHA-256 -sign private_key.pem -keyform PEM -out signature,bin data.txt |
-hex
以16进制输出摘要,这个是默认行为,一般来说不加也是这样,例如:
1 | openssl dgst -SHA-256 _config.yml |
和
1 | openssl dgst -SHA-256 -hex _config.yml |
它们的输出一样:
1 | SHA2-256(_config.yml)= 10d90acf0a106d5258830937cf59bb8ecc3078c91efaecccd2212b9a8b93f98b |
-binary
以二进制输出摘要,例如:
1 | openssl dgst -SHA-256 -binary _config.yml |
此时一般会看到一团乱码,因为它会尝试以UTF-8之类的字符集进行解析:
1 | ??mRX?7蟉粠?x?桃!+殝擓 |
可以尝试把它输出到文件:
1 | openssl dgst -SHA-256 -binary -out hash.bin _config.yml |
-xoflen +int
对于可扩展输出函数(eXtendable-Output Functions),例如SHAKE-128,SHAKE-256等,指定其输出长度。
例如,这是默认的SHAKE-128:
1 | openssl dgst -SHAKE-128 _config.yml |
它的输出为128位:
1 | SHAKE-128(_config.yml)= 963197743bcc929737752110337fffd9 |
使用xoflen +int
用户可以随意地调节它的输出字节数,对于SHAKE-128而言至多32字节(256位),对于SHAKE-256而言至多64字节(512位)。
例如,将输出调节为24字节(192位):
1 | openssl dgst -SHAKE-128 -xoflen 24 _config.yml |
输出如下:
1 | SHAKE-128(_config.yml)= 963197743bcc929737752110337fffd9662119d7a9b5c158 |
将输出调节为32字节(256位):
1 | openssl dgst -SHAKE-128 -xoflen 32 _config.yml |
输出如下:
1 | SHAKE-128(_config.yml)= 963197743bcc929737752110337fffd9662119d7a9b5c1589e93f9295bf8087a |
-d 或 -debug
输出debug信息,例如:
1 | openssl dgst -SHA-256 -d _config.yml |
输出为:
1 | BIO[0x1fd3574d080]: ctrl(6) - FILE pointer |