不依赖于微信等第三方的扫描登录系统

背景

扫描登录很安全,但基本上大家用的都是基于微信的,需要到开发平台申请。
对于大量的内部系统,比如流程管理系统、企业内部邮箱、各种管理后台,目前大家基本都采用密码登录,相对外面的网站员工在公司内部网站更会用弱密码。
内部系统弱口令的危害很大:资料泄漏、后台权限,而且内部系统往往校验少,更可能被webshell提权。

产品说明

在这样的背景下我一直在琢磨做一个开源的项目,正好我又有些密码学背景,这个项目目前开始动工了,如果符合大家需求希望踊跃留言,我更有动力做下去。

功能

  1. 最主要当然是实现安全的扫描登录,用什么扫?微信扫(调微信小程序)、或者app。我会提供小程序和跨平台的app,ios已上架。
  2. 网站自助接入,不需要任何第三方开通,并且网站接入难度很低
  3. 支持开放注册式的网站,也支持不开放注册的网站
  4. 目前只支持pc网站,后续可能会做app的授权登录

验证流程

  1. 网站接入时生成一对公私钥
  2. 网站登录页面使用sdk生成一个二维码,二维码中包含:一段短时间内唯一的随机数据data+时间戳+网站公钥+网站信息(站点名等)+ 授权后app会回调的url+使用网站私钥对前面的信息进行签名,对于不开放注册网站在url里带上分配给用户的身份id
  3. app扫描二维码后,先验证二维码的签名,再比对站点信息和公钥是不是在本地已经存在,存在直接到第4步,不存在就走第一次绑定流程(对开发注册站点叫注册),记录下站点信息+站点公钥,并生成一对客户端公私钥保存
  4. 使用客户端私钥对二维码中的随机数据签名得到sign+时间戳+再加上app的公钥+用户信息(昵称头像等)=data,再使用网站公钥对data进行加密,将加密后的数据附带在第一步的授权回调url中,访问url。
  5. 网站收到第4步的数据后,先使用自己的私钥解密数据,再看客户端的公钥能不能验证客户端发过来的签名,再校验这个data是一段时间内没登录过的,验证通过后再看这个公钥是不是已在数据库中存在,不存在说明是首次登录,已存在是二次登录,验证通过后网站给使用相同随机数data的网页客户端发送登录成功cookie

总结

本身功能不复杂,主要用了一个非对称的私钥签名公钥验证,和非对称的公钥加密私钥解密。
在设计中,对以下攻击进行了防御:

  • 网站钓鱼,二维码中的回调url使用了站点私钥签名,防止篡改回调url
  • 重放攻击,第5步中校验了的随机数据是第一步生成的,是短时间唯一的
  • 中间人攻击,可以防止app与服务器自己的中间人攻击,但浏览器与服务器之间通讯还是需要走https

如果您想使用请留言,如果您觉得哪里有安全漏洞更请留言

你可能感兴趣的:(技术)