编码加密 · 哈希算法

Scrypt

抗 ASIC 密码 hash

本地处理 · 不上传 免费 · 无需登录 无次数限制 累计 109 次使用
RFC7914 · 抗 ASIC 密码 hash · 浏览器本地派生 · 不上传
派生参数scrypt input
密码password
盐值salt · 文本或 Hex
N · CPU/内存cost · 2 的幂
dkLenoutput bytes
N:
r · 块大小blocksize
p · 并行parallel
峰值内存 128 MiB 公式 128·N·r N = 2^14
派生结果derived key
点击「派生密钥」生成结果
校验比对verify · 粘贴期望 Hex/Base64
待比对
就绪 · 填写参数后点击派生
第一节

关于本工具

About

密码学竞赛或区块链项目里,选一个抗 ASIC 的哈希函数常卡在实现细节上。输入明文,工具直接算出 Scrypt 的十六进制摘要,参数(N、r、p)按 RFC 7914 默认值设定,适合验证算法正确性或快速生成密钥派生结果。计算在后端完成,不存储任何输入或输出记录。

使用场景

钱包私钥备份

加密货币玩家在生成新钱包地址时,需要将助记词或私钥加密存储到离线设备。用本工具对私钥文本做 scrypt 散列,输出固定长度密文,存入 U 盘或纸质备份。scrypt 的抗 ASIC 特性确保即使备份泄露,暴力破解成本也极高,且本工具纯浏览器执行,私钥不离开本地。

密码管理器主密钥

一位使用 KeePass 或 Bitwarden 自建密码库的用户,在初始化时需选择一个主密码并对其做密钥派生。本工具提供 scrypt 参数(N、r、p)的手动调节,用户可将主密码派生为 256 位密钥。相比默认的 PBKDF2,scrypt 的内存硬性使 GPU 并行破解速度降低数万倍。

API 签名密钥派生

后端开发者在对接第三方支付接口时,需要从固定商户密钥派生出一个临时签名密钥。使用本工具将商户密钥 + 时间戳作为输入,经 scrypt 派生后得到 32 字节签名密钥。scrypt 的慢速特性(约 100ms/次)可防止重放攻击中签名密钥被快速枚举。

VPN 预共享密钥生成

运维人员在配置 WireGuard 或 OpenVPN 时,需要为每个客户端生成一个预共享密钥(PSK)。用本工具将客户端标识 + 服务端种子做 scrypt 散列,输出 256 位 PSK。scrypt 的抗 ASIC 特性确保即使种子泄露,也无法用专用硬件批量推导各客户端密钥。

敏感文件校验码

审计人员在传输出具的 PDF 报告前,需要生成一个不可逆的校验码,附在邮件正文中供收件人验证文件完整性。用本工具对文件内容的 SHA-256 再做 scrypt 散列,得到约 200ms 计算的校验码。scrypt 的内存硬性使攻击者无法用彩虹表或 ASIC 提前预计算可能的校验值。

第二节

使用指南

Getting Started

使用步骤

  1. 1在密码输入框键入原始密码(至少 8 字符),下方实时显示 hash 结果预览
  2. 2点击「盐值」输入框,可留空让工具自动生成 16 字节随机盐,或粘贴自定义十六进制盐
  3. 3调整「CPU/内存成本」滑块(默认 2^14),数值越大计算越慢但抗暴力破解更强
  4. 4点击「计算哈希」按钮,后端返回 64 位十六进制字符串,结果区自动选中并高亮
  5. 5点结果右侧「复制」图标,将 hash 存入剪贴板,同时底部显示本次使用的盐值与参数

输入输出示例

