相关词
- MFA 多因素认证
- RSA 加密
- Google Authenticator
- TOTP 算法
- 雪花算法
- NTP 时间校对
前言
相信各位都碰到过这样的场景:在银行 App 登录或转账时,需要验证指纹或一次性短信;在 Google、GitHub 等网站登录时,除了密码外还需输入动态验证码。这些操作统称为多因素认证(MFA),旨在通过多重验证提升安全性。
这些看起来多余的操作,都是因为时代的眼泪以及种种原因导致的:
- 人类记忆的局限性:75%的人会重复使用密码,60%的密码能被 AI 在 1 秒内破解(数据来源:2024 年 IBM 安全报告)
- 数据信息的泄漏:光是 2024 年“RockYou2024”密码泄露事件,就暴露了全球 99 亿条明文密码,相当于平均每位网民泄露约 1.3 条密码记录
由于数据泄露事件频发,NIST(美国国家标准与技术研究院)等机构推动了 MFA 成为行业标准。
三个维度因素
如今,几乎大部分商家都采用了类似 MFA 概念的安全实践,现代 MFA 系统通常构建于三个相互独立的安全维度之上,下面简单列举一些常见的维度因素
认知维度
认证方式 | 安全性 | 用户体验 | 成本 | 技术说明 |
---|---|---|---|---|
普通密码 | ★☆☆☆☆ | ★★★★★ | ★☆☆☆☆ | 安全学中的老年人 |
12 字符复杂密码 | ★★☆☆☆ | ★★☆☆☆ | ★☆☆☆☆ | Ab.cd0109x1- |
图形解锁图案 | ★★★☆☆ | ★★★★☆ | ★☆☆☆☆ | 3×3 点阵共 389,112 种组合,易被旁观者窃取 |
安全问题 | ★☆☆☆☆ | ★★★☆☆ | ★★☆☆☆ | 重复性其实很高,容易忘记 |
物理维度
认证方式 | 安全性 | 用户体验 | 成本 | 技术说明 |
---|---|---|---|---|
Google Authenticator | ★★★★☆ | ★★★★☆ | ★☆☆☆☆ | TOTP 算法,离线工作 |
扫码 | ★★★★☆ | ★★★☆☆ | ★☆☆☆☆ | 除了需要下载对应 app 外,目前应该是最常用的方案 |
邮件验证码 | ★★☆☆☆ | ★★★☆☆ | ★★☆☆☆ | 依赖邮箱安全性,易受钓鱼攻击 |
短信验证码(SMS) | ★★★☆☆ | ★★★☆☆ | ★★☆☆☆ | 依赖运营商网络,易受 SIM 交换攻击(NIST 已建议淘汰) |
生物维度
认证方式 | 安全性 | 用户体验 | 成本 | 技术说明 |
---|---|---|---|---|
声纹识别 | ★★★☆☆ | ★★★☆☆ | ★★☆☆☆ | 分析语音参数,环境噪音影响精度 |
超声波指纹识别 | ★★★★☆ | ★★★★★ | ★★★☆☆ | 指纹 |
面部识别 | ★★★★☆ | ★★★★☆ | ★★★★☆ | iPhone Face ID 使用 30,000 个红外点,FAR<1/1,000,000 |
虹膜扫描 | ★★★★★ | ★★★☆☆ | ★★★★☆ | 266 个特征点识别,需主动配合 |
手掌识别 | ★★★★★ | ★★★☆☆ | ★★★★☆ | 日立 VeinID 技术,活体检测 |
在国内,使用最多的物理因素就是验证码了,不过由于商家对隐私的不注重以及喜欢二次利用的特性,笔者不是很喜欢那种必须验证手机号的应用
Google Authenticator
这是一款谷歌旗下常用于海外网站和海外应用敏感操作验证的工具,目前已成为海外最常用的物理验证因素之一,核心特点包括:
可离线使用
通过 RFC 6238 标准的TOTP 算法以及预共享密钥与本地时间生成动态验证码,无需网络连接
数据安全
密钥仅存储于用户设备的本地和密钥派发方,两者会在每个步长时间内(通常 30s)计算得出新密钥,进行对比从而验证身份
操作简单
通过扫描服务端生成的二维码密钥完成账户关联,一次关联,无有效期限制,理论一个码可终身使用
开源且支持跨平台
覆盖多端,且与所有符合 RFC 6238 的服务兼容,如 AWS、GitHub、Coinbase 等(需用户自行搭建)
尽管 Google Authenticator 具有显著优势,但仍存在以下问题
- 国内用户需通过非官方渠道(如 APK 或第三方商店)下载 Google Authenticator,存在一定不便
- 部分浏览器扩展版本(如第三方 Web 插件)界面较简陋,且手机端配置环境较复杂
- 在网络不稳定时,App 可能因同步延迟偶尔显示加载动画,影响用户体验
- 必须登录 Google 账号才能启动云同步功能,不支持其他导出密钥的方式
为了避免被上面问题困扰,笔者开发了一个简化版本的 Web Authenticator 应用 提供给各位使用以及测试
Web 版验证器
Web 版具备以下功能:
- NTP 时间补偿:统一使用 Google 的 ntp 服务对计时做时间校对
- 多种识别方式:支持手动输入密钥、扫码识别密钥、上传图片识别密钥等多种方式
- 离线使用:利用 PWA 特性,除首次需网络外,后续使用不需联网,支持无网访问,但可能在 IE 等老版浏览器下出现异常
- 数据安全:密钥存于用户本地浏览器 IDB,数据传输采用 TLS 协议,结合 RSA 或其他非对称加密算法确保安全。Web 版遵循基本隐私保护原则,数据不上传至服务器
- 布局优化:使用更现代更易读的 UI 布局以及操作,拖拽特性优化,可多方向拖拽,页面简介
- 完全开源:项目放置于GitHub 且开源,代码极简,易上手
- 一键部署:支持 docker 一键部署,已测试 wind 和 Mac 运行正常
总结
TOTP 验证兼顾隐私性、安全性和易用性,是笔者认为比较理想的物理认证方式。Web 版验证器通过开源、离线支持和现代 UI,降低了使用门槛,已测试支持 GitHub、AWS 等平台的 TOTP 验证,同时应用层面代码对于开发人员来说难度也不高,非常适合学习。
最后,补充下链接防止失效
Github:https://github.com/sansan-mei/2fa-next
线上地址:mh33.top/2fa
PS:本篇文章相关项目代码仅供学习使用
本文由mdnice多平台发布
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。