Skip to content
trinity edited this page May 8, 2013 · 4 revisions

用户系统保证用户的密码明文安全性,并不保证系统用户身份的绝对可靠

(这里的encryptdecrypt用scrypt吧)

注册流程

  1. 客户端申请注册,提交用户名(Username)、密码(Password)
  2. 服务器验证用户名可用
  3. 服务器计算随机盐(Salt)以及随机数据(Key)
  4. 服务器计算encrypt(Salt+Password, Key)得到密文S
  5. Username, Salt, Key以及S存入数据库

授权流程

  1. 客户端输入用户名(Username)

  2. 服务器根据Username查找出SaltS发送至客户端

  3. 客户端计算decrypt(Salt+Password, S)得到Key0

    根据decrypt函数的特性不正确的Password是根本拿不到Key0的样子

  4. 客户端发送UsernameKey0到服务器

  5. 服务器进行验证并分发许可

攻击方式

数据库内容不泄露

  • 授权流程中的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了……求补充 :)