考虑到当今的计算机是一台确定性机器,无法生成随机序列,并且所有计算机生成的“随机”序列实际上都是伪随机的,计算机生成的随机密码不是不安全的吗?与使用数字生成算法相比,随机按键来创建随机密码不是更安全吗?
答案1
人类通常很不擅长生成随机性。计算机生成密码时可以得到真正的随机数。一种方法是将计算机设置为从随机网它通过监测大气噪声来生成数字。计算机的表现通常与普通人一样好,甚至更好,普通人可能不太关心他们的密码有多随机。
如今,密码其实已经没那么有用了。如果你搜索一下,就会发现很多安全专家认为人们对密码的期望过高了。我认为你会发现,通过网络钓鱼、键盘记录器和其他类型的攻击来获取密码变得越来越普遍,而密码的长度和随机性完全无关紧要。
任何设计良好的系统都会通过使用锁定和限制身份验证尝试次数来阻止入侵者远程运行任何类型的字典攻击。秘密哈希将得到很好的保护,不会被拦截。
当然,这和所有与安全相关的事情一样,取决于风险的大小。对于具有合理安全措施的低价值系统,计算机生成的密码几乎肯定没问题。如果您负责核武器代码的安全,您可能需要花更多的精力来想出好的密码。
计算机生成的密码安全吗?
很抱歉,但是安全的从来没有,而且可能永远不会是二进制的。任何东西都不会处于 100% 安全的状态。在许多情况下,正确生成的密码会比其他密码安全得多。
答案2
你的论点有几个前提:
鉴于:好的密码是完全随机的
鉴于:确定性机器生成的密码不是随机的
如果是确定性的,那么不是随机的;
如果不是随机的,那么不好
所以:生成的密码并不好。QED。
您认为好密码是完全随机的这一前提是错误的。经验表明,好密码具有许多特征。好密码必须能够抵御某些类型的攻击,其中一种攻击就是密码猜测。50 多年的密码经验表明,好密码具有许多特征:
- 时间足够长,使得随机猜测需要太长时间。
- 具有足够的熵,使得密码中的每个字符都明显不依赖于其他字符。
- 都能被记住。
8 个字符密码限制的取消(值得欢迎)为人们带来了全新的良好密码选择。同时,它也划分了良好密码的定义。
Solaris 上的好密码:1ŤŁÃb$R=
Windows 上的好密码:0123456789abcefBubba2pAantz
第一个密码在 8 个字符内具有非常高的熵。第二个密码在 16 个字符内具有可笑的熵,但超过 16 个字符后熵就还可以了。对于 Solaris 来说,第二个密码会是一个疯狂的密码,因为它会在 8 个字符后被截断,而如果该密码哈希被发现(在飞行过程中嗅探、从域控制器中获取,诸如此类),那么第一个密码在 Windows 上将是令人遗憾的,这要归功于彩虹表。(不久前,我发表了一篇关于此问题的博客文章,在跨平台密码策略的背景下更详细地介绍了此问题。关联)
因此,好的密码具有高熵和长度。当你不能使用长度(再次是 8 个字符的限制)时,你只能使用高熵。当你的长度非常大(512 个字符!)时,密码可以包含明显更少的熵,同时具有相同的攻击抵抗力。
也就是说,好的密码可完全随机。不是必须是。
至于你的第二点,关于确定性机器无法产生随机输出。确定性机器使用随机输入可以产生包含零到其作为输入获得的熵量的输出,但不引入任何新熵。这样,使用来自 /dev/random(而不是 /dev/urandom)的 2 个字节熵的密码生成器可以生成一个具有高随机性的 40 个字符的密码。当然,如果攻击者知道这两个字节和用于生成密码的算法,就可以推导出实际密码。
算法比用于为算法提供种子的实际随机字节更容易找到。它们被广泛发布,因为高质量的伪随机性对每个人来说都是一件有价值的事情。这意味着攻击者必须(在这种情况下)尝试每个允许长度的每种可能的 2 字节组合。(另请参阅:彩虹表)
也就是说,确定性机器生成的密码可以具有高度的随机性。
最后,机器生成的密码不好的原因是不是密码事后可推导,这就是我所说的关于什么是好密码的第三点:可记忆。机器生成的密码,尤其是长密码,可能非常难记,这反过来会导致它们被写在不安全的地方。或者很快被改成其他长度/熵强度较低的密码。
答案3
随机按键创建随机密码不是比使用数字生成算法更安全吗?
不。
对于给定长度的密码,从完整可能的符号集随机生成的密码将比随机按键更安全。
答案4
你说的对,这取决于密码的“随机性”。
计算机生成的密码程序如下所示:
string generatePassword(){
return "asdf";
}
不会很好。
“随机按下”的缺点是您的“特殊”字符(!@#$%^<> 等)的比例会很低,因为您不太可能在shift按下 `-0 或任何其他非字母键的同时按下该键。