替换应用程序的纯文本密码
当前,我们正在为我们拥有的Web应用程序存储纯文本密码。
我一直提倡使用密码哈希,但是另一位开发人员表示这样做不太安全-更多的密码可以匹配哈希,而字典/哈希攻击则更快。
这个说法有道理吗?
解决方案
回答
我不是安全专家,但我有一种感觉,如果纯文本更安全,则哈希就不会存在。
回答
绝对没有理由在Web应用程序上保留纯文本密码。使用标准的哈希值算法(SHA-1,而不是MD5!),并添加一个盐值,这样就不可能进行彩虹攻击。
回答
绝对没有。但这没关系。我之前也发布了类似的回复:
不幸的是,但是人们,甚至程序员,都太激动了,不容易被争论所左右。一旦他对自己的职位进行了投资(并且,如果我们在此发布职位,他就是),我们就不可能仅凭事实说服他。我们需要做的是切换举证责任。我们需要让他出去寻找他希望可以说服数据,并以此来了解事实。不幸的是,他从现状中受益,因此我们在这条路途中艰难。
回答
如果我们不给密码加盐,则可能会遭受Rainbow Table攻击(预编译的字典具有针对给定哈希的有效输入)
如果我们以明文形式存储密码,则其他开发人员应停止谈论安全性,并开始阅读有关安全性的文章。
冲突是可能的,但通常对于密码应用程序来说不是一个大问题(它们主要是在使用散列来验证文件完整性的区域中的问题)。
因此:对密码加盐(通过在密码的右侧添加Salt来*),并使用良好的哈希算法,例如SHA-1或者SHA-256或者SHA-512.
PS:这里有更多有关哈希的细节。
*我有点不确定Salt是否应该在字符串的开头或者结尾。问题是,如果发生冲突(两个输入具有相同的散列),则将Salt添加到"错误的"一侧将不会更改结果散列。无论如何,彩虹表不会有什么大问题,只有碰撞
回答
我不明白其他开发人员如何"更多的密码可以匹配哈希"。
有一种说法是"散列攻击会更快",但前提是我们不对散列的密码加盐。通常,哈希函数使我们可以提供盐,这使得使用已知哈希表浪费时间。
就个人而言,我会说"不"。基于上述内容,以及如果我们以某种方式获得明文暴露的事实,则加盐的哈希值对试图进入的人几乎没有价值。相同的长度。
即,如果对任何字符串进行散列总是导致20个字符的散列,则如果仅查看散列,则无法确定原始密码是例如8个字符还是16个字符。
回答
从理论上讲,是的。密码可以比哈希更长(更多信息),因此存在哈希冲突的可能性。但是,大多数攻击都是基于字典的,并且发生冲突的可能性比成功的直接匹配无限小。
回答
more passwords could match the hash and a dictionary/hash attack would be faster.
是的,没有。使用像SHA变体这样的现代哈希算法,该参数会变得非常非常一周。我们是否真的需要担心暴力攻击只需要352年而不是467年? (那里的一个有趣的笑话。)要获得的价值(密码没有以纯文本格式存储在系统上)远远超出了同事的关注范围。
回答
来自维基百科
Some computer systems store user passwords, against which to compare user log on attempts, as cleartext. If an attacker gains access to such an internal password store, all passwords and so all user accounts will be compromised. If some users employ the same password for accounts on different systems, those will be compromised as well. More secure systems store each password in a cryptographically protected form, so access to the actual password will still be difficult for a snooper who gains internal access to the system, while validation of user access attempts remains possible. A common approache stores only a "hashed" form of the plaintext password. When a user types in a password on such a system, the password handling software runs through a cryptographic hash algorithm, and if the hash value generated from the user's entry matches the hash stored in the password database, the user is permitted access. The hash value is created by applying a cryptographic hash function to a string consisting of the submitted password and, usually, another value known as a salt. The salt prevents attackers from building a list of hash values for common passwords. MD5 and SHA1 are frequently used cryptographic hash functions.
我们可以在该页面上阅读更多有关该主题的内容。在我看来,在我已阅读和使用的所有内容中,除非我们使用非常小的(<256位)算法,否则散列是更好的方案。
回答
事实是,如果我们对某些内容进行哈希处理,是的,将会发生冲突,因此有可能使用两个不同的密码来解锁同一帐户。
但是,从实际的角度来看,这是一个很差的参数。好的哈希函数(md5或者sha1会很好)可以保证所有有意义的字符串(尤其是短字符串)都不会发生冲突。即使有,两个密码匹配一个帐户也不是一个大问题,如果某人能够以足够快的速度随机猜测密码以至于他们很可能能够进入,那么我们将遇到更大的问题。
我认为以纯文本形式存储密码比密码匹配中的哈希冲突具有更大的安全风险。
回答
这取决于我们要防御的内容。如果是攻击者关闭数据库(或者欺骗应用程序以显示数据库),则纯文本密码没有用。有许多攻击都依靠说服应用程序来对其私有数据SQL注入,会话劫持等进行分类。通常最好不要完全保留数据,而要保留散列版本,以使坏人无法轻易使用它。
正如同事所建议的那样,可以通过对字典运行相同的哈希算法并使用Rainbow表将信息提取出来来轻易地克服这种情况。通常的解决方案是使用秘密盐加上其他用户信息来使哈希结果变得独一无二,例如:
String hashedPass=CryptUtils.MD5("alsdl;ksahglhkjfsdkjhkjhkfsdlsdf" + user.getCreateDate().toString() + user.getPassword);
只要秘密是秘密的,或者攻击者不知道用户记录的确切创建日期,即使他们能够下拉密码字段,字典攻击也将失败。
回答
我在工作场所遇到了同样的问题。我要说服他哈希算法更安全的方法是编写一个SQL注入,该注入从我们网站的公共部分返回用户和密码列表。作为主要的安全问题,它马上就升级了:)
为防止受到字典/哈希攻击,请确保对每个用户唯一且静态的令牌哈希(用户名/加入日期/ userguid效果很好)
回答
没有什么比存储纯文本密码安全的了。如果我们使用的是不错的哈希算法(至少SHA-256,但甚至SHA-1都比没有更好),是的,可能会发生冲突,但这并不重要,因为给出了哈希,就不可能*计算出什么字符串哈希到它。如果用密码对用户名进行哈希处理,那么这种可能性也会消失。
*从技术上讲不是不可能的,但在计算上是不可行的
如果用户名是" graeme",密码是" stackoverflow",则创建一个字符串" graeme-stackoverflow-1234",其中1234是一个随机数,然后对其进行哈希处理并将" hashoutput1234"存储在数据库中。在验证密码时,请使用用户名,提供的密码和存储值末尾的数字(哈希具有固定长度,因此我们始终可以这样做)并将它们哈希在一起,并将其与哈希进行比较储值的一部分。
回答
关于程序员冒充密码学家的说法很古老:)
杰夫·阿特伍德(Jeff Atwood)在该主题上有一篇不错的文章:我们可能存储了错误的密码
为了更广泛地答复,我同意上述所有观点,因为多个密码匹配相同的哈希,所以从理论上讲,哈希使获取用户密码更加容易。然而,
与有人可以访问数据库相比,这种情况发生的可能性要小得多。
回答
希望我们能原谅我插入的解决方案,它使用客户端JavaScript在传输密码之前对客户端的哈希进行哈希处理:http://blog.asgeirnilsen.com/2005/11/password-authentication-without.html