scrypt 是一个「慢哈希」密码派生函数(KDF)。和 MD5 / SHA 不同,它故意设计得又慢又耗内存:算一次要占用 128 × N × r × p 字节内存。这让攻击者没法用 GPU / ASIC 大规模并行爆破 —— 加内存比加算力贵得多。它常用于密码存储和从口令派生加密密钥(如钱包)。
| 参数 | 含义 | 说明 |
|---|---|---|
| N | CPU / 内存开销 | 必须是 2 的幂。工具里填指数,N = 2^logN。越大越慢越耗内存。 |
| r | 块大小 | 一般固定 8。 |
| p | 并行度 | 一般 1。 |
| dkLen | 派生长度(字节) | 密码存储用 32 足够;派生对称密钥按算法需要(AES-256 用 32)。 |
| Salt | 盐 | 每个密码一份的随机值,防彩虹表。留空工具会随机生成 16 字节。 |
强度建议(OWASP 密码存储备忘单):登录验证用 N=2¹⁷ (131072)、r=8、p=1(约 128 MB 内存)。低配环境可降到 2¹⁴;离线的高价值密钥可用 2²⁰。参数必须和验证时一致,所以要连同 N/r/p 一起存进「存储串」。
scrypt$N$r$p$salt$dk 存储串(同时给出 hex 和 base64 两种编码),显示所需内存估算和耗时。派生和校验全部在浏览器本地完成,密码不上传。别在任何在线页面输入生产环境的真实密码,本工具仅用于学习和测试。
Q:结果和 Node.js crypto.scryptSync / Python hashlib.scrypt 一样吗?
A:一样,只要参数(N、r、p、dkLen、salt)和密码字节(本工具按 UTF-8)都相同。本工具用的是 scrypt-js,与各语言标准实现互通。
Q:为什么算得很慢 / 浏览器卡住? A:N 太大。N=2²⁰、r=8 要约 1 GB 内存,纯 JS 实现会很慢甚至失败。日常测试用 2¹⁴~2¹⁷。
Q:scrypt 和 bcrypt、Argon2 怎么选? A:都比 PBKDF2 好。新项目首选 Argon2id;没有 Argon2 库时 scrypt 是很好的替代;bcrypt 仍安全但不耗内存、且有 72 字节密码截断问题。
Q:N 一定要是 2 的幂吗? A:是。这个工具让你填指数 logN,自动保证是 2 的幂。
Q:盐要保密吗? A:不用。盐和 N/r/p 一样是公开参数,和哈希一起存即可,它的作用是让每个密码的哈希都不同。