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个字符。)
这会拖慢黑客的攻击速度,增加破解密码的难度。