我想创建一种确定性地创建强密码的方法。这意味着每次注册一个站点时,我都想记住某种“提示”和“哈希”,它“提示”为该站点的强密码。我认为它是密码存储应用程序的一个很好的替代品,比记住密码更好的安全性。
一个简单的方法是使用openssl
。例如:
echo -n "password hint for facebook" | openssl dgst -sha256
>>159cb97d048a50a9bc124d2e6795cec1f5e0850ee9f5148fbb1d4e822dd4dd9c
但是以这种方式创建的哈希不够强大。即它不包含特殊字符。它可能适用于实用程序,但有些站点会要求您的密码至少包含一个特殊字符。谁有更好的主意?
密码破解者非常了解这样的确定性技术,并且它不会产生更安全的密码。
使用这种技术的公共泄密密码通常会在高速下大量破解。像mdxfind这样的工具将尝试数千种不同类型的嵌套哈希组合,像John the Ripper这样的工具将允许您构建嵌套哈希的任意动态组合(使用其动态哈希算法语法),并且hashcat内置了许多常见的嵌套。
另请注意,根据站点名称更改密码的单个元素也是一种非常着名的内存技术,密码破解程序会利用此功能。
为了评估您提出的方法的安全性,您必须想象如果攻击者确切知道您的方法是什么,它将如何被削弱。如果您的方法在披露后以任何方式变弱,那就不够了。这被称为Kerckhoff's Principle。
在这种情况下,如果您的密码中唯一不同的是站点名称,那么一旦在任何站点上破解,攻击者将立即识别该模式并能够重建所有站点的密码。应该立即明白为什么这是坏事。
您最好使用密码管理器,使用双因素身份验证和随机生成的密码短语进行保护,然后为所有其他帐户生成真正随机的密码。这样你只需要记住一个密码,这样就可以使它变得强大(比如,从一个20,000字的字典中随机抽取六个单词)。