密码安全涉及广泛的实践,并非所有实践都适合或可能适用于每个人。因此,最好的策略是通过思考您最重要的风险(您要防范的对象和内容)来制定威胁模型,然后根据针对这些特定威胁最有效的活动来建模您的安全方法。电子前沿基金会 (EFF) 有一个关于威胁建模的优秀系列,我鼓励大家阅读。
在我的威胁模型中,我非常关注我的密码的安全性,以防范(除其他外)字典攻击,在这种攻击中,攻击者使用可能的或已知的密码列表来尝试入侵系统。阻止字典攻击的一种方法是让您的服务提供商在一定数量的失败尝试后限制速率或拒绝登录尝试。另一种方法是不使用“已知密码”数据集中的密码。
使用 HIBP 检查密码安全性
Troy Hunt 创建了 Have I Been Pwned? (HIBP),以便在人们的信息在泄露的数据转储和泄露事件中被发现时通知他们。如果您尚未注册,则应注册,因为仅仅注册行为不会泄露任何信息。Troy 从这些数据中构建了一个包含超过 5.5 亿个真实密码的集合。这些是真人使用过的密码,并且因数据被盗或意外公开而泄露。
该网站不发布纯文本密码列表,但它不必这样做。根据定义,此数据已泄露。如果您曾经重复使用密码或使用“常用”密码,那么您就有风险,因为有人正在构建这些密码的字典以立即尝试。
最近,Firefox 和 HIBP 宣布他们正在合作,以使泄露搜索更容易。美国国家标准与技术研究院 (NIST) 建议您检查密码是否与已知被泄露的密码相同,如果发现相同则更改密码。HIBP 通过 API 公开的密码检查功能支持此操作,因此易于使用。
现在,向网站发送完整的密码列表将是一个坏主意。虽然我信任 HaveIBeenPwned.com,但它有一天可能会被入侵。相反,该站点使用一种称为 k-匿名性 的过程,该过程允许您在不泄露密码的情况下检查密码。这是一个三步过程。首先,让我们回顾一下这些步骤,然后我们可以使用 pass-pwned 插件来为我们完成它:
- 创建密码的哈希值。哈希值只是一种将任意数据(您的密码)转换为固定数据表示形式(哈希值)的方法。密码哈希函数是抗冲突的,这意味着它为每个输入创建唯一的哈希值。用于哈希的算法是单向转换,这使得如果您只有哈希值,则很难知道输入值。例如,使用 HIBP 使用的 SHA-1 算法,密码 hunter2 变为 F3BBBD66A63D4BF1747940578EC3D0103530E21D。
- 将前五个字符(在我们示例中为 F3BBB)发送到站点,站点将发回以这五个字符开头的所有哈希值的列表。这样,站点就无法知道您对哪些哈希值感兴趣。k-匿名性过程确保存在如此多的统计噪声,以至于被入侵的站点很难确定您查询了哪个密码。例如,我们的查询从 HIBP 返回了 527 个潜在匹配项的列表。
- 搜索结果列表,查看您的哈希是否在那里。如果在那里,则您的密码已被泄露。如果不在那里,则该密码不在公开已知的数据泄露事件中。HIBP 在其数据中返回了一个奖励:密码在数据泄露事件中出现的次数计数。令人惊讶的是,hunter2 已被发现 17,043 次!
使用 pass 检查密码安全性
我使用 pass,这是一个基于 GNU Privacy Guard 的密码管理器。它有许多扩展,这些扩展在 pass 网站上以及作为单独维护的 awesome 风格列表提供。其中一个扩展是 pass-pwned,它将使用 HIBP 检查您的密码。pass 和 pass-pwned 都已打包用于 Fedora 29、30 和 Rawhide。您可以使用以下命令安装扩展
sudo dnf install pass pass-pwned
或者您可以按照各自网站上的手动说明进行操作。
如果您刚开始使用 pass,请阅读以开源方式管理密码以获得精彩概述。
以下内容将快速设置 pass 并检查存储的密码。此示例假定您已经拥有 GPG 密钥。
# Setup a pass password store
$ pass init <GPG key email>
# Add the password, "hunter2" to the store
$ pass insert awesome-site.com
# Install the pass-pwned extension
# Download the bash script from the upstream and then review it
$ mkdir ~/.password-store/.extensions
$ wget https://raw.githubusercontent.com/alzeih/pass-pwned/master/pwned.bash -O ~/.password-store/.extensions/pwned.bash
$ vim ~/.password-store/.extensions/pwned.bash
# If everything is OK, set it executable and enable pass extensions
$ chmod u+x ~/.password-store/.extensions/pwned.bash
$ echo 'export PASSWORD_STORE_ENABLE_EXTENSIONS="true"' >> ~/.bash_profile
$ source ~/.bash_profile
# Check the password
$ pass pwned awesome-site.com
Password found in haveibeenpwned 17043 times
# Change this password to something randomly generated and verify it
$ pass generate -i awesoem-site.com
The generated password for awesome-site.com is:
<REDACTED>
$ pass pwned awesome-site.com
Password not found in haveibeenpwned
恭喜,您的密码现在比以前更安全了!您还可以使用通配符一次检查多个密码。
定期检查密码是否泄露是帮助抵御大多数威胁模型中大多数攻击者的绝佳方法。如果您的密码管理系统没有这么容易,您可能需要升级到类似 pass 的系统。
2 条评论