哈希密码和加密密码之间的区别


140

当前对该问题的最高投票指出:

另一个与安全性无关的安全性问题虽然完整,但完全无法解决哈希散列密码和加密密码之间的区别。最常见于程序员试图提供不安全的“提醒我密码”功能的代码中。

到底有什么区别?我总是给人以哈希是一种加密形式的印象。海报所指的不安全功能是什么?


一篇写得很好的文章,介绍为什么您不应该简单地散列您的秘密/密码。而是使用HMAC。benlog.com/articles/2008/06/19/dont-hash-secrets
杰·库玛

受上StackExchange安全的极好的总结博客:security.blogoverflow.com/2011/11/...
大卫J. Liszewski

@JayKumar:您链接的文章具有很大的误导性。它将密码盐(预期对攻击者可见)与MAC密钥(预期仍为秘密)结合起来。David J. Liszewski的链接提供了更加准确的描述。
Rufflewind

Answers:


222

散列是一种单向函数(嗯,是映射)。这是不可逆的,您应用了安全哈希算法,就无法取回原始字符串。您最多可以做的是生成所谓的“冲突”,即找到提供相同哈希值的不同字符串。加密安全的哈希算法旨在防止冲突的发生。您可以使用彩虹表来攻击安全哈希,可以在存储哈希之前对哈希应用来抵消它。

加密是一种适当的(双向)功能。这是可逆的,如果您拥有密钥,则可以解密损坏的字符串以获取原始字符串。

它所指的不安全功能是,如果您对密码进行加密,则您的应用程序会将密钥存储在某个位置,并且可以访问数据库(和/或代码)的攻击者可以通过同时获取密钥和加密文本来获取原始密码,而使用散列是不可能的。

人们通常会说,如果破解者拥有您的数据库或代码,则不需要密码,因此区别不大。这是幼稚的,因为您仍然有责任保护用户的密码,这主要是因为大多数用户确实一次又一次地使用相同的密码,从而使密码泄露的风险更大。


1
为清楚起见,使用散列获得所需的安全性,它必须是具有特定属性的加密安全散列算法,不仅散列是不可逆的,而且在计算上还无法生成任何其他生成相同散列的字符串。
高大的杰夫

11
是的,不是...为了您自己的应用程序的安全性,很难生成哈希冲突,但是不可逆性足以避免密码泄漏。
戴夫·谢罗曼

5
柔滑的:如何从糟糕的哈希函数中找回原始密码?我建议您重新阅读Dave的评论
Vinko Vrsalovic

1
如果有的话,具有大量冲突的哈希函数可以更好地保护密码,但是这显然意味着可以使用更多密码登录该帐户。
williamvicary 2012年

1
无法对@ n00b盐进行硬编码,因为每个哈希项都应使用单独的盐。麻烦的一点是,如果UserA和UserB都使用密码“ 1234”,则如果您发现UserA的密码,您就不能告诉UserB使用相同的密码,因为它们的盐不同。盐的机密性并不是安全性的关键,大多数实现只是将盐串联到表示哈希的二进制Blob的前面或后面。
斯科特·张伯伦

34

散列是一个单向函数,这意味着一旦你散列密码,这是非常难以得到哈希原密码改回。加密是一种双向功能,从加密文本取回原始文本要容易得多。

普通散列很容易通过字典攻击来克服,攻击者只需预先对字典中的每个单词(或每个字符的特定长度之前的字符串)进行预哈希处理,然后使用此新字典来查找哈希密码。对存储的每个哈希密码使用唯一的随机盐会使攻击者更难以使用此方法。他们基本上需要为您使用的每个盐值创建一个新的唯一词典,从而极大地降低攻击速度。

使用加密算法存储密码是不安全的,因为如果用户或管理员更容易从加密文本中获取原始密码,那么攻击者也更容易这样做。


12

加密密码与哈希密码

如上图所示,如果密码已加密,则它始终是一个隐藏的秘密,可以由他人提取纯文本密码。但是,对密码进行哈希处理时,您会很轻松,因为几乎没有任何方法可以从哈希值中恢复密码。


摘自 加密密码与哈希密码中 -哪个更好?

加密好吗?

可以使用对称加密算法(例如DES,AES)或任何其他算法对纯文本密码进行加密,并将其存储在数据库中。在进行身份验证时(使用用户名和密码确认身份),应用程序将解密存储在数据库中的加密密码,并与用户提供的密码进行比较以确保相等性。在这种类型的密码处理方法中,即使有人可以访问数据库表,密码也不会简单地重复使用。但是,这种方法也有一个坏消息。如果某人以某种方式获得了加密算法以及您的应用程序使用的密钥,则他/她将能够通过解密查看存储在数据库中的所有用户密码。软件开发人员可能会大喊“这是我获得的最佳选择”,但是还有更好的方法吗?

加密哈希函数(单向)

是的,可能是您错过了这里的重点。您是否注意到不需要解密和比较?如果有一种单向转换方法,可以将密码转换为某些转换后的单词,但是反向操作(从转换后的单词生成密码)是不可能的。现在,即使有人可以访问数据库,也无法使用转换后的单词来复制或提取密码。通过这种方法,几乎​​不会有人知道您用户的最高机密密码。这样可以在多个应用程序中使用相同的密码保护用户。这种方法可以使用哪些算法?


