文章

Aurora PassGen:我做了一个纯前端密码生成器

介绍 Aurora PassGen 极光密码生成器:使用 Web Crypto 在浏览器本地生成密码,支持随机字符、密码短语、自定义格式、批量导出和四套界面,无需后端或构建。

Aurora PassGen:我做了一个纯前端密码生成器

最近我写了一个小工具:Aurora PassGen · 极光密码生成器。它可以按指定规则生成随机密码,也支持由单词组成的密码短语,以及固定格式的密码模板。

整个项目使用原生 HTML、CSS 和 JavaScript 编写,没有后端、数据库和构建步骤。打开页面后,密码直接在浏览器里生成,不需要注册,也不用把生成任务交给服务器。

在线体验:打开 Aurora PassGen

项目源码:Bingwithyou/Aurora-Passgen

从“生成一串字符”到适配实际规则

密码生成器的核心操作很简单:选择长度,点击生成,再复制使用。真正麻烦的地方,往往是各个网站对密码的要求不同:有的要求同时包含大小写字母、数字和符号,有的只接受少数特殊符号,还有的要求第一位必须是字母。

Aurora PassGen 把这些规则做成了可以调整的选项。在 Aurora 主界面中,密码长度可以设为 4–64 位,大小写字母、数字和符号可以分别开关,还能进一步设置:

  • 每种已选字符类型至少出现一次;
  • 排除 0Ol1 等容易混淆的字符;
  • 自定义排除字符,以及允许使用的符号集合;
  • 字符不重复;
  • 首位必须为字母。

例如,某个网站只接受 !@# 三种符号,就可以把允许的符号集设为 !@#,让结果直接适配它的规则。经常使用的配置也能保存为命名模板,下次直接套用。

这些选项主要用于满足格式要求,不是勾选得越多就一定越强。如果规则本身无法满足,例如只启用小写字母,却要求生成 40 位不重复密码,页面会显示错误提示,方便继续调整。

三种生成模式

随机字符:按长度与字符集生成

这是最直接的模式。选择需要的字符类型与长度,页面就会生成一串新密码。项目也提供了默认、高强度、网站兼容、易读、数字 PIN 等预设,减少反复调整选项的操作。

首页内嵌了一个快速生成器;需要排除字符、保存规则或批量处理时,可以进入功能更完整的 Aurora 界面

密码短语:用随机单词组合

有时需要手动输入或朗读密码,一长串混合字符不太方便。密码短语模式会从内置词库中随机选择单词,按指定分隔符拼接,也可以开启首字母大写、追加数字和符号。

下面只是格式示例,请不要直接拿来作为真实密码:

1
Harbor-Velvet-Cricket-Maple-73

这里的单词来自随机抽取。短语的强度取决于词库规模、单词数量和附加随机部分,不能仅凭字符串看起来很长来判断;分隔符和固定的大小写转换也不会凭空增加随机性。

自定义格式:让每个位置遵循模板

如果目标系统有明确的格式要求,可以使用模板模式。例如:

1
Aaaa-####-$$$$

这个模板表示一个大写字母、三个小写字母、四个数字和四个符号,中间用连字符分隔。主要占位符如下:

占位符含义
a小写字母
A大写字母
#数字
$特殊符号
?任意大小写字母
%字母或数字
*当前启用的全部字符

普通连字符等内容会原样保留;如果想输出占位符本身,可以用反斜杠转义。固定文字只决定格式,不增加随机性。

随机数从哪里来

密码生成不能只看输出是否“像乱码”。Aurora PassGen 的随机源是浏览器提供的 crypto.getRandomValues(),生成密码的逻辑不使用 Math.random()。如果浏览器没有提供所需的 Web Crypto 能力,引擎会报错并停止生成。

从随机整数中选择字符时,项目还使用了拒绝采样,避免直接取模带来的概率偏差。

可以用一个小例子理解:假设随机源等概率产生 0–9,而我们需要从三个字符中选一个。直接计算余数 n % 3,余数 0 会出现四次,余数 1 和 2 各出现三次,三个字符的概率就不相等。先丢弃 9,只接受 0–8,再取模,三种结果就各占三次。

引擎对 32 位随机整数采用同样的思路:只接受能均分到目标范围的那一部分,再计算字符下标。这解决的是随机下标的取模偏差;加入复杂格式约束后,完整密码的分布仍需要单独考虑。

密码会被保存或上传吗

生成逻辑在本地运行,页面没有接入第三方字体、CDN 或统计脚本,也没有上传密码的接口。通过在线地址访问时,浏览器仍然需要下载 HTML、CSS 和 JavaScript;资源加载完成后,生成过程不需要额外的网络请求。

项目对不同数据的处理方式是:

数据处理方式
当前生成结果、批量结果保留在页面内存中,不主动写入本地存储
复制记录仅在页面内存中保留,刷新后清空
生成选项、命名模板、语言与主题偏好保存在当前浏览器的 localStorage
主动复制或导出的密码进入系统剪贴板,或保存为用户下载的明文文件

因此,“不自动保存密码”与“可以导出密码”并不矛盾:前者是页面默认的数据处理方式,后者是用户主动执行的操作。模板保存的是规则;如果自己在模板内容中填入固定文字,这些文字也会随配置一起保存。

Aurora 界面还提供可选的 30 秒剪贴板自动清理。它依赖页面继续运行及浏览器允许写入剪贴板,不能保证清除系统剪贴板历史。这个工具负责生成密码,长期保管仍应交给专门的密码管理工具。

一套引擎,四种界面

除了生成功能,我也给这个项目做了四套视觉风格。首页可以选择界面,各个主题也能返回首页切换。

界面视觉特点
Aurora · 极简卡片卡片布局,密码字符按类型着色,支持深浅色切换
Terminal · 终端极客荧光绿、扫描线,以及随设置变化的命令行风格展示
Glass · 毛玻璃渐变渐变背景、半透明面板与单栏布局
Brutalist · 新粗野主义粗描边、硬阴影与高饱和撞色

四套界面共用生成引擎和交互控制层,具体展示的控件可以不同。Terminal 中的命令行是对当前配置的可视化表达,项目本身没有提供需要安装的 passgen 命令。

页面支持中英文切换。重新生成时,字符会原位翻滚,再从左到右定格;如果系统启用了减少动态效果,生成动画会跳过。在启用快捷键的界面中,还可以按 R 重新生成、按 C 复制,编辑输入框时不会触发这些快捷键。

强度数值应该怎么看

页面会根据生成配置显示熵值、五档强度和暴力猜测耗时估算。对于允许重复、每一位独立均匀选择字符的简单模型,计算方式是:

1
熵值(bits)= 密码长度 × log2(字符池大小)

不重复模式会考虑每次选择后剩余字符数的变化;密码短语根据词库大小与单词数计算;格式模板则累计各个随机位置的贡献。

不过,当前估算没有完整建模“每类至少一个”“首位为字母”等约束及其生成分布,因此不应把显示值理解为所有配置下的精确熵值。破解耗时也建立在每秒尝试 10¹⁰ 次的固定假设上,并不是针对某个网站测得的实际时间。

这些数值适合帮助比较配置变化,例如增加长度后候选空间如何扩大,而不是承诺密码能在现实中安全多少年。

原生前端也可以把逻辑分清楚

项目没有引入前端框架,主要逻辑分在三个文件中:

1
2
3
assets/js/core.js        随机数、密码生成、规则处理与强度估算
assets/js/i18n.js        中英文词典与语言切换
assets/js/controller.js  控件绑定、复制、批量导出与配置保存

其中,core.js 不依赖 DOM,可以单独调用。界面通过 data-pg 属性标记输出区域、按钮和输入控件,再由 PassGen.mount(...) 绑定交互。新增一种界面时,可以继续复用这套逻辑。

引入生成引擎后,调用方式也很直接:

1
2
3
4
5
6
7
8
9
10
11
// 生成 20 位、不含符号的随机密码
PassGen.generate({ length: 20, symbol: false });

// 生成由 5 个随机单词组成的密码短语
PassGen.generate({ mode: 'passphrase', words: 5 });

// 按固定格式生成
PassGen.generate({ mode: 'pattern', pattern: 'Aaaa-####-$$$$' });

// 批量生成 10 个密码
PassGen.generateMany({ length: 16 }, 10);

Aurora 界面还可以把批量结果一次性复制,或导出为 .txt 文件。保存常用规则、应用模板和查看本次页面会话中的复制记录,也都由共享控制层处理。

本地运行与测试

项目没有构建步骤。克隆仓库后可以直接打开 index.html,也可以用静态文件服务器预览:

1
2
3
git clone https://github.com/Bingwithyou/Aurora-Passgen.git
cd Aurora-Passgen
npx serve .

直接打开文件时,生成功能可以运行;复制是否成功仍取决于浏览器的剪贴板限制,项目提供了复制回退逻辑。

仓库内有两组不依赖额外测试框架的 Node.js 测试:

1
2
node tests/run.js
node tests/site.js

前一组检查随机数区间、生成规则、模板展开、密码短语和熵值计算,后一组检查首页结构、主题导航、SEO 资源与本地链接。GitHub Actions 工作流会先运行这两组测试,通过后再部署静态页面。

Aurora PassGen 已经以 MIT 协议开源。如果你想试试不同风格的密码生成界面,或者看看不依赖框架的前端小工具如何组织代码,欢迎在线体验,也欢迎到 GitHub 仓库交流问题和改进建议。

本文由作者按照 CC BY 4.0 进行授权