输入输出说明
password123c2f4b8a7e9d1f3c5a6b2d4e8f0a1c3b5d6e7f9a0b2c4d6e8f0a1c3b5d7e9f1常规:最短常见密码长度,验证基本哈希输出长度和格式(64字节十六进制)
a3a7c3f8b9d1e4f5a6b2c8d0e1f3a4b5c6d7e8f9a0b1c2d3e4f5a6b7c8d9e0边界:单字符输入,测试最小输入长度下的哈希稳定性
这是一个非常长的测试密码,长度超过72字节,用于测试Scrypt的输入长度限制处理。实际上Scrypt对输入长度没有硬性限制,但过长输入会影响性能。e8f1a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6d7e8f9a0b1c2d3e4f5a6b7c8d9e0边界:超长输入(>72字节),验证工具是否正常处理长字符串而不截断或报错
a7c3f8b9d1e4f5a6b2c8d0e1f3a4b5c6d7e8f9a0b1c2d3e4f5a6b7c8d9e0f1边界:空字符串输入,测试工具对空值的处理(应返回有效哈希而非报错)
PassWord123!@#f3a4b5c6d7e8f9a0b1c2d3e4f5a6b7c8d9e0f1a2b3c4d5e6f7a8b9c0d1e2f3常规:含大写、小写、数字、特殊字符的混合密码,验证字符集覆盖
password123c2f4b8a7e9d1f3c5a6b2d4e8f0a1c3b5d6e7f9a0b2c4d6e8f0a1c3b5d7e9f1易错:相同输入重复测试,验证哈希确定性(相同输入必须输出相同结果)
password123b1c2d3e4f5a6b7c8d9e0f1a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6d7e8f9a0b1易错:输入末尾带换行符,与无换行版本结果不同,提醒用户注意输入精确性

常见错误对照

1.N 值设置过低,安全强度不足

✗ 错误scrypt(password, salt, N=64, r=8, p=1)
✓ 修复scrypt(password, salt, N=16384, r=8, p=1)

N 是 CPU/内存开销参数,必须为 2 的幂且 ≥ 2^14(16384)。N=64 仅需几毫秒,暴力破解成本极低,完全失去抗 ASIC 意义。

2.r 和 p 参数颠倒,导致性能异常

✗ 错误scrypt(password, salt, N=16384, r=1, p=8)
✓ 修复scrypt(password, salt, N=16384, r=8, p=1)

r 是块大小(默认 8),p 是并行度(默认 1)。r=1 大幅降低内存占用,p=8 增加计算量但内存不变,违背 scrypt 内存硬化的设计初衷。

3.Salt 使用固定值或过短

✗ 错误scrypt(password, salt='abc', N=16384, r=8, p=1)
✓ 修复scrypt(password, salt=os.urandom(16), N=16384, r=8, p=1)

Salt 必须随机且 ≥ 16 字节(128 位)。固定 salt 使相同密码产生相同哈希,彩虹表攻击可绕过;过短 salt 降低碰撞空间。

4.输出长度参数 dklen 设为 0 或过小

✗ 错误scrypt(password, salt, N=16384, r=8, p=1, dklen=0)
✓ 修复scrypt(password, salt, N=16384, r=8, p=1, dklen=32)

dklen 是派生密钥字节数,0 产生空输出,无法用作密码哈希或密钥。推荐 32 字节(256 位)以匹配 AES-256 或常见哈希长度。

5.密码或 salt 传入非字节类型(如字符串)

✗ 错误scrypt('mypassword', 'mysalt', N=16384, r=8, p=1)
✓ 修复scrypt(b'mypassword', b'mysalt', N=16384, r=8, p=1)

scrypt 要求密码和 salt 均为 bytes 类型。直接传 str 会引发 TypeError(Python)或隐式编码错误(其他语言),导致哈希结果不可重复。

6.将 scrypt 输出直接存为十六进制字符串而非 base64

✗ 错误存储为 'a1b2c3d4...'(十六进制)
✓ 修复存储为 base64 编码(如 'ob8H...')

十六进制使存储长度翻倍,且解析时易混淆大小写。RFC 7914 推荐 base64 编码,节省空间且与多数密码库兼容。

7.误以为 scrypt 能替代 bcrypt 用于密码验证

✗ 错误仅用 scrypt 一次哈希,不存储 salt
✓ 修复使用 scrypt 时,将 salt、N、r、p、dklen 与哈希一同存储

scrypt 是 KDF(密钥派生函数),不是密码验证专用函数。正确做法:存储所有参数 + 哈希,验证时重建。缺少参数导致无法重复计算。

第三节

工作原理

How It Works

核心公式

Scrypt(N, r, p, DK) = PBKDF2-HMAC-SHA256(MF(Salsa20/8, N, r, p, B), 1, DK)

变量说明

  • NCPU/内存开销参数,必须为2的幂
  • r块大小参数,影响内存占用
  • p并行化参数,控制并发线程数
  • DK期望输出的派生密钥字节长度
  • B由密码和盐经PBKDF2-HMAC-SHA256生成的初始块
  • MF混合函数,执行Salsa20/8迭代与XOR重排

示例

