Security Tools

密码强度检测器

基于 zxcvbn 引擎实时分析:常见弱口令字典、键盘走位、连续序列、重复与日期模式都会扣分,比"大小写+数字+符号"的字符计数更接近真实安全性。全程本地计算,密码不出浏览器。

zxcvbn 引擎 弱口令字典识别 100% 本地计算 实时出结果
密码只在本机计算,不会上传
k-匿名:只发送 SHA-1 哈希的前 5 位,密码不出浏览器
强度 /100
极弱 极强
长度
有效熵
比特
字符空间
离线破解(GPU 集群,约 100 亿次/秒)
在线猜测(限速,约 100 次/小时)
高级策略设置

逗号或换行分隔,不区分大小写。zxcvbn 会自动识别大小写变形、Leet 替换(如 Pa$$w0rd)和反转写法。

对比两个密码

WHY IT MATTERS

为什么"有大小写数字符号"不等于安全

P@ssw0rd! 四类字符齐全,却在真实泄露密码榜上有名。密码强度取决于猜测难度,而不是字符种类的算术。

01

弱口令字典匹配

内置常见密码与词表,命中即重罚;password、123456、P@ssw0rd 这类会被正确判为极弱。

02

模式识别

键盘走位、连续序列、重复片段、日期年份、常见单词都会显著降低有效猜测空间。

03

有效熵而非理论熵

评分基于识别出的结构估算真实猜测次数,而不是简单地用字符集大小乘长度。

04

两种破解场景

分别估算离线 GPU 爆破和在线限速猜测的时间,帮助建立对攻击成本的直觉。

05

自定义策略与黑名单

可设最小长度与字符要求,加入公司名、项目代号等专属弱词,适配企业口令规范。

06

全程本地计算

密码不离开浏览器,不经过任何服务器;设置仅存在你自己的 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 实现:

JavaScript
<!-- 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>
            
Node.js
// npm i @zxcvbn-ts/core
import { zxcvbn } from '@zxcvbn-ts/core';

const result = zxcvbn('P@ssw0rd!');
console.log(result.score, result.guesses_log10);
            
PHP
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'];
            
Python
pip install zxcvbn
            
from zxcvbn import zxcvbn

res = zxcvbn('P@ssw0rd!')
print(res['score'], res['crack_times_display'])
            
Go
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)
}
            
Rust
# 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 每秒尝试上百亿个哈希;而在线登录接口通常有频率限制,每秒尝试不了几次。同一个密码在两种场景下的生存时间可能相差万亿倍,所以需要分开看。

检测结果会被保存吗?

不会。密码全程只在你的浏览器内存中,刷新即消失;只有你自定义的策略(长度要求、黑名单)会存在本地浏览器里,不包含任何密码。

相关工具