散列算法是单向函数。他们采用任何字符串并将其变成固定长度的“指纹”,该指纹无法反转。这意味着,如果数据库中的数据受到破坏,则黑客无法很好地获得用户密码,因为用户密码从来没有以哈希表的形式存储在驱动器上。使用哈希的网站通常具有以下工作流程:
1. 用户创建一个帐户
2. 他们的密码被散列并存储在数据库中
3. 当用户尝试登录时,将其输入密码的哈希值与数据库中存储的密码进行比较
4. 如果哈希匹配,则用户可以访问该帐户。
5. 如果不是,则会发回一般错误消息,例如“输入的无效凭据”,这样黑客就无法将错误具体跟踪到用户名或密码。
hash("hello")=2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824
hash("hellu")=3937f988aeb57b6fd75b9c71bf17b9658ec97823bab613df438389b0c896b724
hash("danny")=668e2b73ac556a2f051304702da290160b29bad3392ddcc72074fefbee80c55a
注意:仅安全或加密哈希函数可用于密码哈希。
令人遗憾的是,仅对密码进行哈希加密并不能确保安全性。
破解哈希:蛮力和字典攻击
解密哈希的最简单方法是猜测密码。这样做的方法是猜测用户密码,对猜测值进行哈希处理,然后将其与您要解决的实际密码的哈希值进行比较。如果两个哈希值匹配,则未加密的猜测版本就是正确的密码。
一个蛮力攻击经历给予一定的字符长度的每一个可能的组合。即使他们最终会100%破解任何给定的密码,但由于此方法的计算量很大,因此很难使用该方法。使用蛮力破解某些长度甚至很短的密码可能要花费数千年的时间。
Tryingaaa:failed
Tryingaab:failed
Tryingaac:failed
...
Tryingacb:failed
Tryingacc:success
字典攻击使用的文件包含可能是已使用密码的常用单词,短语或密码。还有,你可以找到数据库是按住顶部100000最常用的密码。攻击会对这些密码进行哈希处理,然后将哈希值与密码进行比较以破解。对于破解普通的JoeShmo来说,这有时是一个很好的使用方法,并且肯定比使用蛮力攻击要快。
查找表可以通过预先计算哈希值来提高破解性能,因此,当需要猜测密码时,程序无需花费计算时间实际对猜测值进行哈希处理。
在下一节中,我们将研究“盐化”,这使这些破解方法无法可靠地使用。
查找表,字典攻击和暴力攻击之所以可以起作用的原因是,每次密码都以相同的方式散列。我们可以通过在哈希之前或之后在密码前添加一个称为salt的随机字符串来使哈希随机化。
hash("hello")=2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824
hash("hello"+"jHjdbJShdiodb")=6f7f167a978166ee23b32c9531ce5dc23ae8fc26e412045858d938d11470831f
盐不必是秘密的,因为攻击者不知道盐将是什么,因此无法为其创建预先计算的表。
注意事项
·对每个哈希密码重复使用相同的盐
·使用短盐
·使用奇怪的双哈希值(例如:hash(hash(hash(‘mypass’))))在盐里
·使用加密安全的伪随机数生成器生成随机盐
·为散列的每个密码生成一个新的随机唯一盐
·产生长盐
盐化工作流程
存储密码:
·用CSPRNG生成超长盐
·将盐添加到用户密码中并进行哈希处理
·将盐和哈希值保存在数据库中
检查密码:
·从数据库中获取盐和哈希
·将盐添加到提交的密码之前并对其进行哈希处理
·比较散列。如果它们相等,则密码正确
注意:务必总是总是哈希在服务器上。有时未启用JavaScript,并且哈希在客户端不起作用。另外,没有其他人可以访问服务器,因此请确保对服务器进行哈希处理。
上述就是关于密码哈希指南:如何确保数据库安全的全部内容,想了解更多关于数据库安全的信息,请继续关注。