packetlost / WebScrypt

a fast and lightweight scrypt hash algorithm for browser

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

WebScrypt

一个浏览器版的 scrypt 算法,性能高、体积小。

该脚本适用于网站注册、登录等场合的口令加固。旨在不增加服务端硬件投入的前提下,将拖库后暴力破解口令的难度提升多个数量级。此外,对撞库攻击、隐私嗅探也能起到一定的防护。

scrypt 简介

scrypt 是一种密码学 Hash 函数,专门用于处理口令。

相比 PBKDF2、bcrypt 只有时间成本,scrypt 还可设定空间成本,该特征能使 GPU 等硬件设备破解 Hash 时,瓶颈出现在内存上。

另外 scrypt 支持并发维度,可充分利用多线程提高工作量,使破解难度成倍增加。

详细讲解

前端计算

口令 Hash 函数的计算成本,决定了暴力破解的难度。但过高的成本,也会给服务器带来压力。通常只能在性能和安全之间折中。

如今浏览器的性能有了极大提升,因此可将口令 Hash 在前端计算,用其结果 dk 取代明文口令提交;后端收到 dk 后使用普通快速的 Hash 函数进行处理,即可安全存入数据库中。

未来即使被拖库,攻击者也是无法通过 hash 值破解 dk 的。口令虽能破解,但需花费很大的成本。

使用这种方案,既能减轻服务端的计算压力,又可获得高强度的安全。

演示

WebScrypt API

为何不用 argon2

2015 年 P-H-C 胜出者 argon2,是目前最新的口令 Hash 函数。OWASP 在 Password Storage Cheat Sheet 中,也推荐开发者首选该算法。

既然 argon2 比 scrypt 更先进,为什么本项目不使用?事实上,之前已有人尝试将 argon2 移植到浏览器,但遇到一个棘手的问题:argon2 大量使用了 64 位整数计算,而 JavaScript 并没有原生的 64 位整数,只能通过模拟实现,因此效率非常低。(asm.js 作为 JS 的子集自然也不支持。另外 Flash 虚拟机 AVM2 同样不支持 64 位整数)

所以算法未必越新越好,还得看实际运行的环境,能否提供充足的支持。

探讨

探讨一些前端技术、隐私安全相关的话题。

更新中

  • 细节完善

  • 增加 PNaCl、WebAssembly 模块

  • 各种浏览器的测试案例、性能对比图表

  • 应用案例

About

a fast and lightweight scrypt hash algorithm for browser


Languages

Language:JavaScript 82.3%Language:TypeScript 6.2%Language:C 5.8%Language:ActionScript 3.1%Language:HTML 1.0%Language:Makefile 0.7%Language:Python 0.5%Language:CSS 0.2%Language:PHP 0.2%