搜一下"密码强度检测",你会发现一个细思极恐的现象:几乎所有工具都要求你把真实密码——那个可能被你重复使用、守护着邮箱恢复权限的密码——粘贴进一个陌生网站的输入框里。页面上没有任何可见提示告诉你,这串字符是否被记录、是否被发送到分析端点,或者是否被悄悄保存在某个表单追踪工具中。
这些工具中的大多数本可以在浏览器本地完成计算,但几乎没有一个会明确告诉你它们确实这么做了。更令人不安的是,相当数量的工具在运行第三方脚本,这让"仅客户端计算"从外部几乎无法验证。把如此巨大的信任交给一个同时挂着粘性广告横幅、弹着三层Cookie同意弹窗的页面,实在疯狂。
![]()
于是有人做了一个只干一件事的密码强度计算器:在浏览器中完整计算香农熵(Shannon entropy)、密钥空间大小和暴力破解时间估算,全程保持网络面板打开以证明没有任何数据外传。密码永远不会离开输入框。以下是背后的数学原理和TypeScript实现。
为什么正则表达式规则不是真正的强度测量
大多数消费级密码强度计只是把正则表达式规则包装成进度条——"包含数字:+10%,包含符号:+10%"。这不是测量,是猜测。真正重要的指标是熵,直接借自克劳德·香农的信息论:
E = L × log2(R)
其中L是密码长度,R是可能字符池的大小。关键在于,池大小R不是固定的——它取决于密码中实际出现的字符类别:只用小写字母时R=26;混入数字和符号后R升至95。这正是那些天真的"强度计"跳过的一步——它们检查符号是否存在,却不重新计算符号所解锁的实际密钥空间。
以密码k9#M2$vL为例——8个字符,覆盖全部四类字符:
R = 26 + 26 + 10 + 33 = 95
E = 8 × log2(95) = 8 × 6.5698 ≈ 52.56比特
总暴力破解搜索空间:95^8 ≈ 6.63 × 10^15种组合。
破解时间:一个诚实的数字区间
熵本身是抽象的。真正能让人产生直观感受的是:破解这个密码要多久?把总组合数除以攻击者的猜测速率,就能换算成现实时间:
secondsToCrack = totalCombinations / guessesPerSecond
猜测速率因攻击面不同而差异巨大,因此计算器模拟的是一个区间而非单一数字。这正是让破解时间数字保持诚实的关键细节:一个8字符密码,面对限速的登录表单可能"存活数年",但如果哈希值泄露,面对离线GPU设备可能在几秒内被攻破。同时展示两个数字,而不是只展示好看的那个,正是这个工具的全部意义。
长度是指数增长,复杂度只是线性增长
这里有一个反直觉但值得内化的要点:长度让搜索空间指数级增长,复杂度只是随池大小线性增长。比如Tr0ub&9!——8个字符,R=95,熵值约52.56比特;而一个16位的小写字母密码,R=26,熵值却能达到75比特以上。在密码强度这件事上,长度永远比花哨的符号组合更值得投入。
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.