我需要哪个密钥或哈希工具
| 你的任务 | 工具 |
|---|---|
| 查看证书:名称、到期时间、指纹 | 证书解码器 |
| 提交给 CA 之前检查 CSR | CSR 解码器 |
| 在文本 PEM 和二进制 DER 之间转换 | PEM 转 DER、DER 转 PEM |
| 计算 SSH 公钥指纹或转换格式 | SSH 密钥指纹 |
| 文本或文件的 SHA-256,hex 和 Base64 格式 | SHA-256 转 Base64 |
| Content-MD5 和传统校验和 | MD5 转 Base64 |
| 为 Webhook 或 API 请求签名 | HMAC 生成器 |
为脚本或样式表生成 integrity="sha384-…" | SRI 哈希生成器 |
| 任意长度的随机 Base64 字符串 | 随机 Base64 生成器 |
Laravel APP_KEY、AES 密钥、JWT 和 HMAC 密钥 | Base64 密钥生成器 |
| 内容安全策略(CSP)的 nonce | CSP nonce 生成器 |
| 用密码加密或解密文本 | AES 加密、AES 解密 |
Base64 与密码学的交汇点
PEM 是夹在 -----BEGIN …----- 行之间的、DER 编码 ASN.1 的 Base64。证书、CSR、公钥和私钥都使用这种格式。大多数证书和 RSA 密钥的 Base64 DER 以 MII 开头,EC P-256 公钥以 MFkw 开头,Ed25519 公钥以 MCowBQYDK2Vw 开头,所以往往不用解码就能看出类型。
SSH 密钥 使用另一种结构。ssh-ed25519 行中的 AAAAC3NzaC1lZDI1NTE5… 部分是密钥数据块的 Base64,而大家熟悉的 SHA256:… 指纹是该数据块哈希的 Base64,不带填充。
哈希 是原始字节。文本 hello 的 SHA-256 是 32 个字节:用 64 个 hex 字符表示是 2cf24dba…9824,用 44 个 Base64 字符表示是 LPJNul+wow4m6DsqxbninhsWHlwfp0JecwQzYpOLmCQ=。Webhook 签名、SRI 属性和 S3 的 Content-MD5 请求头需要的是 Base64 形式,拿它去和 hex 摘要比较,是“signature mismatch”错误的常见来源。
配置文件中的随机密钥 通常是 32 个随机字节的 Base64,例如 openssl rand -base64 32。密钥生成器能生成同样的格式,并为常见框架提供了预设。
这些工具不做什么
- 不验证证书链,也不检查吊销状态。页面在设计上就无法连接其他服务器。
- 不显示私钥材料。证书工具对私钥只显示类型和长度,SSH 工具只读取私钥文件中的公钥部分。
- 提供 MD5 和 SHA-1 是为了兼容现有系统。新的安全设计不要使用它们。
JWT 的签名和验证请参阅 Web 与令牌工具。要理解为什么这些 Base64 本身都不是秘密,请阅读 编码与加密的区别。
常见问题
为什么哈希和密钥经常用 Base64 表示?
因为它比 hex 短。SHA-256 哈希用 hex 表示要 64 个字符,用 Base64 只要 44 个;32 字节的密钥用 Base64 表示是 44 个字符,而不是 64 个。SRI 属性、SSH 指纹、HMAC 签名和大多数 .env 中的密钥都是出于这个原因使用 Base64。
Base64 算是一种加密吗?
不算。任何人都能还原 Base64。PEM 私钥只是密钥字节的 Base64,所以文件本身必须妥善保护。真正的加密(例如 AES 工具)需要密钥或密码才能解开。
生成的随机密钥安全吗?
它们来自浏览器的 crypto.getRandomValues,与 WebCrypto 生成密钥所用的是同一个密码学安全随机源。不存储也不发送任何内容,所以每个值在你复制之前只存在于你的屏幕上。