2013-03-24 60 views
1

最近,我一直在寻找添加一些项目的安全性。我一直在进行大量的研究,发现密码哈希是必须的。此外,我得出结论,最好的选择是使用bcrypt,PBKDF2或scrypt。散列,加密或两者都

另外我也看到了关于哈希与加密的大量讨论,并发现很明显哈希更重要。也就是说,经过多次搜索谷歌深度之后,我还没有找到任何有关加密已经适当散列的密码是否有益的任何信息,这些信息会造成伤害或相对中性。

做这两项工作的CPU成本是否值得呢?有没有什么陷阱?

回答

2

加密某些东西会导致需要解密,这反过来会导致您已经拥有的问题:安全存储秘密。

假设你要存储密码的哈希值,而不是纯文本你基本上是这样做的:

hashpw := hash(salt + password) 

您然后存储在一个文件中salthashpw和使用这些数据,而不是明文密码。 (请注意,在许多情况下,盐和密码连接的顺序是至关重要的,并且这只是过程的可视化,仅此而已;使用工具来生成盐渍散列)。

一个可能的攻击者则需要猜测盐和明文密码与 存储hashpw,这是因为你正在使用的哈希算法(碰撞率)作为安全检查的匹配。

使用某些密码加密某些东西的好处是能够恢复纯文本,而散列方式并不提供这种纯文本。它还要求解密密文的系统具有可用的密钥 。假设您用一些密钥bar加密字符串foo。要解密产生的密文 brn您需要再次输入密钥bar。此密钥需要系统上的安全存储,并且如果密钥向攻击者暴露 ,则所有安全性都将消失。

作为一般经验法则,我会说哈希提供了一种很好的方式来存储 检查的文本(例如密码),因为其安全性由散列算法的冲突率确定。另一方面,加密技术是您正在使用的技术来安全地存储数据的其余部分。

+2

+1您的最后一段是关键部分 - 了解通行短语需要*确认*而不是*取回*。 – 2013-03-24 11:14:52

+0

我同意邓肯。最后一段确实指出了这个问题。由于它是一个确认问题,而不是检索,因此单独使用密码似乎是一种方法。 – foochow 2013-03-24 17:01:17

+1

@Foo_Chow - 实际上在加密散列值方面有益处。这可能是向散列添加服务器端秘密(胡椒)的最佳方式,我在[答案](http://stackoverflow.com/a/16893270/575765)中解释了这个问题。 – martinstoeckli 2013-06-27 09:41:46

-4

我只是简单地加密密码。散列速度很快,但对密码有点不安全。当我出于安全目的使用散列时,通常用于消息签名等。消息+散列(消息+密码),以便可以验证消息,但我不是该领域的专家。我没有看到两者兼而有之。

+0

加密是可逆的。绝对不是一个独立的解决方案 – foochow 2013-03-24 06:07:56

+1

密码加密通常是不被接受的。哈希是相当安全的,当与盐结合时被认为是最佳实践。 – 2013-03-24 11:12:52

2

你在正确的轨道上。使用密钥派生/密码散列函数,就像你所提到的那样。

不要只使用散列或盐渍散列。主要问题是传统的散列算法(MD5,SHA- *等)是快速的。这对密码存储没有好处,并且许多实现都是易碎的,即使添加盐也是如此。

加密总是引入与密钥管理相关的问题。应该避免密码存储。

KDF的优点是工作因素。它的设计速度慢,计算成本高昂,这就是为什么他们想到这种情况。因为Scrypt需要一定数量的内存才能执行,所以Scrypt是您正在查看的选项中最具弹性的选项。这会杀死GPU攻击矢量。无论您选择哪种方式都有权衡,但只要您在可配置的地方使用适当的工作因素,您的所有选择都可以。

+0

我喜欢你对密钥管理有关加密的观点,似乎与单独使用散列最好用于密码的共识一致 – foochow 2013-06-27 03:31:16