安全性的一个方面已经困扰了我很长一段时间:为什么哈希算法和盐类的重要性肯定是肯定的,但密码强度要么根本没有提到,要么被认为是一个相当“哲学”的问题?
对我来说,正确的散列实现有三个组件:
任何组件中的故障都会使整个散列操作变得毫无用处。因此,对我来说,没有必要使用MD5,但允许他们使用12345作为密码。对我来说,密码的强度是不可分割的,严格来说是一个技术问题,它的重要性不亚于其他两个方面。
然而,当谈到简单的特定问题时,根本就没有具体的答案!
想要哈希算法的建议吗?愿为您效劳!
想知道如何得到好盐吗?有千千万万种方法!
想知道什么应该是最低可接受的密码强度?呃..。你知道,这是一种权衡和一些政治事务,所以“尽你所能”。
但是,对于“尽你所能”的技术,是否有一个技术性的、实用的定义呢?就像哈希算法一样?
或者,换句话说,为什么总是有一个哈希算法的建议,和一个特定的(“使用这个”),但从来没有建议的密码强度(“至少允许这样的强度或理解风险”)?或者总是非常强调应该使用的算法,而根本不关心密码的强度。难道这就不能给人留下这样的印象:仅靠散列算法就足够了,让可怜的程序员产生一种错误的安全感吗?
发布于 2014-02-15 07:23:39
密码哈希在安全指南中包含了很多内容,而且没有很好的理由。停止SQL注入和可执行文件上传要重要得多。我认为,这么多讨论的原因是因为它使用了有趣的技术(如bcrypt),而且默认情况下很少有身份验证库正确使用。
您提到的密码存储最佳实践并没有得到普遍认可,尽管这个站点上的用户大力推广它。特别是,在高流量站点上使用慢哈希算法通常是不可能的,因为处理负载太大。有一个有趣的文档这里
密码存储通常对用户是不可见的。不管您使用的是未加盐的MD5还是氪星,用户都不会看到任何不同。密码强度对用户来说是非常明显的,特别是,它是注册过程的一部分,大多数网站都希望尽可能地保持简单。
一些相当普遍的事情是,拥有更多的安全性会让你付出一些代价。这是密码存储和强度之间的区别。做更强的密码存储需要网站管理员--但是你可以买更多的硬件等等。执行更强的密码复杂性会让站点用户付出代价--如果他们不喜欢的话,他们就会离开。
所有安全选择都应基于对风险的理解。对于愤怒的小鸟来说,你不需要和网上银行,或者核武器一样的安全水平。在商业环境中,这种基于风险的思维通常不是针对只需要网站管理员的防御进行的,但是对于任何影响用户体验的东西,这种想法都是很难做到的。
关于密码的强度,我的建议是:
不过,这并不仅仅取决于网站的敏感性。在线攻击和离线攻击是有区别的。网站密码不需要那么强,因为攻击者只能尝试在线猜测,您可以使用锁定策略来减缓这些攻击。但是,Truecrypt密码可能会被脱机攻击(如果攻击者有驱动器的话)--所以它们需要更强大。
密码锁定策略是很好地进行密码身份验证的另一个重要部分,但它们的覆盖范围与密码存储不同。
越详细地查看密码,就会发现它们是一个非常有缺陷的身份验证机制。所有这些使密码尽可能安全的最佳实践建议就像试图用胶带重新连接飞机的机翼一样。
发布于 2014-02-15 00:09:34
长话短说,您可以完全控制您如何散列密码。但是,除了非常有限的一点之外,您无法控制用户密码的强度。
密码散列中存在最佳实践,因此可以将弱密码的影响降到最低。盐类应该是独一无二的,因此破解一个密码的成功不会对破解其他密码的努力有所帮助。应该使用像bcrypt或scrypt这样的慢散列来减缓攻击者反复进行密码猜测的速度。这些算法增加了密码破解的难度至少几个比特的熵。
另一方面,你对密码本身所能做的最好的事情就是限制密码的最小长度。需要符号可能会导致最小的额外熵,因为绝大多数用户只会在密码的末尾添加一个感叹号。在一天结束时,一个好的密码是熵,而众所周知的是,用户不善于想出所有的密码,但只有极少量的密码。更糟糕的是,您实际上无法测试熵--它是生成密码的方法的度量,而不能直接测量密码本身。“密码强度检查器”通常是相当糟糕的,通常只会让用户失望,他们最终会为了使用自己喜欢的密码而试图玩游戏。
因此,我们尽我们所能,在过程的各个部分,我们可以控制,并试图限制的缺点,我们不能。
发布于 2014-02-15 20:37:56
它已经困扰了我很长一段时间了,为什么哈希算法和盐的重要性是肯定的,但是密码强度要么根本没有提到,要么被认为是“哲学”的问题?或者,换句话说,为什么总是有一个哈希算法的建议,和一个特定的(“使用这个”),但从来没有建议的密码强度(“至少允许这样的强度或理解风险”)?
- "NWY0ZGNjM2I1YWE3NjVkNjFkODMyN2RlYjg4MmNmOTk="\*\* is also almost exactly as weak, yet it looks even stronger (long, upper case, lower case, numbers, symbols).在密码为12345的情况下,使用一个很好的散列算法可以传递很少的额外安全性,但是使用一个1000字节的纯粹随机的密码,如果它也存储在明文中的话,就没有什么额外的安全性了。这条链只有它最弱的一环才是最坚固的!
*MD5(“密码”)
** Base64(MD5(“密码”))
https://security.stackexchange.com/questions/51561
复制相似问题