可以,但是登录服务时,密码以纯文本/加密形式发送,因为如果将密码作为哈希发送到要比较的服务器。如果黑客知道哈希,就可以将哈希发送到服务器以进行登录。这就是为什么需要比较的密码必须加密发送到服务器,然后在服务器上解密和散列。这是安全的吧?只要密码永远不会以散列的形式长期存储,并且不再需要将所有出现的加密/纯文本密码从任何内存中删除?
AgentM

8

我一直认为加密可以通过两种方式进行转换,即最终值可以将您带回原始值,而使用散列则无法将最终结果转换为原始值。


8

散列算法通常本质上是加密算法,但主要区别在于加密可通过解密来逆转,而散列则不可。

加密功能通常会接受输入并产生相同或略大的加密输出。

散列函数接受输入并产生通常较小的输出,通常也具有固定大小。

虽然不可能获取散列结果并将其“去散列”以返回原始输入,但通常可以将自己的方式强行强加到产生相同散列的内容。

换句话说,如果身份验证方案采用密码,对其进行哈希处理并将其与require密码的哈希版本进行比较,则可能不需要您实际上知道原始密码,而仅知道其哈希,并且可以蛮力即使密码不同,您也可以通过自己的方式找到匹配的内容。

通常创建哈希函数是为了最大程度地减少冲突的机会,并使其难以仅计算将产生与其他事物相同的哈希的事物。


4

理想情况下,您应该同时执行这两项操作。

首先为单向安全性哈希密码。使用盐可以增加安全性。

然后,如果您的密码哈希数据库遭到破坏,则对哈希进行加密以防御字典攻击。


3
用什么加密呢?如果他们如此努力地伪造您,以至于他们使用您所有用户的密码(哈希,加密或其他密码)进入数据库,他们难道找不到能够解密它们的密钥吗?
卢克

5
这不应该被否决。不应该排除如此容易的可能性,即数据库被破坏而应用程序未被破坏。因此,加密散列是额外的安全层。
Arie 2015年

@Luc我不同意你,我以前的自我。我已经看到太多的SQL注入不会破坏应用程序代码(或配置文件),并且我现在认为添加机密是有用的,无论是加密形式还是胡椒形式,但它不能替代哈希。有关更完整的答案,请参见此处:security.stackexchange.com/a/31846/10863
Luc

3

散列

它是一种单向算法,并且一旦进行哈希处理就无法回滚,这是其针对加密的最佳点。

加密

如果我们执行加密,则将有一个密钥来执行此操作。如果此密钥泄漏,则可以轻松解密所有密码。

另一方面,即使您的数据库将被黑客入侵,或者您的服务器管理员从数据库中获取数据并且您使用了哈希密码,黑客也无法破解这些哈希密码。如果我们在PBKDF2中使用带有适当盐值和额外安全性的哈希,这实际上几乎是不可能的。

如果您想了解如何编写哈希函数,可以访问此处

有许多算法可以执行散列。

  1. MD5-使用消息摘要算法5(MD5)哈希函数。输出哈希的长度为128位。MD5算法是Ron Rivest在1990年代初设计的,如今已不再是首选。

  2. SHA1-使用1995年发布的安全哈希算法(SHA1)哈希。输出哈希的长度为160位。尽管使用最广泛,但是今天它并不是首选。

  3. HMACSHA256HMACSHA384HMACSHA512-使用SHA-2系列的功能SHA-256,SHA-384和SHA-512。SHA-2于2001年发布。正如哈希函数名称所指示的那样,输出哈希长度分别为256、384和512位。


1

就像其他答案一样正确,在引用所在的上下文中,哈希是可用于保护信息的工具,加密是一种获取信息的过程,未经授权的人很难阅读/使用。


-9

这是您可能要使用另一个原因的一个原因-密码检索。

如果仅存储用户密码的哈希,则不能提供“忘记密码”功能。


16
很显然,您对所接受的答案的理解不够充分。请仔细阅读:您应该提供密码检索功能。您应该提供密码重置功能。多年来,我已经管理了许多网站,包括vBulletin,phpBB,e107,IPB,blogspot,甚至是我自己定制的CMS。作为管理员,您从不需要任何人的预先加密的密码。你只是没有。而且您也不应该拥有它。如果您不同意我的意思,请让我向您保证:您错了。
Lakey

3
对不起,太生气了。我只是看到太多网站以纯文本形式存储密码,这让我感到沮丧。附带说明:一些注重安全性的网站喜欢让用户定期更改其密码。他们希望确保此人不会将其密码从“ Password1”更改为“ Password2”。因此,他们保留了纯文本密码,以便以后进行这些比较。那不是一个好习惯。在这种情况下,他们需要做的是对密码FIRST进行分析,制作一堆类似的密码(对每个密码进行哈希处理),并仅存储哈希值
Lakey 2013年

7
没问题,它使我回过头来重新阅读问题并进行进一步研究,所以一切都不会丢失:-)我不确定我在写那个答案时在想什么。欢呼声
Philtron,
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.