另一个不算安全问题,但与安全有关的是,完全不能理解散列密码和加密密码之间的区别。这种情况最常见于程序员试图提供不安全的“提醒我密码”的功能的代码中。
到底有什么区别?我一直以为哈希是加密的一种形式。那么发帖人所指的不安全功能是什么?
另一个不算安全问题,但与安全有关的是,完全不能理解散列密码和加密密码之间的区别。这种情况最常见于程序员试图提供不安全的“提醒我密码”的功能的代码中。
到底有什么区别?我一直以为哈希是加密的一种形式。那么发帖人所指的不安全功能是什么?
哈希是一种单向函数,这意味着一旦您对密码进行哈希处理,从哈希值中恢复原始密码非常难。加密是一种双向函数,其中从加密文本中恢复原始文本要容易得多。
普通哈希易被字典攻击破解,攻击者只需预先将字典中的每个单词(或每个长度组合)进行哈希处理,然后使用此新字典查找哈希密码。对于每个存储的哈希密码使用唯一的随机盐,可以使攻击者很难使用此方法。他们基本上需要为您使用的每个盐值创建一个新的唯一字典,这会极大地减缓他们的攻击速度。
使用加密算法存储密码是不安全的,因为如果用户或管理员可以轻松地从加密文本中获取原始密码,则攻击者也可以轻松地执行相同的操作。
如上图所示,如果密码被加密,那么明文密码会一直是一个隐藏的秘密,没有人能够提取出来。然而当密码被哈希时,你就可以放心了,因为几乎没有方法可以从哈希值中恢复出密码。
明文密码可以使用对称加密算法(如DES、AES或其他算法)进行加密,并存储在数据库中。 在身份验证(通过用户名和密码确认身份)时,应用程序将解密存储在数据库中的加密密码,并将其与用户提供的密码进行比较以判断是否相等。 在这种类型的密码处理方法中,即使某些人可以访问数据库表,也无法简单地重复使用密码。 但是,这种方法也有坏消息。 如果某种方式获取了您的应用程序使用的密码密钥及其加密算法,则他/她将能够通过解密查看存储在您的数据库中的所有用户密码。 "这是我得到的最好选项",软件开发人员可能会大声呼喊,但是有没有更好的方法?
是的,有一个方法,也许您已经错过了重点。 您是否注意到根本不需要解密和比较? 如果有一种单向转换方法,可以将密码转换为某个转换后的字,并且不可能反向操作(从转换后的字生成密码)。 现在,即使有人访问数据库,也无法通过转换后的字还原或提取密码。 在此方法中,几乎没有任何方式可以知道您用户的机密密码;这将保护使用相同密码跨多个应用程序的用户。 什么算法可以用于这种方法?
我一直认为加密可以双向转换,以便最终值可以带您回到原始值,而哈希则无法从最终结果还原到原始值。
散列:
它是一种单向算法,一旦散列就无法回滚,这是它与加密的优点所在。
加密
如果我们执行加密,将需要一个密钥。如果此密钥泄漏,则所有密码都可以轻松解密。
另一方面,即使您的数据库被黑客攻击或服务器管理员从数据库中取出数据并使用了散列密码,黑客也无法破解这些散列密码。如果我们使用适当的盐和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 位。
理想情况下,您应该同时执行两个操作。
首先对密码进行哈希处理,以进行单向安全保护。使用盐巴来增加安全性。
然后对哈希值进行加密,以防止字典攻击,如果您的密码哈希数据库被攻破。
尽管其他答案可能是正确的,但在引用所在的上下文中,哈希是一种可用于保护信息的工具,加密是将信息进行处理,使得未经授权的人难以阅读或使用。
以下是你可能想使用其中一种的原因 - 密码找回。
如果你只存储用户密码的哈希值,那么你无法提供“忘记密码”功能。