OpenSSL CLI 散列函数 个人使用经验

前言

一篇简单的OpenSSL 散列使用经验,偶尔更新。


获取帮助

1
openssl dgst -h

输出如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
Usage: dgst [options] [file...]

General options:
-help Display this summary
-list List digests
-engine val Use engine e, possibly a hardware device
-engine_impl Also use engine given by -engine for digest operations
-passin val Input file pass phrase source

Output options:
-c Print the digest with separating colons
-r Print the digest in coreutils format
-out outfile Output to filename rather than stdout
-keyform format Key file format (ENGINE, other values ignored)
-hex Print as hex dump
-binary Print in binary form
-xoflen +int Output length for XOF algorithms. To obtain the maximum security strength set this to 32 (or greater) for SHAKE128, and 64 (or greater) for SHAKE256
-d Print debug info
-debug Print debug info

Signing options:
-sign val Sign digest using private key
-verify val Verify a signature using public key
-prverify val Verify a signature using private key
-sigopt val Signature parameter in n:v form
-signature infile File with signature to verify
-hmac val Create hashed MAC with key
-mac val Create MAC (not necessarily HMAC)
-macopt val MAC algorithm parameters in n:v form or key
-* Any supported digest
-fips-fingerprint Compute HMAC with the key used in OpenSSL-FIPS fingerprint

Random state options:
-rand val Load the given file(s) into the random number generator
-writerand outfile Write random data to the specified file

Provider options:
-provider-path val Provider load path (must be before 'provider' argument if required)
-provider val Provider to load (can be specified multiple times)
-propquery val Property query used when fetching algorithms

Parameters:
file Files to digest (optional; default is stdin)

计算文件摘要

这是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
2
3
4
5
6
7
8
9
10
Supported digests:
-blake2b512 -blake2s256 -md4
-md5 -md5-sha1 -mdc2
-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

散列算法简单介绍

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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
BIO[0x1fd3574d080]: ctrl(6) - FILE pointer
BIO[0x1fd3574d080]: ctrl return 0
BIO[0x1fd3574d080]: ctrl(108) - FILE pointer
BIO[0x1fd3574d080]: ctrl return 1
BIO[0x1fd3574d080]: ctrl(10) - FILE pointer
BIO[0x1fd3574d080]: ctrl return 0
BIO[0x1fd3574d080]: ctrl(2) - FILE pointer
BIO[0x1fd3574d080]: ctrl return 0
BIO[0x1fd3574d080]: read(0,8192) - FILE pointer
BIO[0x1fd3574d080]: read return 1 processed: 3814
BIO[0x1fd3574d080]: ctrl(10) - FILE pointer
BIO[0x1fd3574d080]: ctrl return 0
BIO[0x1fd3574d080]: ctrl(2) - FILE pointer
BIO[0x1fd3574d080]: ctrl return 1
SHA2-256(_config.yml)= 10d90acf0a106d5258830937cf59bb8ecc3078c91efaecccd2212b9a8b93f98b
BIO[0x1fd3574d080]: ctrl(1) - FILE pointer
BIO[0x1fd3574d080]: ctrl return 0
BIO[0x1fd3574d080]: Free - FILE pointer
如果你觉得文章写得还不错,可以赏作者一杯咖啡喝,或者一顿饭吃。感谢支持!THYzrcoMQf7d7wzGu1PvDraTef87abSv9V