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

时间:2008-11-28 21:14:57

标签: security language-agnostic encryption hash passwords

目前排名最高的this question州:

  

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

这究竟是什么区别?我总是认为哈希是一种加密形式。海报所指的不安全功能是什么?

9 个答案:

答案 0 :(得分:192)

哈希是一种单向函数(嗯,映射)。这是不可逆转的,你应用安全哈希算法,你不能得到原来的字符串。你能做的最多就是生成所谓的“碰撞”,即找到一个提供相同散列的不同字符串。密码安全散列算法旨在防止冲突的发生。您可以使用rainbow table攻击安全哈希,您可以通过在存储之前对哈希应用salt来抵消这种哈希。

加密是一种正确的(双向)功能。它是可逆的,如果你有密钥,你可以解密受损的字符串以获得原始字符串。

它所指的不安全功能是,如果您加密密码,您的应用程序将密钥存储在某个地方,并且访问您的数据库(和/或代码)的攻击者可以通过获取密钥和密钥来获取原始密码。加密文本,而哈希是不可能的。

人们通常会说,如果一个饼干拥有你的数据库或你的代码,他不需要密码,因此差别没有实际意义。这是天真的,因为你仍然有责任保护用户的密码,主要是因为他们中的大多数密码一次又一次地使用相同的密码,通过泄露密码使他们面临更大的风险。

答案 1 :(得分:30)

散列是一种单向函数,这意味着一旦您对密码进行散列处理,非常很难从散列中获取原始密码。加密是一种双向功能,从加密文本中获取原始文本要容易得多。

使用字典攻击很容易打败普通哈希,攻击者只是预先挖掘字典中的每个单词(或每个字符组合达到一定长度),然后使用这个新字典查找散列密码。对存储的每个散列密码使用唯一的随机盐会使攻击者更难以使用此方法。他们基本上需要为你使用的每个盐值创建一个新的独特字典,从而大大减缓他们的攻击。<​​/ p>

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

答案 2 :(得分:10)

Encrypted vs Hashed Passwords

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


摘自Encrypted vs Hashed Passwords - Which is better?

加密好吗?

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

加密哈希函数(仅限单向)

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

答案 3 :(得分:8)

我一直认为加密可以通过两种方式进行转换,最终值可以使您达到原始值,而使用哈希,您将无法从最终结果恢复为原始值。

答案 4 :(得分:7)

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

加密函数通常接受输入并生成相同或稍大的加密输出。

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

虽然无法获取散列结果并“取消”它以取回原始输入,但您通常可以通过强制方式获得产生相同散列的内容。

换句话说,如果身份验证方案接受密码,对其进行哈希处理,并将其与需要密码的哈希版本进行比较,则可能不需要您实际知道原始密码,只知道其哈希值,并且您可以即使是不同的密码,也要蛮力地使用匹配的东西。

通常会创建散列函数以最大限度地减少冲突的可能性,并且很难计算出与其他东西产生相同散列的内容。

答案 5 :(得分:3)

理想情况下,你应该同时做到这两点。

首先哈希单向安全的密码。使用盐可以提高安全性。

如果您的密码哈希数据库受到损害,则加密哈希以防止字典攻击。

答案 6 :(得分:3)

哈希

这是一种单向算法,一旦哈希不能回滚,这是加密的最佳点。

<强>加密

如果我们执行加密,则会有一个关键来执行此操作。如果此密钥泄露,您的所有密码都可以轻松解密。

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

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

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

  1. MD5 - 使用消息摘要算法5(MD5)哈希函数。输出散列的长度为128位。 MD5算法由Ron Rivest在20世纪90年代初设计,今天不是首选。

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

  3. HMACSHA256 HMACSHA384 HMACSHA512 - 使用SHA-256,SHA-384和SHA-512的功能SHA-2家族。 SHA-2于2001年发布。输出散列长度分别为256,384和512位,因为散列函数的名称表示。

答案 7 :(得分:1)

正如其他答案可能的那样,在引用所在的上下文中,散列是一种可用于保护信息的工具,加密是一个获取信息并使未经授权的人员很难阅读的过程/使用。

答案 8 :(得分:-9)

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

如果您只存储用户密码的哈希值,则无法提供“忘记密码”功能。