开发者经常需要哈希、签名、加密和令牌检查。最重要的 5 条规则:
安全操作——对载荷做哈希、为 API 请求签名、加密敏感数据、解码 JWT——都是开发者的日常工作。拥有快速、可靠的浏览器端工具来完成这些操作,意味着你无需搭建本地环境或将敏感数据上传到未知服务器,就能检查和验证各种安全产物。
哈希函数接受任意大小的输入,产生固定大小的输出(摘要)。相同输入总是产生相同输出;哪怕只改动一个字符,也会产生完全不同的摘要。
MD5 产生 128 位(32 个十六进制字符)的摘要。它很快,但在密码学上已被攻破。仅在不要求抗碰撞的校验和场景使用 MD5,例如检测文件意外损坏或用作缓存失效键。
SHA-1 产生 160 位的摘要。自 2017 年起同样被认为已被攻破(SHAttered 攻击)。在新的安全关键代码中应避免使用 SHA-1。
SHA-256(SHA-2 家族的一员)产生 256 位的摘要,是当前安全关键哈希的标准。用于 TLS 证书、代码签名和大多数现代认证系统。
SHA-512 产生 512 位的摘要。在 64 位处理器上,由于其内部字长与处理器的原生位宽匹配,SHA-512 通常比 SHA-256 更快。
HMAC(基于哈希的消息认证码)在哈希中加入一个密钥,产生一个既能证明内容、又能证明发送者身份的签名。
AWS Signature v4 使用 HMAC-SHA256 为每个 API 请求签名。该签名涵盖 HTTP 方法、URL、请求头和请求体哈希,防止传输过程中的任何篡改。
Stripe 和 GitHub 的 webhook 会包含一个 X-Stripe-Signature 或 X-Hub-Signature-256 请求头,其中是请求体的 HMAC-SHA256。你的服务器用 webhook 密钥重新计算它,并拒绝签名不匹配的请求。
JWT HS256 使用 HMAC-SHA256 为令牌的头部和载荷签名。开发和调试时,用我们的 HMAC 生成器来计算和验证 HMAC 签名。
AES(对称)使用相同的密钥加密和解密。它极快——现代 CPU 有针对 AES 的硬件指令,可达到每秒数 GB 的吞吐。AES-256 用于加密静态数据:数据库字段、文件加密、磁盘加密。
RSA(非对称)用公钥加密、用对应的私钥解密。RSA 比 AES 慢得多(大批量数据慢 1000 倍以上),因此通常只用来加密一个小的 AES 密钥,再由该密钥加密真正的数据(混合加密,正如 TLS 所采用的)。
填充很重要:切勿使用不带填充的原始 RSA。RSA-OAEP(最优非对称加密填充)是安全标准。我们的 RSA 加解密工具只使用 RSA-OAEP。
JWT(JSON Web Token)由三个以点号分隔、经 Base64url 编码的部分组成:头部、载荷和签名。
头部(Header):指定算法。{"alg": "HS256", "typ": "JWT"} 表示 HMAC-SHA256 签名。RS256 表示 RSA-SHA256。
载荷(Payload):包含声明——标准声明有 sub(用户 ID)、iss(签发方)、exp(过期 Unix 时间戳)和 iat(签发时间)。
none 算法漏洞:有些 JWT 库会接受 {"alg": "none"},从而完全绕过签名验证。请始终在服务器端校验算法,并拒绝算法不符合预期的令牌。
JWT 默认不加密:标准的 JWT 只被签名而未加密——任何截获它的人都能读取载荷。除非使用 JWE,否则切勿在 JWT 载荷中放置敏感数据。
不行。SHA-256 是通用的快速哈希,这让暴力破解密码变得容易。请改用 bcrypt、scrypt 或 Argon2——它们被设计为慢速且高内存消耗。我们的 密码生成器可生成强密码;存储时应在你的服务器上使用 bcrypt/Argon2。
编码(如 Base64)为兼容性而转换数据——无需密钥即可还原。加密(如 AES)保护机密性——只有用正确的密钥才能还原。切勿把 Base64 当作安全手段。
使用我们的 JWT 解码器。粘贴令牌,工具会读取 exp 声明并显示过期日期,同时给出清晰的「已过期/有效」指示。
安全,只要使用 crypto.getRandomValues(),正是我们的 密码生成器所采用的。它是浏览器的 CSPRNG,与操作系统用于生成密钥的熵源相同。
所有新应用都用 AES-256。AES-128 在技术上对已知攻击是安全的,但 AES-256 提供了更大的余量。在现代硬件上,两者的性能差异可以忽略不计。