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

目前投票最多的 这个问题成员国是:

另一个与安全问题没有太大关系的问题,尽管是与安全相关的,却是 理解哈希密码和加密密码之间的区别的彻底失败。在程序员试图提供不安全的“提醒我我的密码”功能的代码中最常见。

这到底有什么区别?我一直以为散列是加密的一种形式。海报所指的不安全功能是什么?

142631 次浏览

散列是单向函数(映射)。这是不可逆的,你应用 SHA家族,你不能得到原来的字符串回来。您最多只能生成所谓的“冲突”,即查找提供相同散列的不同字符串。密码安全哈希算法的目的是防止冲突的发生。您可以通过使用 彩虹桌来攻击安全散列,您可以在存储散列之前将 应用于该散列来抵消这种攻击。

加密是一个适当的(双向)函数。它是可逆的,如果你有密钥,你可以解密错误的字符串来得到原始的字符串。

它所指的不安全功能是,如果你加密密码,你的应用程序有密钥存储在某处,攻击者访问你的数据库(和/或代码)可以获得原始密码的密钥和加密文本,而哈希是不可能的。

人们通常说,如果一个黑客拥有你的数据库或代码,他不需要密码,因此,差异是没有意义的。这是幼稚的,因为你仍然有责任保护你的用户的密码,主要是因为他们中的大多数确实使用相同的密码一遍又一遍,使他们面临更大的风险,泄露他们的密码。

散列是一个单向函数,这意味着一旦你散列了一个密码,就很难从散列中得到原始的密码。加密是一个双向函数,从加密的文本中获取原始文本要容易得多。

普通散列很容易被字典式攻击破解,攻击者只需预先散列字典中的每个单词(或者每个字符组合到一定长度) ,然后使用这个新字典查找散列密码。对存储的每个散列密码使用唯一的随机盐会使攻击者更难使用这种方法。他们基本上需要为你使用的每个盐值创建一个新的独一无二的字典,极大地减缓了他们的攻击。

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

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

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

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

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

虽然不可能获取一个散列结果并“ dehash”它以返回原始输入,但是您通常可以强行获取产生相同散列的结果。

换句话说,如果一个身份验证方案获取一个密码,对其进行哈希,并将其与所需密码的哈希版本进行比较,那么可能并不需要你真正知道原始密码,只需要知道它的哈希,而且你可以强行找到匹配的密码,即使它是一个不同的密码。

散列函数的创建通常是为了最小化冲突的可能性,并使得仅仅计算将产生与其他函数相同的散列变得很困难。

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

理想情况下,你应该两者兼顾。

首先散列单向安全的通行密码。使用 salt 增加安全性。

然后加密哈希,以防止字典攻击,如果您的密码哈希数据库是妥协的。

这里有一个原因,你可能想使用一个比其他-密码检索。

如果只存储用户密码的散列,则无法提供“忘记密码”功能。

Encrypted vs Hashed Passwords

如上图所示,如果密码是加密的,它总是一个隐藏的秘密,有人可以提取纯文本密码。但是,当密码进行散列时,您可以放松,因为几乎没有任何方法可以从散列值中恢复密码。


取自 加密与散列密码-哪个更好?

加密好吗?

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

密码杂凑函数(单程)

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

哈希 :

它是一个单向算法,一旦散列就不能回滚,这是它对抗加密的最佳点。

加密

如果我们执行加密,就会有一个密钥来执行此操作。如果这个密钥将被泄露,所有您的密码可以很容易地解密。

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

如果您想了解如何编写散列函数,可以访问 给你

执行散列有许多算法。

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

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

  3. HMACSHA256 HMACSHA384HMACSHA512-使用 SHA-2家族的功能 SHA-256,SHA-384和 SHA-512。SHA-2于2001年出版。如哈希函数名所示,输出哈希长度分别为256、384和512位。