scrypt 哈希计算

免费在线 scrypt 哈希计算 工具。100% 本地计算,数据不离开您的设备,隐私安全有保障。

General
Password Hashing / KDF
Specialized
Deprecated
bytes
输出

结果将显示在这里...

输入 计算哈希

使用指南

关于 scrypt

scrypt(RFC 7914)是一种内存困难型基于密码的密钥派生函数,设计目标是同时消耗大量 CPU 时间和内存资源。它的诞生是为了抵御威胁 PBKDF2 和 bcrypt 的 GPU、FPGA 和 ASIC 暴力破解攻击。scrypt 被用于莱特币(Litecoin)工作量证明、密码管理器和安全密钥派生场景。三个成本参数让您可以灵活调节安全性与性能之间的平衡。

scrypt 是 KDF,不是哈希函数。它从密码和盐值派生密钥——不同参数下的输出不可直接比较。请务必存储完整的参数字符串(n:r:p:salt:key),以便未来验证。

使用步骤

scrypt 是单向密钥派生函数,无法逆向还原:

1. 输入密码在输入框中输入需要派生密钥的密码
2. 配置参数设置 N(CPU/内存成本)、r(块大小)、p(并行度)。默认值(N=16384, r=8, p=1)适合交互式登录场景
3. 派生密钥点击「加密」按钮——输出格式为 n:r:p:salt_base64:key_hex
4. 验证密码验证时,将完整输出字符串附在密码后,用 | 分隔(如 mypassword|16384:8:1:salt:keyhex),然后点击「解密」
隐私保护:所有派生运算完全在浏览器本地执行,您的密码不会被传输到任何服务器。

输出格式

scrypt 输出完整的参数字符串,包含未来验证所需的所有信息:

格式n:r:p:salt_base64:key_hex(例如 16384:8:1:abc123...:d4e5f6...)
NCPU 和内存成本因子——必须是 2 的幂次方(例如 16384 = 2¹⁴)
r块大小参数——影响内存带宽消耗
p并行化因子——独立于内存增加 CPU 成本
盐值每次派生自动生成的 16 字节随机盐值(Base64 编码)
密钥32 字节派生密钥(十六进制编码)

选择 scrypt 参数

根据安全需求和可接受的延迟选择合适的参数:

交互式(登录)N=16384, r=8, p=1 — 现代硬件约 100ms,适合 Web 身份验证
高安全(文件加密)N=1048576, r=8, p=1 — 现代硬件约 5 秒,适合磁盘加密密钥派生
N 必须是 2 的幂有效值:1024、2048、4096、8192、16384、32768、65536、131072、262144、524288、1048576
内存占用约 128 × N × r 字节(例如 N=16384, r=8 → 约 16 MB)
对于新应用,建议考虑 Argon2id(密码哈希竞赛冠军,NIST 和 OWASP 推荐)。scrypt 非常优秀且广泛部署,但 Argon2id 的参数模型更简单。

常见问题

Q: scrypt 为什么能抵御硬件攻击?

A: scrypt 是内存困难型算法:其内部 ROMix 算法需要以伪随机顺序访问一大块内存(128 × N × r 字节)。这种顺序内存访问模式无法像 SHA-256 那样并行化——N=16384, r=8 时需要随机访问约 16 MB 内存,与纯计算型哈希(如 SHA-256 或 PBKDF2)相比,在 GPU/ASIC 硬件上的攻击成本高出数个数量级。

Q: scrypt 与 bcrypt 和 Argon2 有什么区别?

A: 三者都是密码哈希算法,但设计理念不同:bcrypt(1999)仅具有时间困难性(固定 4 KB 内存),对 GPU 攻击的抵御能力日益减弱。scrypt(2009)具有内存困难性,能抵御 GPU/ASIC,但参数之间存在复杂交互(增大 N 同时通过 p 增加 CPU 成本)。Argon2id(2015,PHC 冠军)具有内存困难性、抗 GPU,且时间/内存/并行度参数相互独立。OWASP 和 NIST 推荐新系统使用 Argon2id,scrypt 是强力的第二选择。

Q: 为什么 N 必须是 2 的幂次方?

A: scrypt 的 ROMix 算法内部将 N 用作查找表的大小,并依赖位掩码运算(index & (N-1))实现高效随机访问。这种掩码技巧只有在 N 为 2 的幂次方时才能正确工作。常用值:交互式场景用 16384(2¹⁴),文件加密用 1048576(2²⁰)。

