首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >绝对最安全的密码存储方案?

绝对最安全的密码存储方案?
EN

Security用户
提问于 2012-02-22 07:51:53
回答 9查看 6.8K关注 0票数 3

我已经在StackOverflow上问过这个问题了,但是有人说这是一个更合适的地方,我没有办法“移动”这个问题,所以我不得不复制它。

相信,我知道,关于这个问题有几百个问题。我读了他们的眼睛,以找到最安全的方式存储一个密码,但每一个答案给我痒的感觉,我们仍然可以做得更好。我计划在PHP中使用它,但我认为它适用于任何编码语言。

我不是安全专家,但只有一种方法不够安全吗?

加密

如果我正确理解了加密密码(使用PHP),如果您知道所使用的字符串,则可以将其解密回明文。我见过的大多数托管帐户首先访问文件,然后查找存储在config.php左右的DB密码。

即使我使用一个大而复杂的字符串来加密密码,如果入侵者转到create_account.php (或用户创建的任何地方)S/他会在那里找到字符串,并能在几分钟内解密整个密码列(对吗?)

散列

散列的好处是密码不能返回到纯文本,这很好,但是.许多散列方法都有漏洞,我一直在阅读一些文章,这些文章为散列获得了可能的值(散列字符串可以表示多个纯文本字符串)。我读到一篇文章说,一些人能够在几秒钟内恢复密码,使用亚马逊的EC2对弱密码和强密码使用几个小时。

我甚至看到了哈希索引目录,黑客和随机的j*rks存储了大量的hash>string值,所以如果输入您获得的哈希,您可以在一秒钟内获得可能的密码。这仍然是某种字典攻击,但相当有效。

对于像MD5这样的普通散列,我甚至看到一篇文章,其中黑客很容易发现Google以某种方式索引MD5散列,因为它被使用了多少(比如在文件名、gravatar.com和类似的API中),所以他有一本有索引的HUUUGE哈希字典,它只需一秒就能与值相关联。

MD5和SHA1一度被认为是安全的,但后来出现了漏洞。如果现在使用的是可信的方法(我看河豚是最好的方法,对吗?)将来会有什么收获吗?

最后,我知道这是荒谬的,但我对两个密码有相同的散列结果的可能性感到不舒服。我知道,有人猜测另一个具有相同哈希值的人的可能性很低,但是嘿,我们在2012年!,难道我们不应该有飞车和电脑,可以在一个小时内把“阿凡达”拍成电影吗?:P应该有更好的东西.

食盐

即使我使用salt来增加密码检索的难度,如果黑客看到了固定的盐字符串(或者存储随机盐的地方),那么使用云计算攻击就不会变得更加复杂了,对吗?

有什么更好的吗?

正如我所说,我远不是一个安全专家,但没有其他选择吗?我在Stack溢出和Google结果(大部分是堆栈溢出答案:D )中读到了很多关于这方面的问题,它们几乎总是说同样的话。

如果散列和加密是唯一的选择,那是一种让它变得更好的方法吗?在创建用户的文件被访问的情况下,有没有一种隐藏加密密码的方法?

在所有这些答案中,我从未见过有人建议将以下方法结合起来:

Sha1(地窖blowfish.salt,salt),这是不是因为某种原因而不是个好主意?(我只能想象在一个拥有数千名注册和登录用户的网站中,处理器的消耗过大,但我可以在我计划使用的站点中处理这个问题。)

我不是在问“请为我编码这个”,我想知道如何使“尽可能不可能”(最难:P)在DB和源代码落入错误的情况下获得密码。

也许我误解了这些方法的工作方式,也许有一些类似于PHP函数的东西可以使字符串即使使用密码也无法解密,或者我遗漏了一些东西。我仍然感到奇怪的是,没有人建议采用多种方法。

如果你还在读我忧心忡忡的思想,请提前感谢,再次感谢

EN

回答 9

Security用户

回答已采纳

发布于 2012-02-22 07:36:36

您可以将身份验证委托给网络中的另一台服务器,您的主服务器通过want服务或任何您想要的协议与之交谈。这样,黑客可以访问您的主服务器和文件他们想要的,但仍然得不到任何东西。

身份验证服务器可以被锁得更紧,使攻击的表面积最小化--更不用说攻击必须通过您的主服务器发生。

票数 7
EN

Security用户

发布于 2012-02-22 11:15:58

不要加密密码-(单向)散列.

您不需要或不想解密密码。如果你这么做了,你就不会那么担心安全了。

安全性总是与性能之间的权衡。

除非攻击者了解salt,否则标准哈希算法(md5,sha1)是安全的。

即使攻击者能够访问代码和存储的哈希,使用缓慢的散列算法也可以确保密码的安全。

隐窝功能可能是您在php中想要的。使用大量的加密轮将使计算给定输入的哈希变得缓慢;这将使强制执行变得不可行,但也使您/您的应用程序无法验证用户输入的密码是否与您存储的散列相同--这就是交换。

加倍技术并不能提高安全性-- salt中的加密回合参数意味着它将哈希输入字符串返回到哈希算法中的输出多次--您提出了一个定制+1,只需在要执行的回合数中添加一个。此外,对于给定的sha1(crypt[blowfish.salt],salt)示例,这将阻止您正确地将散列与用户输入进行比较--从第一个例子

您应该将crypt()的整个结果作为比较密码的salt

如果没有加密的输出,就不能将用户输入与已经生成的哈希进行比较.

票数 7
EN

Security用户

发布于 2012-02-22 09:09:08

好的--首先,这里有很多问题,所以,虽然我会有一个快速的,你可能应该首先阅读的问题链接在一边,以及那些与密码密码管理标签。你的许多问题都在这里得到了回答。事实上,它们都是除了您关于应该将加密密钥存储在哪里的特定问题之外。

一个简短的总结:

  1. PHP -通常被认为是相当不安全的。它可以安全到不同的层次,但结构和功能膨胀往往伴随着它意味着,如果安全是你的关键目标,风险应该非常小心地意识到。
  2. 不要将加密密钥与公共数据存储在一起。在一个完全托管的环境中,这可能很难管理,但这是一个很大的风险。
  3. 是的,彩虹表可以在几秒钟内从散列中检索密码,如果您不使用salting - 散列应该使用盐类和缓慢的算法。的话。这是非常安全的(例如,野蛮的强迫将花费不可能的长时间-比宇宙的寿命长)
票数 6
EN
页面原文内容由Security提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://security.stackexchange.com/questions/12009

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档