密码强度检测器
基于 zxcvbn 引擎实时分析:常见弱口令字典、键盘走位、连续序列、重复与日期模式都会扣分,比"大小写+数字+符号"的字符计数更接近真实安全性。全程本地计算,密码不出浏览器。
- 检测引擎
- zxcvbn
- 评分
- 0–4 五档
- 隐私
- 不上传
- 字典
- 内置常见弱口令
高级策略设置
逗号或换行分隔,不区分大小写。zxcvbn 会自动识别大小写变形、Leet 替换(如 Pa$$w0rd)和反转写法。
对比两个密码
WHY IT MATTERS
为什么"有大小写数字符号"不等于安全
P@ssw0rd! 四类字符齐全,却在真实泄露密码榜上有名。密码强度取决于猜测难度,而不是字符种类的算术。
弱口令字典匹配
内置常见密码与词表,命中即重罚;password、123456、P@ssw0rd 这类会被正确判为极弱。
模式识别
键盘走位、连续序列、重复片段、日期年份、常见单词都会显著降低有效猜测空间。
有效熵而非理论熵
评分基于识别出的结构估算真实猜测次数,而不是简单地用字符集大小乘长度。
两种破解场景
分别估算离线 GPU 爆破和在线限速猜测的时间,帮助建立对攻击成本的直觉。
自定义策略与黑名单
可设最小长度与字符要求,加入公司名、项目代号等专属弱词,适配企业口令规范。
全程本地计算
密码不离开浏览器,不经过任何服务器;设置仅存在你自己的 localStorage 中。
密码强度相关知识
关于评分原理、破解时间和怎样才算一个好密码。
zxcvbn 的 0–4 分是怎么算出来的?
zxcvbn 先把密码拆解成若干片段:字典词(常见密码、英文单词)、键盘走位、序列、重复、日期、暴力片段等。
然后对每个片段估算攻击者需要多少次猜测,取组合后的总数,再映射成 0–4 五档。它还会自动考虑大小写反转、Leet 替换(@→a、0→o)、年份后缀等常见变形,所以 P@ssw0rd 不会因为字符种类多就得高分。
"有效熵"和字符空间有什么区别?
字符空间是按字符集大小乘长度算出的理论上限,假设每个字符完全随机——真实密码几乎从不满足。
有效熵(本页显示的比特数)是 zxcvbn 识别完字典词和模式之后估算的真实猜测空间。例如长度相同的情况下,iloveyou2024 的有效熵远低于随机字符串。
破解时间是怎么估算的?可信吗?
破解时间 = 估计猜测次数 ÷ 每秒猜测速度。本页给两种速度:离线 GPU 集群约 100 亿次/秒(攻击者已拿到密码哈希),在线限速约 100 次/小时(登录接口有频率限制)。
它是数量级参考而非精确预言:真实速度取决于哈希算法(bcrypt/Argon2 比 MD5 慢几个数量级)、攻击者硬件和字典质量。但差 10 倍以内不影响结论——差几百万倍才有意义。
什么样的密码才算好?
两种可靠路线:一是密码管理器生成的 16 位以上随机字符串,每个站点不同;二是由 4 个以上互不相关的词组成的通关短语(如 correct-horse-battery-staple),长且无意义。
无论哪条路线,都应配合多因子认证(MFA),并且不要在多个网站复用同一个密码。
网站已经要求大小写数字符号,为什么还被打低分?
企业策略(长度、字符种类)是合规底线,回答的是「符不符合规定」;zxcvbn 评分回答的是「猜不猜得出来」。两者是正交的两件事。
在常见词后加个感叹号和年份(password!2024)能通过大多数策略检查,但在字典攻击面前几秒钟就会沦陷。
我的密码会被上传吗?
不会。检测完全在你的浏览器内用 JavaScript 完成,页面没有任何提交密码的网络请求;你也可以断网后使用。自定义策略保存在浏览器本地,同样不含密码明文。
如何通过编程语言检测密码强度
在自己的注册/改密表单里做实时强度检测,可以使用各语言的 zxcvbn 实现:
<!-- CDN -->
<script src="https://unpkg.com/[email protected]/dist/zxcvbn.js"></script>
<script>
const res = zxcvbn('P@ssw0rd!');
console.log(res.score, res.crack_times_display);
</script>
// npm i @zxcvbn-ts/core
import { zxcvbn } from '@zxcvbn-ts/core';
const result = zxcvbn('P@ssw0rd!');
console.log(result.score, result.guesses_log10);
composer require bjeavons/zxcvbn-php
<?php
require __DIR__ . '/vendor/autoload.php';
use ZxcvbnPhp\Zxcvbn;
$zxcvbn = new Zxcvbn();
$res = $zxcvbn->passwordStrength('P@ssw0rd!');
echo $res['score'];
pip install zxcvbn
from zxcvbn import zxcvbn
res = zxcvbn('P@ssw0rd!')
print(res['score'], res['crack_times_display'])
go get github.com/nbutton23/zxcvbn-go
package main
import (
"fmt"
zxcvbn "github.com/nbutton23/zxcvbn-go"
)
func main() {
res := zxcvbn.PasswordStrength("P@ssw0rd!", nil)
fmt.Println(res.Score, res.Guesses)
}
# Add dependency
cargo add zxcvbn
use zxcvbn::zxcvbn;
fn main() {
match zxcvbn("P@ssw0rd!", &[]) {
Ok(estimate) => {
println!("score: {}", estimate.score()); // 0..4
if let Some(times) = estimate.crack_times() {
println!("offline: {:?}", times.offline_slow_hashing_1e4_per_second());
}
}
Err(err) => eprintln!("zxcvbn error: {err}"),
}
}
说明:这些库给出的强度与模式估算可能与本页略有版本差异,核心原理一致。服务端检测时建议同时做长度上限和限流,避免被恶意超长输入消耗算力。
常见问题
密码强度检测器的工作原理是什么?
本页使用 Dropbox 开源的 zxcvbn 算法:它把密码与常见弱口令字典、英文词表、键盘走位、序列、日期和重复模式逐一比对,估算攻击者平均需要多少次猜测,再映射成 0–4 五档评分和破解时间。
P@ssw0rd 看起来很复杂,为什么只有极弱?
它是泄露密码库中最经典的弱密码之一。zxcvbn 的字典里包含它,并且能识别大小写变形和 Leet 替换(a→@、o→0)。字符种类多但结构完全可预测,攻击者的规则字典会第一批尝试它。
密码多长才算安全?
在随机生成的前提下,12 位以上通常已足够抵御在线攻击,16 位以上可以抵御离线 GPU 爆破很多年。长度比字符复杂度更重要:一个 20 位的纯小写随机串,远强于一个 10 位的四类字符混合密码。
为什么破解时间分离线和在线两种?
攻击场景不同:网站被拖库后,攻击者可以在本地用 GPU 每秒尝试上百亿个哈希;而在线登录接口通常有频率限制,每秒尝试不了几次。同一个密码在两种场景下的生存时间可能相差万亿倍,所以需要分开看。
检测结果会被保存吗?
不会。密码全程只在你的浏览器内存中,刷新即消失;只有你自定义的策略(长度要求、黑名单)会存在本地浏览器里,不包含任何密码。