前言
作者:神的孩子在歌唱
大家好,我叫智
让我们先谈谈什么不该做。
不要以明文形式存储密码。任何具有数据库内部访问权限的人都可以看到它们。如果数据库受损,攻击者可以轻松获取所有密码。那么,我们应该如何在数据库中安全地存储密码呢。
现代散列(Hash)算法。
Hash函数被普遍的应用于各类不一样的安全应用和网络协议中。
哈希是一个单向函数,是不可逆。不可能解密散列以获得原始值。如果攻击者获得散列密码,他们就不能直接将其输入应用程序以获得访问权限。
目前常见的散列(Hash)算法
使用现代散列函数安全存储密码。这些函数是使用更多资源进行计算的 “慢”函数 。这使得暴力攻击效果很低。不过一些常见的传统散列函数(如MD5和SHA-1)是 “快速” 的。它们不太安全,不应该被使用作为加密。
网络安全攻防:密码技术之散列算法
将密码存储为单向散列是朝着正确方向迈出的一步,但这还不够。攻击者可以通过预计算要攻击单向散列。一些常见的攻击是 彩虹表(rainbow table) 和基于数据库的查找。使用这些技术,黑客可以在几秒钟内破解密码,也就是会枚举很多常见的密码,一一去查找。
彩虹表:彩虹表是一个数据库,用于通过破解密码哈希来获得身份验证。
通过在散列过程中添加每个密码唯一的salt,可以确保散列对于每个密码都是唯一的。加上盐后需要穷举密码+salt的所有组合,这个计算量就相当大了,想要破解已经比较难了。
什么是彩虹表(Rainbow Table)
计算机系统中的密码不是直接存储为纯文本,而是使用加密进行哈希处理。哈希函数是单向函数,这意味着它不能被解密。每当用户输入密码时,密码都会转换为哈希值,并与已存储的哈希值进行比较。如果值匹配,则对用户进行身份验证。
加盐密码
salt是唯一的随机生成的字符串,作为散列过程的一部分添加到每个密码中。
首先将用户提供的密码与随机生成的salt相结合。然后,我们使用适当的散列函数计算该组合的散列。散列与盐一起存储在数据库中。同样,salt用于生成唯一散列。它不是秘密,可以作为纯文本安全存储在数据库中。
当用户登录时,我们如何根据数据库中存储的内容验证密码?首先,我们从数据库中获取用户的salt。然后,我们将salt附加到用户提供的密码并对其进行散列。我们将计算出的散列与数据库中存储的散列进行比较。如果它们相同,则密码有效。
本人csdn博客:https://blog.csdn.net/weixin_46654114
转载说明:跟我说明,务必注明来源,附带本人博客连接。
版权归原作者 神的孩子都在歌唱 所有, 如有侵权,请联系我们删除。