散列密码和encryption之间的区别
这个问题的最高票数表明:
另一个并不是安全问题,尽pipe它是与安全有关的,但完全并且可能会失败,以避免散列密码和encryption密码之间的区别 。 最常见的代码是程序员试图提供不安全的“提醒我的密码”function。
这个区别究竟是什么? 我总是觉得哈希是一种encryption的forms。 海报所指的不安全function是什么?
散列是一种单向函数(也就是映射)。 这是不可逆的,你应用安全哈希algorithm,你不能得到原来的string。 你所能做的最多的是产生所谓的“碰撞”,即find一个提供相同散列的不同string。 encryption的安全哈希algorithm被devise来防止碰撞的发生。 您可以通过使用彩虹表来攻击安全的散列表 ,在存储散列表之前,可以通过对散列表应用盐来抵消这种散列表。
encryption是一个适当的(双向)function。 这是可逆的,如果你有密钥的话,你可以解密mangledstring以得到原始string。
它所指的不安全的function是,如果你encryption密码,你的应用程序将密钥存储在某个地方,攻击者可以访问你的数据库(和/或代码),通过获得密钥和encryption文本,而用哈希是不可能的。
人们通常会说,如果一个cookies拥有你的数据库或你的代码,他不需要密码,所以这个区别是没有意义的。 这是天真的,因为你仍然有责任保护你的用户的密码,主要是因为他们中的大多数使用相同的密码一遍又一遍,泄露他们的密码使他们面临更大的风险。
散列是一个单向函数,这意味着一旦你散列了密码,就很难从散列中获得原始密码。 encryption是一种双向function,从encryption文本中获取原始文本变得更加容易。
使用字典攻击很容易击败简单散列,攻击者只需在字典中预先散列每个字(或每个字符的组合),然后使用这个新的字典查找散列的密码。 对存储的每个哈希密码使用唯一的随机盐,使得攻击者使用这种方法更加困难。 他们基本上需要为你使用的每一个盐值创build一个新的独特的字典,使他们的攻击变得非常缓慢。
使用encryptionalgorithm存储密码是不安全的,因为如果用户或pipe理员从encryption的文本中获取原始密码更容易,攻击者也可以更容易地执行相同的操作。
我一直认为Encryption可以转换两种方式,最终值可以带来原始价值和哈希,你将无法从最终结果恢复到原来的价值。
散列algorithm本质上通常是密码algorithm,但主要区别在于encryption通过解密是可逆的,而散列algorithm则不是。
encryptionfunction通常需要input并产生相同或稍大的encryption输出。
哈希函数需要input并产生一个通常较小的输出,通常也是固定的大小。
尽pipe无法获得散列结果并“去散乱”它以获取原始input,但通常可以通过暴力方式产生相同的散列值。
换句话说,如果一个authenticationscheme需要一个密码,对它进行散列,并将其与需要密码的散列版本进行比较,那么可能不需要你真正知道原始密码,只有它的散列,并且可以蛮力你的方式来匹配,即使它是一个不同的密码。
散列函数通常被创build以最小化碰撞的可能性,并且使得难以计算将产生与其他东西相同的散列的东西。
如上图所示,如果密码是encryption的,它总是一个隐藏的秘密,有人可以提取纯文本密码。 但是,当密码被散列时,由于几乎没有从散列值中恢复密码的方法,所以放松了。
从encryption与哈希密码提取- 哪个更好?
encryption好吗?
纯文本密码可以使用对称encryptionalgorithm(如DES,AES)或任何其他algorithm进行encryption,并存储在数据库内。 在authentication时(用户名和密码确认身份),应用程序将解密存储在数据库中的encryption密码,并与用户提供的密码进行比较以求相等。 在这种types的密码处理方法中,即使有人访问数据库表,密码也不会简单地重复使用。 但是这个方法也有一个坏消息。 如果有人获得encryptionalgorithm以及应用程序使用的密钥,他/她将能够通过解密来查看存储在数据库中的所有用户密码。 “这是我得到的最好的select”,一个软件开发人员可能会尖叫,但是还有更好的方法吗?
encryption散列函数(单向)
是的,可能你错过了这里的观点。 你有没有注意到没有解密和比较的要求? 如果只有单向转换的方法,那么密码可以转换成一些转换字,但是反向操作(转换字的密码生成)是不可能的。 现在,即使有人访问数据库,也无法使用转换后的字来重现或提取密码。 在这种方法中,几乎不会有人知道你的用户的绝密密码。 这将保护跨多个应用程序使用相同的密码的用户。 什么algorithm可以用于这种方法?
哈希:这是一个单向algorithm,一旦哈希不能回滚,这是它encryption的甜点。 如果我们进行encryption,将有一个关键要做到这一点。 如果这个密钥被泄露,所有的密码都可以被轻易解密。 另一方面,即使您的数据库将被黑客入侵,或者您的服务器pipe理员从数据库中获取了数据,并且您使用了哈希密码,黑客也无法破解这些哈希密码。 如果我们使用PBKDF2的合适的盐和额外的安全性进行散列,实际上这实际上是不可能的。
如果你想看看你应该如何编写你的散列函数,你可以访问这里 。
有很多algorithm来执行散列。
-
MD5 – 使用消息摘要algorithm5(MD5)散列函数。 输出散列长度是128位。 MD5algorithm由Ron Rivest在20世纪90年代初devise,现在不是首选。
-
SHA1 – 使用1995年发布的安全散列algorithm(SHA1)散列。输出散列长度为160位。 虽然使用最广泛,但这不是今天的首选。
-
HMACSHA256,HMACSHA384,HMACSHA512 – 使用SHA-2系列的SHA-256,SHA-384和SHA-512function。 SHA-2在2001年发布。散列函数的名字所表示的散列长度分别是256,384和512位。
正如其他答案一样,在引用的上下文中,哈希是一个可用于保护信息的工具,encryption是一个获取信息的过程,非授权人员读取/使用非常困难。
理想情况下,你应该两个都做。
首先哈希单向安全的密码。 使用盐来提高安全性。
然后encryption哈希来抵御字典攻击,如果你的密码哈希数据库被泄漏。
这里有一个原因,你可能想要使用一个 – 密码检索。
如果您只存储用户密码的散列,则不能提供“忘记密码”function。