登录接口密码加密传输的设计

对于帐号来说,密码安全非常重要。现在很多C端采用短信验证/联合登录等方式弱化了固定密码的作用,无疑对登录安全性提供了很大的保障。但对于后台系统来说,基本还是采用传统帐号密码登录。密码安全分为存储安全和传输安全,本文主要讲述解决传输安全。

常规增强帐号密码登录安全性的方案:

  • 加密密码本身 不传输明文密码,但被抓包可以直接重放请求,有无明文都无所谓
  • HTTPS 提升抓包解包的难度

其实对于数据安全的考虑都是加密数据,但如果加密后的数据也有价值可被利用,同样是不安全的。我们可以发现不管你如何加密数据,只要别人抓到你的请求数据包,再发一份,一样可以实现目的。

那我们如何来防止重放请求

  • 简单一点对请求数据做一个标识存起来,重发的时候检查一遍,已经处理过就不处理。可行,但我们的缓存是有限的,不可能一直存着。
  • 那反着来,由后端颁发唯一标识并短期缓存,前端请求带过来,检查标识存在则通过,之后再给标识删掉。
  • 可攻击的人也可能去请求标识,并篡改到抓包的重放请求里。所以我们要把标识和他一定不知道的密码放在一起加密,这样便无法替换。

上面的设想说完了,下面开始介绍我的方案

  • 前端点击登录时向后端请求获取种子(标识)
    • 种子由3个部分构成:
      • 时间戳 可对种子校验设定有效期,过期请求直接拒绝
      • 随机字符
      • 校验位 由前两个元素计算得出
  • 前端将种子与密码打包加密
  • 调用后端登录
    • 解密
    • 校验种子校验位
    • 校验种子是否过期
    • 校验请求是否存在缓存
    • 将请求缓存
    • 业务逻辑。。。

说明

  • 没有与设想中的一致,是不希望过期请求也要走缓存查询才知道。
  • 缓存有效期与种子有效期一致。请求重放时,若在种子有效期内缓存校验会不通过,反之种子有效期校验就过不了。
  • 种子最重要的就是时间戳,但前端的时间无意义,所以走后端获取。

逻辑流程图

登录密码加密.png

你可能感兴趣的:(登录接口密码加密传输的设计)