2FA,2 Factor Authentication,双因子验证,是一种安全密码验证方式。区别于传统的密码验证,由于传统的密码验证是由一组静态信息组成,如:字符、图像、手势等,很容易被获取,相对不安全。2FA是基于时间、历史长度、实物(信用卡、SMS手机、令牌、指纹)等自然变量结合一定的加密算法组合出一组动态密码,一般每60秒刷新一次。不容易被获取和破解,相对安全。 所谓认证(authentication)就是确认用户的身份,是网站登录必不可少的步骤。
密码是最常见的认证方法,但是不安全,容易泄露和冒充。
越来越多的地方,要求启用双因素认证(Two-factor authentication,简称 2FA)。本文介绍它的概念和实现方法。
双因素认证的概念
一般来说,三种不同类型的证据,可以证明一个人的身份。
- 秘密信息:只有该用户知道、其他人不知道的某种信息,比如密码。
- 个人物品:该用户的私人物品,比如身份证、钥匙。
- 生理特征:该用户的遗传特征,比如指纹、相貌、虹膜等等。
这些证据就称为三种”因素”(factor)。因素越多,证明力就越强,身份就越可靠。
双因素认证就是指,通过认证同时需要两个因素的证据。
银行卡就是最常见的双因素认证。用户必须同时提供银行卡和密码,才能取到现金。
双因素认证方案
常用的双因素组合是密码 + 某种个人物品,比如网上银行的 U 盾。用户插上 U 盾,再输入密码,才能登录网上银行。
但是,用户不可能随时携带 U 盾,手机才是最好的替代品。密码 + 手机就成了最佳的双因素认证方案。
很多网站要求,用户输入密码时,还要提供短消息发送的验证码,以证明用户确实拥有该手机。
但是,短消息是不安全的,容易被拦截和伪造,SIM 卡也可以克隆。已经有案例,先伪造身份证,再申请一模一样的手机号码,把钱转走。
因此,安全的双因素认证不是密码 + 短消息,而是下面要介绍的 TOTP。