当前对该问题的最高投票指出:
另一个与安全性无关的安全性问题虽然完整,但完全无法解决哈希散列密码和加密密码之间的区别。最常见于程序员试图提供不安全的“提醒我密码”功能的代码中。
到底有什么区别?我总是给人以哈希是一种加密形式的印象。海报所指的不安全功能是什么?
当前对该问题的最高投票指出:
另一个与安全性无关的安全性问题虽然完整,但完全无法解决哈希散列密码和加密密码之间的区别。最常见于程序员试图提供不安全的“提醒我密码”功能的代码中。
到底有什么区别?我总是给人以哈希是一种加密形式的印象。海报所指的不安全功能是什么?
Answers:
散列是一种单向函数(嗯,是映射)。这是不可逆的,您应用了安全哈希算法,就无法取回原始字符串。您最多可以做的是生成所谓的“冲突”,即找到提供相同哈希值的不同字符串。加密安全的哈希算法旨在防止冲突的发生。您可以使用彩虹表来攻击安全哈希,可以在存储哈希之前对哈希应用盐来抵消它。
加密是一种适当的(双向)功能。这是可逆的,如果您拥有密钥,则可以解密损坏的字符串以获取原始字符串。
它所指的不安全功能是,如果您对密码进行加密,则您的应用程序会将密钥存储在某个位置,并且可以访问数据库(和/或代码)的攻击者可以通过同时获取密钥和加密文本来获取原始密码,而使用散列是不可能的。
人们通常会说,如果破解者拥有您的数据库或代码,则不需要密码,因此区别不大。这是幼稚的,因为您仍然有责任保护用户的密码,这主要是因为大多数用户确实一次又一次地使用相同的密码,从而使密码泄露的风险更大。
如上图所示,如果密码已加密,则它始终是一个隐藏的秘密,可以由他人提取纯文本密码。但是,对密码进行哈希处理时,您会很轻松,因为几乎没有任何方法可以从哈希值中恢复密码。
可以使用对称加密算法(例如DES,AES)或任何其他算法对纯文本密码进行加密,并将其存储在数据库中。在进行身份验证时(使用用户名和密码确认身份),应用程序将解密存储在数据库中的加密密码,并与用户提供的密码进行比较以确保相等性。在这种类型的密码处理方法中,即使有人可以访问数据库表,密码也不会简单地重复使用。但是,这种方法也有一个坏消息。如果某人以某种方式获得了加密算法以及您的应用程序使用的密钥,则他/她将能够通过解密查看存储在数据库中的所有用户密码。软件开发人员可能会大喊“这是我获得的最佳选择”,但是还有更好的方法吗?
是的,可能是您错过了这里的重点。您是否注意到不需要解密和比较?如果有一种单向转换方法,可以将密码转换为某些转换后的单词,但是反向操作(从转换后的单词生成密码)是不可能的。现在,即使有人可以访问数据库,也无法使用转换后的单词来复制或提取密码。通过这种方法,几乎不会有人知道您用户的最高机密密码。这样可以在多个应用程序中使用相同的密码保护用户。这种方法可以使用哪些算法?
我一直认为加密可以通过两种方式进行转换,即最终值可以将您带回原始值,而使用散列则无法将最终结果转换为原始值。
散列算法通常本质上是加密算法,但主要区别在于加密可通过解密来逆转,而散列则不可。
加密功能通常会接受输入并产生相同或略大的加密输出。
散列函数接受输入并产生通常较小的输出,通常也具有固定大小。
虽然不可能获取散列结果并将其“去散列”以返回原始输入,但通常可以将自己的方式强行强加到产生相同散列的内容。
换句话说,如果身份验证方案采用密码,对其进行哈希处理并将其与require密码的哈希版本进行比较,则可能不需要您实际上知道原始密码,而仅知道其哈希,并且可以蛮力即使密码不同,您也可以通过自己的方式找到匹配的内容。
通常创建哈希函数是为了最大程度地减少冲突的机会,并使其难以仅计算将产生与其他事物相同的哈希的事物。
理想情况下,您应该同时执行这两项操作。
首先为单向安全性哈希密码。使用盐可以增加安全性。
然后,如果您的密码哈希数据库遭到破坏,则对哈希进行加密以防御字典攻击。
散列:
它是一种单向算法,并且一旦进行哈希处理就无法回滚,这是其针对加密的最佳点。
加密
如果我们执行加密,则将有一个密钥来执行此操作。如果此密钥泄漏,则可以轻松解密所有密码。
另一方面,即使您的数据库将被黑客入侵,或者您的服务器管理员从数据库中获取数据并且您使用了哈希密码,黑客也无法破解这些哈希密码。如果我们在PBKDF2中使用带有适当盐值和额外安全性的哈希,这实际上几乎是不可能的。
如果您想了解如何编写哈希函数,可以访问此处。
有许多算法可以执行散列。
MD5-使用消息摘要算法5(MD5)哈希函数。输出哈希的长度为128位。MD5算法是Ron Rivest在1990年代初设计的,如今已不再是首选。
SHA1-使用1995年发布的安全哈希算法(SHA1)哈希。输出哈希的长度为160位。尽管使用最广泛,但是今天它并不是首选。
HMACSHA256,HMACSHA384,HMACSHA512-使用SHA-2系列的功能SHA-256,SHA-384和SHA-512。SHA-2于2001年发布。正如哈希函数名称所指示的那样,输出哈希长度分别为256、384和512位。
这是您可能要使用另一个原因的一个原因-密码检索。
如果仅存储用户密码的哈希,则不能提供“忘记密码”功能。