Passwords 替换应用程序的纯文本密码

Passwords 替换应用程序的纯文本密码,passwords,Passwords,我们目前正在为我们拥有的web应用程序存储纯文本密码 我一直主张使用密码散列,但另一位开发人员说,这样做不太安全——更多的密码可以匹配散列,字典/散列攻击会更快 这个论点有什么道理吗 我不是一个安全专家,但我有一种感觉,如果纯文本更安全,哈希就不会存在 绝对没有理由在web应用程序上保留纯文本密码。使用标准散列算法(SHA-1,而不是MD5!)和salt值,这样彩虹攻击就不可能了。绝对没有。但这并不重要。我之前也发布过类似的回复: 这是不幸的,但人们,甚至是程序员,都太情绪化了,不容易被争论所左

我们目前正在为我们拥有的web应用程序存储纯文本密码

我一直主张使用密码散列,但另一位开发人员说,这样做不太安全——更多的密码可以匹配散列,字典/散列攻击会更快


这个论点有什么道理吗

我不是一个安全专家,但我有一种感觉,如果纯文本更安全,哈希就不会存在

绝对没有理由在web应用程序上保留纯文本密码。使用标准散列算法(SHA-1,而不是MD5!)和salt值,这样彩虹攻击就不可能了。

绝对没有。但这并不重要。我之前也发布过类似的回复:


这是不幸的,但人们,甚至是程序员,都太情绪化了,不容易被争论所左右。一旦他对自己的职位进行了投资(如果你在这里发帖,他就是),你就不可能仅仅用事实来说服他。你需要做的是转换举证责任。你需要让他出去寻找他希望能说服你的数据,并从中了解真相。不幸的是,他从现状中获益,因此你在这方面的道路很艰难。

如果你不加密密码,你可能会受到彩虹表攻击(预编译字典,对给定的哈希值有有效的输入)

如果您以明文形式存储密码,那么其他开发人员应该停止谈论安全性,并开始阅读有关安全性的内容

冲突是可能的,但对于密码应用程序来说通常不是什么大问题(在使用哈希作为验证文件完整性的方法的领域,冲突主要是一个问题)

所以:给你的密码加盐(通过在密码的右边加盐*)并使用好的散列算法,比如SHA-1,或者最好是SHA-256或SHA-512

PS:关于散列的更多细节


*我有点不确定盐是应该放在绳子的开头还是结尾。问题是,如果您有一个冲突(两个输入具有相同的散列),那么将Salt添加到“错误”端不会改变结果散列。无论如何,Rainbow表不会有大的问题,只是会有冲突

我不明白其他开发者的东西“更多的密码如何匹配哈希”

“散列攻击会更快”是有争议的,但前提是你没有在散列密码时对其进行加密。通常,散列函数允许您提供一个salt,这使得使用已知的散列表浪费时间

就我个人而言,我会说“不”。基于上述事实,以及如果您确实以某种方式获得明文公开,那么对试图加入的人来说,一个附加的、散列的值没有什么价值。哈希还提供了使所有密码“看起来”长度相同的好处


也就是说,如果对任何字符串进行哈希运算总是会产生一个20个字符的哈希值,那么如果您只需要查看哈希值,您就无法判断原始密码是8个字符还是16个字符,例如。

理论上,是的。密码可能比哈希更长(信息更多),因此可能会发生哈希冲突。然而,大多数攻击都是基于字典的,碰撞的概率比成功的直接匹配要小得多

更多的密码可以匹配哈希,字典/哈希攻击会更快

是和否。使用现代散列算法,比如SHA变体,这个参数会非常非常小。如果暴力袭击只需要352年而不是467年,你真的需要担心吗?(这里有一个轶事笑话。)获得的价值(系统上没有明文存储密码)远远超出了你同事的考虑

来自

一些计算机系统存储用户信息 要与之进行比较的密码 用户尝试以明文形式登录。如果 攻击者可以访问此类文件 内部密码存储,所有密码 因此,所有用户帐户都将 妥协的。如果某些用户使用 上的帐户的密码相同 不同的系统,将是不同的 也妥协了

更安全的系统存储每个 密码系统中的密码 受保护的窗体,因此可以访问 实际密码仍然是 对一个获得胜利的窥探者来说很难 对系统的内部访问,而 验证用户访问尝试 仍然有可能

一个普通的方法只存储一个 明文的“散列”形式 密码。当用户键入 在这样的系统上,密码 密码处理软件运行 通过加密散列 算法,如果哈希值 从用户的条目生成 匹配存储在 密码数据库,用户是 允许进入。哈希值为 通过应用加密 将哈希函数转换为包含 提交的密码和, 通常,另一个值称为 盐。盐可以防止攻击者攻击 为创建哈希值列表 通用密码。MD5和SHA1是 常用密码散列 功能


你可以在那一页上读到更多关于这个主题的内容。在我看来,在我阅读和使用过的所有内容中,哈希是一种更好的方案,除非你使用非常小的(<256位)算法。

事实是,如果你对某个东西进行哈希,肯定会发生冲突,因此两个不同的密码有可能解锁同一个帐户

然而,从实际的角度来看,这是一个糟糕的参数——一个好的散列函数(md5或sha1就可以了)几乎可以保证所有有意义的字符串,尤其是短字符串,都不会发生冲突。即使有,一个帐户有两个密码匹配也不是什么大问题——如果有人能够以足够快的速度随机猜出密码,使他们有可能进入,那么你就有了更大的问题

String hashedPass=CryptUtils.MD5("alsdl;ksahglhkjfsdkjhkjhkfsdlsdf" + user.getCreateDate().toString() +  user.getPassword);