Scrypt 哈希生成与验证
编码所有处理都在浏览器本地完成,数据不上传服务器
生成或验证 scrypt 密码哈希。它与 bcrypt 的关键差别是内存硬:bcrypt 只让 CPU 忙,而 scrypt 还要求申请一大块内存(默认参数下 32MB),于是攻击者拿显卡并行破解时,显存很快就不够用了 —— 这正是它被设计出来的原因。输出用 PHC 标准格式 `$scrypt$ln=15,r=8,p=1$<盐>$<哈希>`,算法参数直接写在哈希串里,所以验证时不需要事先知道当初用了什么参数(这一点比 bcrypt 更进一步:bcrypt 的成本因子虽然也在串里,但格式是固定的,而 scrypt 有 ln / r / p 三项可调)。界面会实时显示当前参数需要多少内存;万一超出本工具的上限,会把 N 调低到预算之内,并在结果里明确告诉你实际用的是哪个 N —— 静默改参数会让你拿着一份与你要求不符的哈希去用,那是最糟的一种「成功」。输出还可选派生密钥的十六进制或 Base64(那是原始字节,不含盐与参数,与 PHC 串不是一回事)。
功能
- 两个方向:生成哈希、验证密码与哈希是否匹配
- 参数可调:N 的指数(ln)、块大小 r、并行度 p
- 输出可选 PHC 哈希串,或派生密钥的十六进制 / Base64,也可三者一起给
- 验证时从哈希里读参数,不需要事先知道生成时用了什么
- 实时显示当前参数的内存开销,超预算时明确告知实际用的 N(不静默改参数)
- 恒定时间比较,不会因为「前几个字节对了」而提前返回
使用方法
- 选择模式:生成或验证
- 生成时调参数(默认 ln=15 / r=8 / p=1,占 32MB)并选择输出格式;验证时把哈希填进对应字段
- 把密码粘贴进输入框
- 按 Ctrl/⌘ + Enter 或点「运行」,然后复制结果
常见问题
- scrypt 和 bcrypt 该选哪个?
- 两者都是今天可接受的选择,差别在「消耗什么」。bcrypt 只消耗 CPU,所以攻击者用显卡可以同时跑上千个实例;scrypt 还要消耗内存,每个实例都要吃掉 128 × r × N 字节,显存很快见底 —— 这就是它的优势所在。如果要在两台之间选,密码学上的推荐顺序是 Argon2id > scrypt > bcrypt,而三者都远好过任何「快」的哈希(SHA-256 直接存密码是错的)。本工具两个都提供,是因为老系统里 bcrypt 的存量更大。
- ln、r、p 这三个参数怎么调?
- ln 是主要旋钮:N = 2^ln,内存与耗时都随它线性增长,所以每加一成本翻倍。默认的 15(N=32768,32MB)是通行选择,也是 passlib 等库的默认。r 决定内存与计算的配比(r 越大越偏内存),一般保持 8 不动。p 把输入切成几份并行处理,总内存再乘以 p —— 但浏览器里是单线程跑,p 大于 1 只是让总开销变大,并不会更快,所以通常也保持 1。
- 为什么验证模式不用我填参数?
- 因为参数就写在哈希串里 —— `$scrypt$ln=15,r=8,p=1$…` 这一段。这正是 PHC 格式的设计意图:验证方只要拿到哈希本身就能重算,不需要另存一份参数表(那一份表迟早会与哈希失去同步)。本工具验证时读的是哈希里的 ln / r / p,忽略界面上那三个输入框,所以即使你把它们改乱也不会影响结果。
- 生成的哈希能在别的程序里用吗?
- 能。PHC 格式是 passlib(Python)、node-scrypt 等库通用的写法,盐与哈希都是不带填充的标准 Base64。把整串存进数据库,验证时原样取出交回本工具(或那些库)即可。反过来说,如果别的系统给你的 scrypt 哈希长得不像 `$scrypt$…`(比如是一段 JSON、或者 `$7$` 开头的另一种老格式),本工具认不出来,会明确提示格式不符。
- PHC、十六进制、Base64 三种输出该选哪个?
- 存密码用 PHC —— 它是唯一自带盐与参数的形式,单独一串就能验证。十六进制与 Base64 是派生密钥的原始字节(默认 32 字节),里面没有盐、没有 ln/r/p,单看它无法验证任何密码,它们的用途是「把这段密钥当别的东西用」,比如当 HMAC 密钥、当另一个 KDF 的输入。也正因如此,同一密码每次生成的 PHC 串都不同(盐是随机的),而同一组参数与盐下 hex 与 Base64 是同一条密钥的两种写法,解回来逐字节相同。
相关工具
Bcrypt 生成与验证
编码生成 bcrypt 密码哈希($2y$ 前缀)或验证密码与已有哈希是否匹配,成本因子可调,全部在浏览器本地完成。
哈希计算
编码算出文本的 MD5、SHA-1、SHA-256 或 SHA-512 摘要,也可算老系统用的 MD4 与 MD2,中文按 UTF-8 字节计算。全部在本地完成。
数据库密码哈希
编码生成 PostgreSQL 的 md5、MySQL 与 MariaDB 的 mysql_native_password 密码哈希,并给出可直接使用的 SQL 语句。
Base64 编解码
编码把文本转成 Base64,或把 Base64 还原成文本,中文与 emoji 都按 UTF-8 正确处理。全部在浏览器本地完成,内容不上传。
URL 编解码
编码把中文、空格与符号转义成 %XX,或把 %XX 还原成文本;整条 URL 与单独的参数值要选对方式,选错不会报错,但链接会打不开。全部在浏览器本地完成。
HTML 实体编解码
编码把 < > & 与引号转成 HTML 实体,也能把实体还原成字符,而且只解一遍:&lt; 得到的是 < 而不是尖括号。全部在浏览器本地完成。