type
status
date
slug
summary
tags
category
icon
password
Sub-item
Last edited time
Oct 29, 2023 02:51 AM
Parent item
领域
密码保存的安全性有两个大前提:
- 预计最坏的情况,攻击者已经知道除了用户原始密码的任何信息。包括全部程序、加密算法、数据库信息等等。
- 世上没有绝对的安全,但是假如当破解密码需要的成本超过获得的收益,就是相对安全的。
安全存储:使用耗时的加密 + Salt
为每一个用户的密码进行加盐后再加密,在数据库中保存加密后的密码和盐。
这里可以是对称加密。也可以是简单的hash处理:
H[S(a) + P(a)] -> P'(a)
,P(a)表示用户a的原始密码,S(a)表示用户a使用的盐,H表示加密或hash函数。- 因为每个密码加了盐,无法直接使用彩虹表破解
- 因为每个用户的盐都不同,导致破解全部密码的成本非常高
密码保护算法
上述描述中的H可以使用下面的专用算法,提高安全性。
- bcrypt密码哈希函数:可控耗时
- scrypt
安全传输
一般都使用HTTPS来安全参数用户原始密码,但是如果特殊情况下,无法使用HTTPS,那么需要对原始密码进行加密后传输。
- 用户注册时,传输密码明文到后端,后端使用默认的aes加密密码并存储到数据库。如果是admin来生成密码, 那么用户无需传输密码,降低泄露风险
- 用户登录时,先从后台获取后台时间戳,在客户端组合时间戳和原始密码,并计算一个hash值,传输给后端
- 后端从数据库获取加密后的密码,并解密得到原始密码,然后使用相同的算法,组合原始密码和时间戳,计算hash,如果值一样,表示用户传输正确。
注意:这里后端使用的时间戳和前端的时间戳有可能存在1-2秒的差异,此时需要判断重试, 或者控制时间戳的精度
- 获得原始密码后,再组合各个用户的盐,验证密码是否正确