哈希数据库存储密码时,我一直使用正确的每个条目盐字符串。 对于我的需求,存储在数据库旁边的哈希密码盐一直工作得很好。
不过,也有人建议将盐从数据库分开存放。 他们的论据是,如果数据库被攻破,攻击者仍然可以建立一个彩虹表采取具体盐串进去,以便在一个时间来破解一个帐户。 如果该帐户具有管理员权限,那么他可能甚至不需要破解任何人。
从安全角度来看,是值得它来存储盐在不同的地方? 考虑在同一台机器上的服务器代码和数据库的Web应用程序。 如果盐存储在计算机上的平面文件,有机会,如果数据库被泄露,盐文件也会如此。
是否有此任何推荐的解决方案?
彩虹表的一点是,他们事先会创建和分发集体节省计算时间的人 - 它只需只要在飞行中产生的彩虹表,因为它会只是直接破解密码+盐组合(自有效地产生什么彩虹表时,得到了些预运行暴力破解哈希),因此论点,即通过了解盐有人能“生成彩虹表”是假的计算。
还有,在一个单独的文件存储盐,只要他们在每个用户的基础上没有真正的点 - 盐点很简单,就是让这个一个彩虹表无法破解的DB每一个密码。
我会提供这方面的一个稍微不同的看法。
我总是存储与盐渍,密码哈希混合盐。
例如,我将密码的盐渍哈希前盐的前半部分,而盐的后半部分放置密码的盐渍哈希后。 该应用程序是意识到这样的设计,这样可以获取这些数据,并获得了盐和盐析密码哈希。
我对这种做法的理由:
如果密码/散列数据遭到破坏,而落入黑客之手,攻击者不会知道盐是从观察数据是什么。 这样,攻击者实际上不能进行强力攻击,以获得散列相匹配的密码,因为他不知道,开始与哈希并没有办法知道哪些数据部分是盐的部分,或盐渍密码哈希值的部分( 除非他不知道你的应用程序的认证逻辑 )。
如果盐析密码哈希原样保存,则可以执行强力攻击,以获得密码盐腌和散列产生相同的数据作为盐析密码哈希时。
然而,例如,即使腌制密码散列值被原样保存,但有一个随机字节前挂起-,只要攻击者不知道这第一个字节将被丢弃,这也会增加难度的攻击。 您的应用程序会知道丢弃数据的第一个字节用于用户身份验证时。
结论这个..
1)不要存储您的身份验证的应用程序使用它的确切形式的数据。
2)如果可能的话,继续为增加安全性的认证逻辑的秘密。
走一步..
如果你不能让你的应用程序的验证逻辑秘密 - 很多人知道你的数据是如何存储在数据库中。 并假设你已经决定存储盐渍密码哈希与盐混合在一起的,与一些盐在前面加上腌制密码哈希和盐的其余部分追加它。
当生成随机盐,你也可以随意决定什么比例的盐,你将前/存储盐渍密码哈希后。
例如,可以生成512个字节的随机盐。 你的盐添加到您的密码,并获得您的盐渍密码的SHA-512散列。 也产生一个随机整数200.然后,存储第一200个字节的盐,随后盐析密码散列,其次是所述盐的其余部分。
当验证用户的密码输入,你的应用程序将经过这个字符串,并承担数据的第1个字节是第1个字节的盐,其次是盐渍哈希。 该过程将失败。 该应用程序将通过使用前2个字节的数据的作为第2个字节的盐的继续,并重复直到肯定的结果,使用第一200个字节作为第一200个字节的盐后发现。 如果密码错误,应用程序将继续尝试所有排列,直到没有找到。
这种方法的优点:
提高安全性 - 即使你的验证逻辑是已知的,准确的逻辑是在编译时未知。 这几乎是不可能进行暴力攻击,甚至与精确逻辑的知识。 盐的增加长度将进一步增加安全性。
这种方法的缺点:
由于确切的逻辑在运行时推断,这种做法是非常CPU密集型。 盐的长度越长,越多的CPU密集型的这种方法变得越大。
验证不正确的密码会涉及CPU的最高成本。 这可能是适得其反的正当要求,但提高了安全性来抵御攻击者。
这种方法可以以各种方式来实现,并且可以更安全的使用可变宽度的盐和/或盐析密码哈希制成。
通常情况下,他们预先计划的哈希和存储在相同的领域。
有没有必要分开存放 - 点是使用一个随机盐每个密码,这样一个单一的彩虹表不能对你的整套密码哈希值的使用。 使用随机盐,攻击者必须单独暴力破解每个哈希(或计算所有可能的盐彩虹表 - 大大更多的工作)。
如果你有一个更安全的存储位置,这将是有意义的只是存储的哈希值出现。
基于发展ASP.NET MVC 4个Web应用程序由威廉Penberthy书:
- 获取访问存储在一个单独的数据库中的盐需要黑客破解两个不同的数据库以访问盐和腌制密码。 在同一个表作为密码,或者同一数据库的甚至是另一个表中存储它们,就意味着当黑客访问数据库,他们将有机会获得的盐和密码哈希两者。 由于安全包括使黑客进入系统过于昂贵或过程是值得的耗时,黑客将不得不增益应该使系统更安全的访问量倍增。
- 易于使用是用于保持的盐在相同的数据库作为哈希密码的首要原因。 你不会以确保两个数据库始终可用的同时,始终保持同步。 有盐的好处是最小的,如果每个用户都因为虽然它可能使一个人的密码更容易发现一个随机的盐,必须破解系统的密码力的量总体会很高。 在这个级别的讨论,这是真正的期望是什么:保护密码。 如果黑客已经获得了数据库的副本,您的应用程序的数据已经被损害。 在这一点上,这个问题是减轻用户因为共享密码的潜在风险。
- 维护两个独立的连接,数据库的需求是广泛的。 诚然,这增加了安全的感觉,但它给人的唯一的好处是,它可以保护密码,数据的单个元素。 如果数据库中的每个字段单独加密,并使用这个相同的盐,它会更有意义,从数据分开存放,因为你的系统的基本安全性提高。
盐的点是使所有的彩虹表没用,需要一套新的人来进行。 它只需只要猜一个字符串,使彩虹表。 例如, “密码”的SHA-256哈希值是5e88 4898 da28 0471 51d0 e56f 8dc6 2927 7360 3d0d 6aab bdd6 2a11 ef72 1d15 42d8
。 之后加入盐,如“badpassword”被散列的新的字符串是“passwordbadpassword”当中,由于雪崩效应,显着地改变了输出, 457b f8b5 37f1 802e f9c8 2e46 b8d3 f8b5 721b 7cbb d485 f0bb e523 bfbe 73e6 58d6
。
通常情况下,盐仅仅是存储在同一个数据库中的密码,还因为如果一个数据库被黑客攻击,很可能对方会,也。