哈希工具
哈希计算与校验命令:md5sum/sha256sum、openssl dgst 与 HMAC、大文件校验、企业级完整性校验实践
md5sum 哈希计算
基本写法:计算文件 MD5
md5sum <文件>
# 计算文件的 MD5 哈希
md5sum document.pdf
基本写法:计算多个文件 MD5
md5sum <文件1> <文件2>
# 计算多个文件的 MD5
md5sum file1.txt file2.txt file3.txt
基本写法:保存哈希到文件
md5sum <文件> > <哈希文件>
# 保存 MD5 哈希到文件
md5sum document.pdf > checksums.md5
基本写法:验证文件 MD5
md5sum -c <哈希文件>
# 验证文件 MD5 是否匹配
md5sum -c checksums.md5
基本写法:计算字符串 MD5
echo -n "<字符串>" | md5sum
# 计算字符串的 MD5
echo -n "hello world" | md5sum
sha256sum 哈希计算
基本写法:计算文件 SHA-256
sha256sum <文件>
# 计算文件的 SHA-256 哈希
sha256sum document.pdf
基本写法:保存 SHA-256 到文件
sha256sum <文件> > <哈希文件>
# 保存 SHA-256 哈希到文件
sha256sum document.pdf > checksums.sha256
基本写法:验证文件 SHA-256
sha256sum -c <哈希文件>
# 验证文件 SHA-256 是否匹配
sha256sum -c checksums.sha256
基本写法:计算字符串 SHA-256
echo -n "<字符串>" | sha256sum
# 计算字符串的 SHA-256
echo -n "hello world" | sha256sum
基本写法:批量验证
sha256sum -c <哈希文件> --quiet
# 只显示验证失败的文件
sha256sum -c checksums.sha256 --quiet
其他哈希工具
基本写法:计算 SHA-1
sha1sum <文件>
# 计算文件的 SHA-1 哈希
sha1sum document.pdf
基本写法:计算 SHA-512
sha512sum <文件>
# 计算文件的 SHA-512 哈希
sha512sum document.pdf
基本写法:计算 SHA-224
sha224sum <文件>
# 计算文件的 SHA-224 哈希
sha224sum document.pdf
基本写法:计算 SHA-384
sha384sum <文件>
# 计算文件的 SHA-384 哈希
sha384sum document.pdf
OpenSSL 哈希
基本写法:使用 OpenSSL 计算 SHA-256
openssl dgst -sha256 <文件>
# 使用 OpenSSL 计算 SHA-256
openssl dgst -sha256 document.pdf
基本写法:使用 OpenSSL 计算 MD5
openssl dgst -md5 <文件>
# 使用 OpenSSL 计算 MD5
openssl dgst -md5 document.pdf
基本写法:使用 OpenSSL 计算 SHA-3
openssl dgst -sha3-256 <文件>
# 使用 OpenSSL 计算 SHA3-256
openssl dgst -sha3-256 document.pdf
基本写法:使用 OpenSSL 计算字符串哈希
echo -n "<字符串>" | openssl dgst -sha256
# 计算字符串的 SHA-256
echo -n "hello world" | openssl dgst -sha256
HMAC 计算
基本写法:计算 HMAC-SHA256
openssl dgst -sha256 -hmac "<密钥>" <文件>
# 计算 HMAC-SHA256
openssl dgst -sha256 -hmac "secret_key" document.pdf
基本写法:使用十六进制密钥计算 HMAC
openssl dgst -sha256 -mac HMAC -macopt hexkey:<密钥> <文件>
# 使用十六进制密钥计算 HMAC
openssl dgst -sha256 -mac HMAC -macopt hexkey:369bd7d655 document.pdf
基本写法:计算字符串 HMAC
echo -n "<字符串>" | openssl dgst -sha256 -hmac "<密钥>"
# 计算字符串的 HMAC-SHA256
echo -n "hello world" | openssl dgst -sha256 -hmac "secret_key"
哈希识别
基本写法:识别哈希类型
hashid <哈希值>
# 识别哈希值的类型
hashid 5d41402abc4b2a76b9719d911017c592
基本写法:按长度识别
# 根据哈希长度判断算法
32 字符 -> MD5
40 字符 -> SHA1
56 字符 -> SHA224
64 字符 -> SHA256
96 字符 -> SHA384
128 字符 -> SHA512
# 常见哈希长度对照
echo "MD5: $(echo -n 'test' | md5sum | cut -d' ' -f1 | wc -c)"
echo "SHA256: $(echo -n 'test' | sha256sum | cut -d' ' -f1 | wc -c)"
基本写法:识别密码哈希格式
# 常见密码哈希前缀
$2a$ / $2b$ -> bcrypt
$6$ -> SHA512crypt
$5$ -> SHA256crypt
$1$ -> MD5crypt
$y$ -> yescrypt
$argon2id$ -> Argon2id
# 查看 /etc/shadow 中的哈希格式
grep $USER /etc/shadow
文件完整性校验
基本写法:生成校验文件
sha256sum <文件1> <文件2> > <校验文件>
# 生成多个文件的校验文件
sha256sum file1.txt file2.txt file3.txt > checksums.sha256
基本写法:验证文件完整性
sha256sum -c <校验文件>
# 验证所有文件的完整性
sha256sum -c checksums.sha256
基本写法:递归计算目录哈希
find <目录> -type f -exec sha256sum {} + > <校验文件>
# 递归计算目录下所有文件的 SHA-256
find /important/data -type f -exec sha256sum {} + > checksums.sha256
基本写法:只显示验证失败的文件
sha256sum -c <校验文件> --quiet
# 静默模式只显示失败的验证
sha256sum -c checksums.sha256 --quiet
基本写法:严格模式验证
sha256sum -c <校验文件> --strict
# 严格模式遇到错误返回非零退出码
sha256sum -c checksums.sha256 --strict
bcrypt 密码哈希
基本写法:使用 Python 生成 bcrypt 哈希
python3 -c "import bcrypt; print(bcrypt.hashpw(b'<密码>', bcrypt.gensalt()).decode())"
# 生成 bcrypt 密码哈希
python3 -c "import bcrypt; print(bcrypt.hashpw(b'mypassword', bcrypt.gensalt(12)).decode())"
基本写法:验证 bcrypt 密码
python3 -c "import bcrypt; print(bcrypt.checkpw(b'<密码>', b'<哈希>'))"
# 验证 bcrypt 密码
python3 -c "import bcrypt; print(bcrypt.checkpw(b'mypassword', b'\$2b\$12\$...'))"
基本写法:使用 htpasswd 生成 bcrypt
htpasswd -nbB <用户> <密码>
# 使用 Apache htpasswd 生成 bcrypt 哈希
htpasswd -nbB admin secret123
PBKDF2 密钥派生
基本写法:使用 OpenSSL PBKDF2
openssl kdf -keylen <长度> -kdfopts pass:<密码>:salt:<盐>:iter:<迭代次数> PBKDF2
# 使用 PBKDF2 派生 32 字节密钥
openssl kdf -keylen 32 -kdfopts pass:password:salt:salt:iter:600000 PBKDF2
基本写法:使用 Python PBKDF2
python3 -c "import hashlib, binascii; print(binascii.hexlify(hashlib.pbkdf2_hmac('sha256', b'<密码>', b'<盐>', <迭代次数>)).decode())"
# 使用 Python 计算 PBKDF2
python3 -c "import hashlib, binascii; print(binascii.hexlify(hashlib.pbkdf2_hmac('sha256', b'password', b'salt', 600000)).decode())"
实用哈希组合
基本写法:比较两个文件是否相同
sha256sum <文件1> <文件2> | cut -d' ' -f1 | uniq -d
# 比较两个文件的哈希是否相同
sha256sum file1.txt file2.txt
基本写法:批量检查文件变更
sha256sum -c <校验文件> --quiet && echo "文件无变更" || echo "文件已变更"
# 检查文件是否被篡改
sha256sum -c checksums.sha256 --quiet && echo "文件无变更" || echo "文件已变更"
基本写法:生成文件指纹
sha256sum <文件> | cut -d' ' -f1
# 只输出哈希值
sha256sum document.pdf | cut -d' ' -f1