二次验证和验证器APP
二次验证 (2FA) Two-Factor Authentication 是指:在用户名/密码之外,增加一个一次性密码的验证方式。表现形式有很多种,一般有:U盾、手机短信验证码、电话语音验证码、APP或系统弹窗、软件实现(验证器APP)。 二次验证要解决的问题是:用户名/密码是相对固定不变的,如果被窃取(偷看/内存破解/键盘记录/拦截数据传输解密),其它人可以冒充身份。二次验证加入了一个一次性密码以后,这个密码使用一次后即失效,即使使用过程中被窃取也不能被拿来再次通过身份验证。 从这样的原理来看,针对二次验证一次性密码的攻击就是要在生成密码到使用密码之间窃取密码,并抢在用户使用之前用于身份验证。所以现在的各种骗术都是要拿到短信验证码(有的是通过手机木马的方式,有的是通过骗取信任的方式) 分析一下安全性: 1. iOS手机不越狱、安卓手机不解锁的话,短信验证码还是可靠的。这也是目前手机银行APP采用的方案。 2. 如果出境,手机号的方案就不方便了。还是要靠验证器APP。 验证器APP的原理是: 1.生成一个密钥,服务器和用户都知道这个密钥。密钥保管好后,以后不再传输; 2.用密钥+当前时间用一个单向算法生成动态密码。 3.服务器通过动态密码间接验证用户是否持有正确的密钥,进而验证身份。 实际应用中密钥需要保证一定的长度,如:BPPC7YHP2KD2BZFGPGMLZBBOUOO4627H,时间同步按30秒刷新一次,算法使用的是HMAC-SHA1,最终的动态密码是6位数字。 第1步中,密钥可以生成得足够复杂,间接解决了用户喜欢使用弱密码的问题。这一步需要在安全的环境中进行,保证密钥不被泄漏。 整个方案叫做TOTP(Time-based One-time Password 基于时间的一次性密码)。算法本身是公开的( https://tools.ietf.org/html/rfc6238 ),所以有很多APP可选,比如:Google Authenticator、Authy、Microsoft Authenticator、Tofu等。不同的APP在细节上有一些不同,比如密钥的备份、同步等。 为了方便第1步的实践,一般网站会让你用APP扫一个二维码,它的内容实际是像这样子的: otpauth://totp/Cloudflare: bob ?...