当前位置: 首页 > news >正文

使用JavaScript生成安全的随机密码 - 技术解析与实践

使用JavaScript生成安全的随机密码

最近我需要用JavaScript代码生成随机密码,但惊讶地发现很难找到正确的实现方法。Google、StackOverflow甚至ChatGPT提供的大多数方案都存在各种缺陷。

常见错误方案分析

错误示例1:使用不安全的Math.random()

/* 弱随机数生成器示例,禁止使用 */
var chars = "0123456789abcdefghijklmnopqrstuvwxyz!@#$%^&*()ABCDEFGHIJKLMNOPQRSTUVWXYZ";
var passwordLength = 12;
var password = "";
for (var i = 0; i <= passwordLength; i++) {var randomNumber = Math.floor(Math.random() * chars.length);password += chars.substring(randomNumber, randomNumber +1);
}

MDN文档明确指出:Math.random()不提供加密安全的随机数,任何安全相关场景都应使用Web Crypto API的window.crypto.getRandomValues()方法。

错误示例2:浮点数舍入偏差

/* 存在浮点舍入偏差的示例,禁止使用 */
function generatePassword(length = 16) {let generatedPassword = "";const validChars = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ,.-{}+!\"#$%/()=?";for (let i = 0; i < length; i++) {let randomNumber = crypto.getRandomValues(new Uint32Array(1))[0];randomNumber = randomNumber / 0x100000000;randomNumber = Math.floor(randomNumber * validChars.length);generatedPassword += validChars[randomNumber];}return generatedPassword;
}

此方案虽然使用了加密安全的随机数,但通过浮点数转换会引入不均匀分布问题。

错误示例3:模偏差问题

/* 存在模偏差的示例,禁止使用 */
var generatePassword = (length = 20,characters = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz~!@-#$'
) =>Array.from(crypto.getRandomValues(new Uint32Array(length))).map((x) => characters[x % characters.length]).join('')

当随机数范围不是字符集大小的整数倍时,会导致某些字符出现概率更高。

正确实现方案

拒绝采样法

function simplesecpw() {const pwlen = 15;const pwchars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";const limit = 256 - (256 % pwchars.length);let passwd = "";let randval;for (let i = 0; i < pwlen; i++) {do {randval = window.crypto.getRandomValues(new Uint8Array(1))[0];} while (randval >= limit);passwd += pwchars[randval % pwchars.length];}return passwd;
}

该方案具有三个关键特性:

  1. 使用加密安全的crypto.getRandomValues()
  2. 完全避免浮点数运算
  3. 通过拒绝采样消除模偏差

在线演示可在https://password.hboeck.de/体验,代码已开源发布在GitHub。
更多精彩内容 请关注我的个人公众号 公众号(办公AI智能小助手)
公众号二维码

http://www.sczhlp.com/news/4237/

相关文章:

  • Atcoder Beginner Contest 417 A-C,E
  • 实用指南:【Keras学习笔记】开发环境搭建
  • redis
  • 怎么配置windows与远程服务器免密登录
  • 2025熵密杯 -- 初始谜题 -- Reproducibility
  • 测试主题
  • Extreme_Parkour复现及相关问题汇总
  • P1812 区间运算 题解
  • ctfshow web入门 常见姿势 Web801-Web810
  • 多模态指代消解模型在挑战赛中夺冠
  • CSP初赛知识点(Part2):基础算法与运算
  • 2025.8.2 随记
  • 软考系统分析师每日学习卡 | [日期:2025-08-01] | [今日主题:页式存储]
  • 软考系统分析师每日学习卡 | [日期:2025-08-02] | [今日主题:段式存储]
  • AtCoder Beginner Contest 417 ABCDEF 题目解析
  • 暑假学习笔记
  • SpringCloud微服务
  • 快速莫比乌斯变换(FMT)与卷积
  • Redis教程-持久化(RDB) - 智慧园区
  • 开发终端神器 Cmder 使用配置教程
  • 三种软件观测方法
  • day7_vite
  • 周总结
  • 8.2随笔
  • 树形 dp
  • 武大图书馆
  • 常见的索引失效情况
  • 20250802
  • Ctorch开发日志——矩阵乘法优化及数学原理 - Ghost
  • 27天