Q: scrypt 的输出可以直接用作密码学密钥吗?

A: 可以——scrypt 专门设计用于产生密钥材料。32 字节(256 位)的输出可直接用作 AES-256 密钥或 ChaCha20-Poly1305 密钥。但切勿将同一个 scrypt 派生结果用于多种用途(例如同时用于认证和加密)——应使用不同的盐值派生独立密钥,或使用 HKDF 等 KDF 从一个根密钥扩展出多个子密钥。

Q: 验证时的输入格式是什么?

A: 要验证密码与存储的 scrypt 哈希是否匹配,请将密码和完整的 scrypt 输出字符串用管道符分隔:password|16384:8:1:salt_base64:key_hex。工具会使用存储的参数重新派生密钥,并与存储的密钥进行比较。匹配时返回「✓ 密码验证成功」。

Q: scrypt 适合用于数据库密码存储吗?

A: 适合,但需要配置合适的参数。每个用户存储完整字符串(n:r:p:salt:key)——它包含未来验证所需的所有信息。交互式登录至少使用 N=16384, r=8, p=1;对于更高安全要求的应用可增大 N。请参阅 OWASP 密码存储速查表 获取最新建议。

使用场景

推荐:密码存储

scrypt 是将密码存入数据库前进行哈希的绝佳选择。其内存困难特性使离线暴力破解的成本比 PBKDF2 或 bcrypt 高出数个数量级。Web 应用使用 N≥16384,对于更敏感的系统可进一步增大参数。

推荐配置:
  • ✅ 交互式 Web 登录使用 scrypt N=16384, r=8, p=1
  • ✅ 存储完整的 n:r:p:salt:key 字符串——绝不能只存密钥
  • ✅ 每个用户使用唯一随机盐值(本工具自动生成)
  • ❌ 不要使用 N<1024 的 scrypt——工作因子不足
  • 💡 新项目可考虑 Argon2id——目前的 OWASP 首选
推荐:磁盘加密密钥派生

scrypt 非常适合从口令派生磁盘或文件加密密钥。更高的参数(N=1048576)是合适的,因为派生操作只在挂载时执行一次,几秒钟的延迟是可接受的。派生出的密钥可直接用于 AES-256-GCM。

推荐配置:
  • ✅ 磁盘/文件加密密钥派生使用 scrypt N=1048576(2²⁰)
  • ✅ 32 字节输出可直接用作 AES-256-GCM 密钥
  • ✅ 将 scrypt 参数和盐值与加密数据一同存储
  • ❌ 不要将同一派生密钥同时用于认证和加密
推荐:加密货币应用

scrypt 被莱特币(Litecoin)(及其他加密货币)采用为工作量证明算法。在钱包应用中,scrypt 用于从助记词或口令派生私钥。其内存困难特性正是为了抵御 ASIC 矿机优势而被采用的。

推荐配置:
  • ✅ 从用户口令派生钱包密钥使用 scrypt
  • ✅ 口令保护密钥存储使用 scrypt
  • ❌ 对于 PoW 挖矿应用,请使用特定实现的参数
不推荐:无需认证的场景

scrypt 派生的是密钥——它本身不提供认证或完整性保护。如果需要消息认证码,请使用 HMAC-SHA256。如果需要快速数据校验,请使用 SHA-256。scrypt 的计算成本使其不适合高吞吐量操作。

推荐配置:
  • ❌ scrypt 不适合通用哈希(请使用 SHA-256)
  • ❌ scrypt 不适合 HMAC 或消息认证
  • ❌ scrypt 不适合高频操作(API 请求签名、单次请求令牌等)
  • ✅ 仅在明确需要密码保护特性时才使用 scrypt

最佳实践摘要

  • scrypt 是内存困难型 KDF——适用于密码哈希和从口令派生密钥。
  • 始终存储完整的参数字符串(n:r:p:salt:key)——绝不能只存密钥。
  • N 必须是 2 的幂;默认 N=16384, r=8, p=1 适合交互式登录。
  • 对于新应用,OWASP 推荐 Argon2id 作为首选;scrypt 是强力的第二选择。
  • scrypt 不适合通用哈希、消息认证码或高频操作——这些场景请使用 SHA-256 或 HMAC。

讨论与反馈

0 条评论