【问题标题】:Hashing, adding more salt散列,添加更多盐
【发布时间】:2012-06-29 04:58:24
【问题描述】:

好的,所以我明白为什么在散列之前加盐密码是个好主意。 问题是,通常人们建议在密码中附加或附加盐,为什么不两者都做呢?

我的想法是,所以如果黑客先生掌握了数据库并想获取人 x 的密码, 他心想,好吧,大多数人建议添加或预先添加盐,所以让我们这样做.. 他用密码+盐的所有组合生成了一个彩虹表,并尝试了他的运气。如果这不起作用,他会做同样的事情,但盐 + 密码。

为了让攻击变得更加困难,为什么开发人员不更进一步,做'salt + password + salt',或者'reverse(salt) + password + salt',或者你可能会喜欢开始切割密码/盐,开始在这里和那里放一些盐等等。

黑客能够找到密码的唯一方法是他是否可以访问源代码(以了解盐是如何在散列之前编织到密码中的)

进一步说明,人们建议在键拉伸时至少进行 1000 次迭代,同样为什么不进行 1147、1652 等 :)

第二个进一步说明,在查看哈希字符串时,是否可以计算出使用的哈希函数?

【问题讨论】:

  • 猜测使用的哈希函数没有问题。它可以是公开的。请问,具体的问题是什么?是因为浪费时间在两端加盐没用吗?
  • 是的,但是当查看一个长哈希字符串时,黑客可以说“哦,他们使用了 MD5”或“哦,他们使用了 sha-512”等等。如果他们不能,他们将不得不做出所有“正确”哈希的彩虹表;否则他们将不得不查看源代码。
  • 是的,MD5、SHA1、SHA512等产生的哈希很容易区分,比如它们的长度不同。但这根本不是问题。您似乎没有理解尝试 3 种算法而不是 1 种算法和尝试 2^128 更多组合(我们在密码学中处理的常见数字)之间的区别。
  • @Metalstorm 显然它们是因为您似乎认为在安全性方面有任何价值,而不是安全性数学。使某些东西加密安全的方法是让攻击者蛮力通过更大的搜索空间。为此,您不妨让盐变大 以获得相同的效果。 (或者使用更大的散列函数,或更少破坏的散列,或随机盐来获得更多收益。)
  • @Metalstorm 另外,如果您可以泄露您的密码数据库,那么您可以泄露您的源代码存储库并非不可想象。你不想让密码恢复“有点棘手”,你想让它在计算上不可行。

标签: security hash cryptography salt


【解决方案1】:

猜测使用盐的方式比暴力破解密码要容易得多,尤其是在攻击者拥有哈希密码数据库和一个已知匹配项(他自己的密码)的情况下。即使他不知道,他也可以简单地使用他已知的密码和已知的哈希来暴力破解加盐和加盐算法。

哈希算法也是如此。只有几个完整的哈希函数,任何有能力的管理员都有可能使用其中之一。

密码学的前提之一是所有关于所使用算法的信息都被假定为公开的。您不应该依赖攻击者无法破坏您的系统,因为您正在使用一种晦涩的算法对事物进行哈希处理,因为与在这样的受感染数据库上暴力破解密码的费用相比,暴力破解每个哈希算法非常便宜。

如果你将你的程序分发给用户,他们可以通过反汇编或调试来准确地弄清楚它是如何散列的。如果它是一个服务器程序,他们可以用其他一些漏洞闯入,或者他们可以购买/窃取/获取您的软件,或其他任何东西。我什至会说所有好的密码软件都是开源的:即使全世界都知道它是如何工作的,但它仍然无法破解。

您试图依靠的是默默无闻的安全性。许多人和公司已将其用作保护其产品的方法。我能记得的最后一个大事件是赛门铁克 PCAnywhere 软件的源代码被盗。你可能还记得结果如何。这个故事的寓意是,如果没有人知道它是如何工作的,那么它是不安全的,如果每个人都知道它是如何工作的(并且它在密码学上是健全的),那么它就是安全的。

【讨论】:

  • 仅仅因为黑客有他的密码+他的哈希+他的盐,他就无法确定它是如何被哈希的?!在我知道的那种情况下,找出散列是预先添加或附加的很容易。但是,如果代码做了一些定制的盐+密码编织,那么黑客复制哈希的唯一方法就是获取源代码?
  • 我已经更新了我的帖子。您似乎缺少的一件事是,如果黑客入侵了您的系统,您必须假设他们拥有一切。如果您的程序在他们闯入时正在运行,他们可以转储它的映像并在以后对其进行逆向工程,即使没有源代码,即使磁盘上没有可执行文件。
【解决方案2】:

对坚定的黑客来说,对您的代码进行逆向工程并不难,一旦发生这种情况,您的每个密码现在都会被泄露。

您应该使用经过验证的散列技术。举个例子,类似于 bcrypt 算法。当您想对密码进行哈希处理时,请执行以下步骤:

  1. 生成足够强的随机盐(16 - 32 字节)
  2. 设置哈希成本 (15 - 20)(成本越大,哈希越慢,越强)
  3. 计算您将执行的哈希轮数 (2^cost)

执行以下操作:

hash = ""
for(numberOfHashRounds)
{
hash = SHA256(hash + salt + password)
}

然后将散列与所用的盐和成本一起存储。当您需要验证时,对存储的盐和成本执行相同的操作。随着计算机变得越来越快,您可以提高算法的成本。试着得到它,这样你的哈希计算大约需要 500 毫秒,或者只要你愿意牺牲。

这是安全的,因为破解者必须为每种盐生成彩虹表,并执行相同数量的回合。即使使用用于破解的 GPU 阵列,这也需要数十年的时间。

如果您想在此基础上添加混淆,请继续,只是不要在此过程中破坏算法的安全性。

【讨论】:

  • 所以你刚刚描述了什么是键拉伸,这就是我所说的......另外,我没有问对源代码进行逆向工程是否困难。
  • @Metalstorm 您的源代码行为是超级机密,但事实并非如此,因此您的混淆毫无意义。您还需要了解什么?
  • 请重新阅读我的帖子...我从来没有说过代码是超级机密,没有人能够对其进行逆向工程并弄清楚盐是如何应用的。问题是,按照我概述的步骤,黑客必须获取源代码才能生成匹配的哈希值。 IE,如果数据库被入侵,他们也必须获取源代码......这可以在不同的位置。
  • 好的,所以答案是:“是的,但是攻击者知道足够强大的散列算法是没有意义的”。
  • 不可能,假设攻击者永远无法获取您的源代码,这是错误的假设。这让我回到了我的观点,只有在拥有经过验证的、安全的散列算法之后才进行混淆。
猜你喜欢
  • 2011-02-27
  • 1970-01-01
  • 2015-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多