Two-Factor-Auth系统思路

0x00 初衷

帐号越来越多,越来越杂,个人信息泄漏问题越来越严重,如何设置一个好记而又强大的密码是一个难题。

0x01 现状

很多人各个地方的密码都是一样的,这样风险很大,密码被泄露一次就能导致所有网站失守。况且,不同的网站信任等级不同,例如阿里被攻击导致密码泄漏可能性很小,而某个野鸡论坛可能就是一个钓鱼论坛,主要是骗取你的密码。设想这样一个场景,你的苹果设备被盗,对方无法解开你的Apple ID,设备被卖到黑产团队,黑产团队引诱你注册一个论坛,而你的密码是一样的,设备就丢失了。

另外,有人提倡用古诗做密码,一个帐号还好,那么多网站,那么多账号,哪记得那么多诗?还有诗句中诡异的变化?用ppnn13%dkstFeb.1st来表示娉娉袅袅十三余,豆蔻梢头二月初,用ppnn13%dkstFeb.1st当密码?虽然很难用彩虹表来跑这样的密码,但是很多网站对特殊字符有要求,到时候你就哭去吧。而且,也不能解决引诱注册的问题。

还有人使用一个规律来生成密码,不同的网站有一部分不同,这种方法稍微好一些,但是各种网站对长度和特殊字符要求不一,有的要求特殊字符和大小写,有的要求大小写和数字,有的不能用特殊字符,有的有长度要求。生成的密码如果不符合网站的规则,只能懵逼。

现在比较好的纪录密码的方式是利用第三方软件,例如1password,这是一个推荐的解决方法。但是也有一些小问题,它是收费的(当然,为软件付费是应该的),另外,最近cloudflare内存泄漏导致1password受到影响,可能泄漏用户密码。而且有的时候使用的不是自己的常用设备,没有1password,也不是很方便。

0x02 Two-Factor-Auth System 设计

我们需要一个这样的系统:

  • 满足密码添加,修改,删除功能
  • Web,方便跨设备,无需安装客户端
  • 无需HTTPS,攻破服务器和中间人攻击都无法获取密码
  • 支持二次认证
  • 安全,严格控制权限

为了达成以上目标,有几个原则

  • 安全第一,不使用任何框架。
  • 所有功能必须登陆后才能访问。
  • 不使用数据库(没必要,同时减少攻击面)
  • 严防XSS攻击

0x03 系统设计要点

密码在浏览器使用js随机生成后,由用户输入密码,在浏览器由js进行AES加密,将密文保存到服务器。查看密码时,如果此条密码需要二次认证,则使用短信二次认证,然后查看到密文,用户输入解密密码,js解密出来即可。

0x04 细节

所有操作均需登录。

每条账号信息都包含密码,网站,账号,是否需要二次认证等信息

插入账号信息也要输入这些信息。

删除和修改一条需要二次认证的账号信息需要二次认证。

用户需要对一条账号进行操作时,session记录这条账号的id以及操作。如果需要二次认证,验证码保存在session信息中。所有操作都有一个校验过程,如果此操作需要二次认证且验证码与用户输入相同,允许操作。否则拒绝。操作完之后,立即销毁session中的操作和ID,验证码信息。

展示密码明文后5秒后将明文和用户输入的解密密码置为空,防止被记住。60秒内无操作自动退出。