精选文章

密码哈希指南:如何确保数据库安全

2020-09-04 18:00:18 | 来源:中培企业IT培训网

散列算法是单向函数。他们采用任何字符串并将其变成固定长度的“指纹”,该指纹无法反转。这意味着,如果数据库中的数据受到破坏,则黑客无法很好地获得用户密码,因为用户密码从来没有以哈希表的形式存储在驱动器上。使用哈希的网站通常具有以下工作流程:

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,并且哈希在客户端不起作用。另外,没有其他人可以访问服务器,因此请确保对服务器进行哈希处理。

上述就是关于密码哈希指南:如何确保数据库安全的全部内容,想了解更多关于数据库安全的信息,请继续关注中培伟业。

猜你喜欢