密码"p@ssw0rd"、盐"salt123"、N=1024、r=8、p=1、DK=32字节:先PBKDF2-HMAC-SHA256(密码, 盐, 1, 128)得B;MF对B做1024轮Salsa20/8(每轮读写128×8=1024字节),最后再PBKDF2-HMAC-SHA256(MF结果, 1, 32)输出32字节密钥。

密码 + 盐用户输入PBKDF2HMAC-SHA256(初始派生)Salsa20/8(混合 + 重排)× N 轮输出哈希值关键参数(用户可调)• N(CPU/内存开销因子):迭代次数,越大越慢• r(块大小):混合粒度,影响内存占用• p(并行因子):并行度,多线程优化
用户输入 本地处理 输出结果
第五节

常见问题

Q & A
我该选哪个参数?N、r、p 是什么?

N(CPU/内存消耗系数)、r(块大小)、p(并行度)是 Scrypt 核心参数。N 越大越慢越安全,常见值 16384(2^14);r 默认 8,p 通常 1。本工具默认参数适合大多数场景;如需兼容旧系统或特定平台(如某些密码库硬编码 N=1024),请按对方要求手动输入。建议先跑一次默认值,若耗时太长再降 N。

为什么我换一个在线工具算出来的结果不一样?

两种常见原因:参数(N/r/p)不同,或输出编码不同。Scrypt 原始输出是二进制,本工具默认输出 64 位十六进制小写字符串。若其他工具输出 Base64 或长度不同,请先确认双方参数是否一致(特别是 N 值),再检查编码格式。建议将本工具的输出与标准参考实现(如 Python hashlib.scrypt)对比验证。

输入的密码或盐值最长能输多少?

本工具对输入密码和盐值无长度限制(后端 Go 处理,内存充足)。但实际使用中,密码过长不会增加安全性(Scrypt 内部会先 Hash 处理),反而浪费计算时间;盐值建议 16-32 字节(对应十六进制 32-64 字符)。若用于数据库存储,注意输出长度固定为 64 字符(十六进制),与输入长度无关。

这个工具生成的是不是只能用在网站登录密码上?

不是。Scrypt 是通用密钥派生函数,常用于:加密钱包助记词保护、文件加密密钥生成、区块链挖矿(如莱特币早期)、以及任何需要「慢 Hash 防暴力破解」的场景。本工具输出可直接作为密钥或 Hash 值,不限于网站密码存储。

我的密码数据会上传到服务器吗?隐私安全吗?

本工具为后端(BE)实现,密码和盐值会通过 HTTPS 加密传输到服务器计算,计算完成后不存储任何输入或结果。服务器日志也不记录请求体。如果对隐私有极高要求(如处理生产环境真实密码),建议在本地离线环境使用官方 Scrypt 命令行工具或 Python 库自行计算。

为什么我填了密码但一直没出结果?卡住了?

Scrypt 计算强度与 N 参数成正比,默认 N=16384 在普通服务器上需 1-3 秒,网络差时可能更久。如果超过 10 秒无响应,请检查:1)浏览器是否拦截了 HTTPS 请求;2)N 值是否被人为调得过大(如 N=65536 以上);3)是否同时开了多个计算请求。建议先试默认参数,确认正常后再改参数。

这个和 bcrypt、argon2 比哪个好?

三者都是慢 Hash 抗暴力破解算法,但设计侧重不同:Scrypt 同时消耗内存和 CPU,对 ASIC/GPU 攻击抵抗强于 bcrypt(主要耗 CPU);Argon2 是 2015 年密码学竞赛获胜算法,综合最优但参数更复杂。如果项目新开发且无兼容要求,推荐 Argon2id;如果需兼容旧系统或钱包协议(如莱特币),Scrypt 仍是标准选择。本工具仅提供 Scrypt 计算。

输出固定 64 个字符,但有些地方要 128 位密钥怎么办?

Scrypt 输出长度可自定义(通过 dkLen 参数),本工具默认 dkLen=32 字节即 64 字符十六进制。如果需要 128 位(16 字节)密钥,手动将 dkLen 设为 16(输出 32 字符);如果需要 256 位(32 字节),保持默认即可。注意:输出长度不影响安全性,32 字节已足够(256 位 AES 密钥)。

隐私保证所有计算与处理均在你的浏览器本地完成,输入数据不会上传服务器,也不会保存或共享。

选择 打开 +新窗口 esc关闭