561 字
3 分钟
Bcrypt和盐
bcrypt 是一种结合了盐值机制的自适应哈希函数。与普通哈希算法的根本区别在于,bcrypt 在设计上内置了盐值的使用,从而显著提升了密码存储的安全性。
普通哈希算法存在一个关键缺陷:对于相同的输入,始终产生相同的输出。这意味着如果多个用户使用相同密码(例如“123456”),其哈希值也会完全相同,系统因此容易受到彩虹表攻击。
彩虹表攻击:彩虹表就是一张升级版的储存常见明文密码和哈希值的表。它通过链式结构和规约函数解决了存储空间的问题,平衡了空间和时间。
盐(Salt) 就是为了解决这个问题而生的。
- 定义:盐是一段随机生成的、足够长的字符串。
- 工作方式:在哈希密码之前,系统会先为每个用户生成一个独一无二的盐,然后把这个盐拼接在用户的密码后面,再对**“密码+盐”** 这个组合进行哈希。
- 存储:最终,系统将哈希结果和盐值本身一起存储到数据库中
由于每个用户拥有独特的盐值,即使密码相同,最终得到的哈希结果也会完全不同。这意味着攻击者无法使用同一张彩虹表破解所有用户密码,而必须为每个盐值单独建立破解表,这使得攻击成本急剧上升,在实际中几乎不可行。
此外,bcrypt 被刻意设计为计算缓慢且内存密集,这种“故意低效”的设计大幅增加了暴力破解和彩虹表构建所需的时间和资源开销。
总结来说,bcrypt = 故意缓慢的哈希算法 + 自动强盐机制 + 可配置的计算成本。
bcrypt的使用在Golang中则是比较简单,具体可以见bcrypt文档
下面简单说一下:
1.生成密码哈希
func GenerateFromPassword(password []byte, cost int) ([]byte, error)2.验证密码
func CompareHashAndPassword(hashedPassword, password []byte) error3.获取哈希成本
func Cost(hashedPassword []byte) (int, error)tips:bcrypt 最多处理 72 字节的密码