怎样在数据库中安全存储密码🔒?

195 阅读3分钟

How Databases Keep Passwords Securely 🔒

原文链接:newsletter.systemdesign.one/p/how-to-st…

原文作者:Neo Kim

译者:菜小鸟魔王

怎样在数据库中存储密码?

Hashing

黑客如果发现密码是以明文形式存储的,就能轻而易举地获取这些密码。

因此,我们需要通过哈希函数来对密码进行转换。

使用哈希函数转换密码

哈希函数的作用在于,它能够将密码转换成一个独一无二的字符串 —— 我们称之为“指纹”。重要的是,这种转换是不可逆的,也就是说,你无法从“指纹”反推出原始的密码。

在众多哈希函数中,bcrypt尤为受欢迎,原因有三:(1)它的运算速度较慢。(2)它需要消耗大量的计算资源。(3)它对内存的需求也很高。这些特性使得黑客想要尝试多次破解密码变得相当困难。

通过类比理解哈希

可以将哈希函数比作颜料混合的过程 —— 一旦两种颜色混合,就很难再分离出原始的颜色。

对密码应用哈希函数的处理流程

对密码应用哈希函数的处理流程如下:

  • 当用户创建账户时,系统会根据用户输入的密码生成一个指纹。

  • 数据库中保存的不是密码本身,而是这个指纹。

  • 每次用户输入密码时,系统都会重新生成指纹。

系统会将新生成的指纹与数据库中存储的指纹进行对比,只有两者匹配时,用户才能获得系统访问权限。

最精彩的部分就要来了,准备好阅读了吗?

Salting

黑客可能会利用彩虹表从指纹中破解出密码。

因此,我们在密码中加入了“盐”(salt)。

彩虹表

可以将彩虹表视为一个预先计算好的指纹与密码之间的映射表。

“盐”则是一个随机字符串。

向密码中加入“盐”以创建独特的指纹

每位用户都会获得一个唯一的“盐”,从而生成不同的指纹。简单来说,即使两个用户有相同的密码,他们的指纹也会不同。

加入盐之后,因为指纹变得独一无二,彩虹表就失效了。这会使得彩虹表中预先计算好的值失效。

对密码加盐的处理流程

对密码加盐的处理流程如下:

  • 当用户创建账户时,服务器会为该用户创建一个唯一的“盐”。

  • 服务器将“盐”与用户提供的密码结合并进行哈希处理。

  • 服务器将“盐”和指纹一起存储在数据库中。

密码的验证流程

密码的验证流程如下:

  • 当用户输入密码时,服务器会从数据库中检索特定用户的“盐”。

  • 服务器将输入的密码与“盐”结合来生成指纹。

  • 服务器检查两个指纹是否相同。

准备好学习下一个技巧了吗?

Stretching

黑客可能会采取穷举法攻击来破解密码。

可以把穷举法想象成是在尝试密码锁上所有可能的数字组合。

因此,他们采用了 Stretching 技术。

Stretching原理

可以将 Stretching 技术理解为多次使用同一个哈希函数。这样做使得穷举法攻击的速度减慢,难度增加。

随机生成的密码通常更为安全。(密码长度建议超过12个字符。)

这会拖慢黑客的攻击速度,增加破解密码的难度。