-
Notifications
You must be signed in to change notification settings - Fork 0
密码策略
用户系统保证用户的密码明文安全性,并不保证系统用户身份的绝对可靠
(这里的encrypt
和decrypt
用scrypt吧)
- 客户端申请注册,提交用户名(Username)、密码(Password)
- 服务器验证用户名可用
- 服务器计算随机盐(Salt)以及随机数据(Key)
- 服务器计算
encrypt(Salt+Password, Key)
得到密文S
- 将
Username
,Salt
,Key
以及S
存入数据库
-
客户端输入用户名(Username)
-
服务器根据
Username
查找出Salt
和S
发送至客户端 -
客户端计算
decrypt(Salt+Password, S)
得到Key0
根据
decrypt
函数的特性不正确的Password是根本拿不到Key0
的样子 -
客户端发送
Username
和Key0
到服务器 -
服务器进行验证并分发许可
-
授权流程中的
Key0
将直接成为可以对系统进行Brute Force攻击的 逻辑上的密码可以通过增加
Key
的长度,以及 多次登录要求验证码 策略来有效 避免这类攻击 -
时间攻击
客户端对
Key0
进行运算看上去增加了时间攻击的可行度, 然而客户端是不知道演算出的Key0
是否正确的,客户端验证Key0
的行为 可以近似看成Brute Force进行应对
-
查表法Hash攻击/彩虹表
数据库内容已知即Hacker已经知道
Key
,为Password加了Salt
并使用了 低速加密之后,能够完全杜绝大量用户明文密码破解的风险;对单个用户的密码, Hacker仍然可以通过构造彩虹表的方式(此时Salt
已知)进行破译, 此时依赖低速加密算法对破解造成阻碍。因此不排除个别用户的明文密码被 破译的可能性,但由于这种状况对Hacker的运算资源要求很高……几率还是很小的 (scrypt
是并行安全的KDF算法来着,感谢 @Tydus 补姿势 OwO) -
时间攻击
知道
Key
的情况下的时间攻击可行性依赖于decrypt
函数的时间特性 (比如可以采用时间安全的KDF算法,不会产生额外的服务器开销, 主要还是看客户端加密库里面提不提供 这样的算法)
安全性是系统整体的特性,单独组件的安全并不能保障系统整体的安全性, 本授权方式不保证系统内容的安全性,只最大程度的保障用户密码的保密性
如果有什么地方Naive了……求补充 :)