2019年双因素认证最佳实践指南

news/2025/9/18 17:25:36/文章来源:https://www.cnblogs.com/qife122/p/19099235

2019年正确实现双因素认证 - Trail of Bits博客

自3月起,Trail of Bits一直与Python软件基金会合作,为Warehouse(PyPI的代码库)添加双因素认证(2FA)。截至目前,PyPI成员可以启用基于时间的OTP(TOTP)和WebAuthn(目前处于测试阶段)。如果您在PyPI上拥有账户,请在继续阅读之前启用您偏好的2FA方法!

2018年和2019年是双因素认证的重要年份:

  • W3C和FIDO于3月最终确定了Level 1 WebAuthn规范。Chrome和Firefox已经对其提供了成熟支持,Safiri预计也会跟进。
  • 即将发布的Android版本将允许用户将手机用作安全密钥,iOS预计也会这样做。
  • CTAP2标准的进展持续进行。虽然WebAuthn不需要CTAP2,但未来的WebAuthn设备将受益于其传输和认证器配置改进。
  • 主要网站已开始不鼓励使用SMS和语音代码,这些作为第二因素已经完全失效。Google现在允许G-Suite管理员强制执行无SMS的2FA,防止用户为其2FA方法添加薄弱环节。

总而言之,现在是为您的服务添加2FA的最佳时机。继续阅读以了解如何正确实施。

什么是2FA,什么不是

在讨论实施双因素认证的正确决策之前,理解第二因素应该是什么和不应该是什么至关重要。

特别是:

  • 第二因素方法不应该是可知的。第二因素方法是用户拥有或是什么,而不是用户知道什么。
  • 第二因素方法不应替代用户的第一因素(通常是密码)。因为它们是用户拥有或是什么,所以它们是身份证明。WebAuthn是此规则的部分例外:由于其更强的保证,它可以作为单一因素。
  • 第二因素方法可按安全性排序。特别是,WebAuthn总是优于TOTP,因此应首先提示已启用两者的用户使用WebAuthn。不要让用户默认使用安全性较低的第二因素。如果出于遗留原因支持SMS作为第二因素,请告知用户一旦添加了更好的方法就可以移除它。
  • 2FA实现不应在第一因素之前请求用户的第二因素。这对于TOTP来说无论如何都不可行,但您可能会尝试使用WebAuthn凭据的ID或公钥。这本身不会引入安全风险,但不一致的排序只会混淆已经难以理解安全密钥在认证中作用的用户。
  • 恢复代码应可用,并且应为选择退出的用户提供足够警告,这些用户更喜欢其账户在失败时完全不可用。恢复代码不是第二因素——它们绕过了2FA方案。然而,用户不理解2FA(见下文),如果没有直接的恢复方法,他们会因挫败感而禁用它。当安全存储时,恢复代码代表了可用性和2FA方案健全性之间的可接受折衷。

您的用户不理解2FA,并会尝试破坏它

用户,即使是技术极客(如普通的PyPI包维护者),也不理解2FA或其约束。他们会在不同程度上:

尝试行为 风险 补救措施
截屏TOTP二维码并留在下载文件夹中 TOTP密钥暴露 文档:警告用户不要保存二维码
使用相同二维码配置多个TOTP应用 对第二因素是什么/在哪里理解不足 文档:告知用户仅配置一个设备
使用允许以未加密文本导出代码的TOTP应用 TOTP密钥暴露;不安全的密钥管理 文档:建议使用不支持未加密导出的TOTP应用
使用损坏的TOTP应用或不尊重TOTP参数的应用 不正确的TOTP代码生成;应用中混淆的TOTP标签 几乎没有:几乎所有TOTP应用都忽略或对配置施加额外约束。使用默认配置参数!
用错误应用扫描TOTP二维码 丢失第二因素;无法登录 要求在接受配置请求前输入TOTP代码
尝试手动输入配置URI或密钥并出错 丢失第二因素;无法登录 同上;需要TOTP代码完成配置
错误标记TOTP登录并混淆 错误标记的第二因素;无法登录 提供otpauth支持的所有用户名和发行者名字段。不鼓励用户使用仅支持服务白名单或需要手动标记的TOTP应用
在您的服务之前从应用中删除TOTP密钥 账户锁定 文档:警告用户不要这样做,并推荐提供类似警告的TOTP应用
将恢复代码保存到桌面文本文件 第二因素绕过 使恢复代码选择加入,并告知用户仅保存恢复代码的打印副本
混淆不同服务的恢复代码 丢失绕过;无法登录 在恢复代码前添加站点名称或其他区分标识符
完全忽略第二因素,仅使用恢复代码 非真正的2FA 跟踪恢复代码使用并警告重复违规者
尝试使用旧的RSA SecurID、奇怪的企业HOTP令牌或pre-U2F密钥 WebAuthn不支持 在配置失败时提供明确错误。大多数浏览器应对pre-U2F密钥执行此操作
混淆硬件密钥 错误标记的第二因素;无法登录 让用户能够在您的服务上以人性化名称标记其注册密钥,并鼓励他们物理标记
在未取消配置的情况下赠送或转售硬件密钥 第二因素泄露 文档:警告用户不要这样做。为了更积极的安全,定期要求他们断言其每个WebAuthn凭据

技术用户可能更糟:在撰写本文时,一位熟人讲述了使用Twilio和通知推送服务绕过其大学基于SMS的2FA的故事。

这些场景中的许多部分不可避免,并且并非所有场景都从根本上削弱或威胁削弱您的2FA设置的健全性。然而,您应该了解每一个场景,并尽可能寻求用户验证您的方案。

WebAuthn和TOTP是您唯一需要的

您不需要SMS或语音代码。如果您目前出于遗留原因支持SMS或语音代码,那么您应该:

  • 防止新用户启用它们,
  • 告知当前用户移除它们并切换到WebAuthn或TOTP,以及
  • 对仍启用SMS和/或语音代码的用户执行额外日志记录和警报。

偏执?是的。但如果您持有任何加密货币,您可能应该偏执。

过度?也许。SIM端口攻击仍然相对不常见(且有针对性),尽管几乎不需要技术技能。通过SMS或语音代码进行2FA仍然比什么都没有好。Google自己的研究表明,仅SMS就能防止几乎所有非针对性钓鱼攻击。针对性攻击的数字更黯淡:近四分之一的针对性攻击对仅基于SMS的2FA用户成功。

担心除了SMS之外的其他方法不实用和/或成本高?不必担心。有大量免费的TOTP应用适用于iOS和Android。在WebAuthn方面,Google将以50美元的价格向您出售包含两个安全密钥的套件。您甚至可以购买一个完全开源的密钥,该密钥可与WebAuthn配合使用,价格为25美元!最重要的是:TOTP不如硬件密钥好,这不是继续允许SMS或语音代码的借口。

对比TOTP和WebAuthn

TOTP和WebAuthn都是为您的服务添加2FA的可靠选择,如果有机会,您应该同时支持两者。以下是一些考虑因素:

TOTP是对称且简单的,WebAuthn是非对称且复杂的

TOTP是一种对称加密方案,意味着客户端和服务器共享一个密钥。这加上TOTP相对简单的代码生成过程,使其易于实现,但会导致一些陷阱:

  • 由于客户端需要存储对称密钥,TOTP的安全性仅与包含应用或设备一样安全。如果恶意程序可以提取用户的TOTP密钥,则它们可以在用户不知情的情况下生成任意数量的有效TOTP代码。
  • 由于TOTP中客户端和服务器之间共享的唯一状态是初始密钥和后续生成的代码,TOTP缺乏设备身份的概念。因此,信息错误的用户可以使用相同密钥配置多个设备,增加其攻击面。
  • TOTP不提供固有的重放保护。服务可能通过拒绝接受有效代码多次来防止重放,但这可能会困扰在TOTP窗口内多次登录的合法用户。
  • 可能可暴力破解。大多数服务使用6或8位TOTP代码,并提供扩展的验证窗口以适应行动不便的用户(和时钟漂移),使在线暴力破解刚刚处于可行性边缘。解决方案:限制登录尝试速率。

以上所有因素结合使TOTP代码成为理想的钓鱼目标。私人和国家团体都成功使用假登录表单和其他技术成功欺骗用户共享其TOTP代码。

相比之下,WebAuthn使用非对称公钥密码学:客户端在从服务器接收选项列表后生成密钥对,将公钥部分发送到服务器用于验证目的,并安全存储私钥部分用于认证期间的签名操作。这种设计导致 substantially更复杂的证明模型,但产生许多好处:

  • 设备身份:WebAuthn设备由其凭据ID标识,通常与人性化标签配对用于用户管理目的。WebAuthn的身份概念使得支持每个用户多个安全密钥变得容易——不要人为地将用户限制为每个账户单个WebAuthn密钥!
  • 反重放和反克隆保护:设备注册和断言方法包括认证方生成的随机挑战,行为良好的WebAuthn设备在每次断言后发送更新的签名计数器。
  • 来源和安全上下文保证:WebAuthn在设备注册和证明期间包括来源信息,并仅允许在安全上下文内进行交易,防止常见钓鱼向量。

TOTP是免费的,WebAuthn(目前大部分)不是

如上所述,有许多免费的TOTP应用,适用于用户将使用的几乎所有平台。几乎所有这些都支持Google的otpauth URI“标准”,尽管完整度/正确性程度不同。

相比之下,大多数WebAuthn的潜在用户需要购买安全密钥。各种硬件密钥标准之间的关系令人困惑(并且可能占据整个单独的博客文章),但大多数U2F密钥应该是WebAuthn兼容的。然而,WebAuthn不仅限于安全密钥:如前所述,Google正在努力使其移动设备充当WebAuthn兼容的第二因素,我们希望Apple也在做同样的事情。一旦发生这种情况,许多用户将能够在没有额外购买的情况下切换到WebAuthn。

使用正确的工具

TOTP的简单性使其成为重新实现的有吸引力的目标。不要这样做——它仍然是一个密码系统,您永远不应自己编写密码。相反,使用成熟且抗误用的实现,如PyCA的hazmat.primitives.twofactor。

WebAuthn仍然相对较新,因此没有那么多服务器端实现可用。Duo的优秀人员正在努力补救这一点:他们已经开源了Go和Python库,并为用户和实现者提供了一些优秀的在线演示和文档。

从我们的工作中学习

想为您的服务添加2FA,但不知道从哪里开始?查看我们在Warehouse代码库中的TOTP和WebAuthn实现。

我们的公共接口有详细文档,并且(按照Warehouse标准)所有分支都经过测试覆盖。支持多个WebAuthn密钥,并且将在不久的将来添加对可选恢复代码的支持。

如果您有其他更定制的密码学需求,请联系我们寻求帮助。
更多精彩内容 请关注我的个人公众号 公众号(办公AI智能小助手)
公众号二维码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/907290.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

oracle 删除重复数据

delete hpas_index_data_source swhere s.id in (select idFROM (SELECT t1.*,ROW_NUMBER() OVER(PARTITION BY t1.indexid, t1.doctor_id, t1.start_date, t1.vals ORDER BY t1.rowid) as rnFROM hpas_index_data_sou…

Account Kit(华为账号服务)再进化,开发者接入效率飙升!

Hi 各位开发者朋友~👋 为持续优化开发体验,提升集成效率,Account Kit接入体验再升级,助力构建更流畅、更安全的登录体验,让开发效率火力全开!😎 【体验升级】华为账号相关权益申请入口统一迁移至AGC华为账号…

Codeforces Round 1051 (Div. 2) D题启发(DP

题目简述 需要找到所有最长单调递减子序列长度不超过2的子列个数,做法是dp。 状态记录 我们不必理会题解中乱七八糟的定义,只需要知道他事实上就是模拟了当我们拿到一个已知数列时贪心的过程,把我们计算最长单调递减…

[踩坑劝退]批量生成 grafana dashboard 的技术

[踩坑劝退]批量生成 grafana dashboard 的技术作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢!cnblogs博客 zhihu Github 公众号:一本正经的瞎扯最近想要一个功能:把 VictoriaMetrics 采集的数据,自动变…

Ubuntu 22 下 DolphinScheduler 3.x 伪集群部署实录

本文记录了在 Ubuntu 22.04 上部署 Apache DolphinScheduler(伪集群模式)的完整过程,涵盖环境准备、安装配置、数据库初始化、用户创建及服务启动等步骤。适合个人学习、功能验证或测试使用。本文记录了在 Ubuntu 2…

关于proxmox 制作虚拟机模板的动态dhcp问题

背景 proxmox 制作ubuntu24.04 的模板,虽然已经设置了dhcp,启动了ip还是会附带之前的信息。为了解决这个问题。 如果要保证 Ubuntu 云镜像克隆后每台机器都自动生成唯一的 machine-id 和 DHCP 客户端 ID(避免 IP 冲…

Oracle清理:如何安全删除trace, alert和archivelog文件?

Oracle清理:如何安全删除trace, alert和archivelog文件?Oracle 数据库运行时文件清理指南 背景:公司阿里云数据库主机,由于长期运行空间告急,通知各项目组多次要求转移数据库空间文件进展缓慢,为保证空间占满影响…

软件工程个人项目

软件工程个人项目3123004548软件工程个人项目这个作业属于哪个课程 <https://edu.cnblogs.com/campus/gdgy/SoftwareEngineering2024>这个作业要求在哪里 https://edu.cnblogs.com/campus/gdgy/Class34Grade23Co…

学习道路道阻且长 希望自己坚持下去

本人是一名专升本的大三学生 现在专业是软件工程专业 从今天开始学习java 翻了一下资料 发现很多人建议从前端开始学习 在专科学习中 也学过相应的基础知识,不过遗忘程度可能有点严重。对于语言的基本语法掌握需要加强…

2025/9/18 总结

A 用时:2h 预期:100pts 实际:100pts 求出前缀和,\(s_k+s_i \text{xor} s_k\),考虑从高到低贪心,如果 \(s_i\) 的 \(j\) 位为 \(1\),不管如何贡献都有 \(2^j\),如果 \(s_i\) 的第 \(j\) 位为 \(0\),则 \(s_k\)…

P2216 [HAOI2007] 理想的正方形

P2216 [HAOI2007] 理想的正方形#include <bits/stdc++.h> using namespace std;const int maxn = 1e3 + 10; int a,b,n; int c[maxn][maxn]; deque <int> dq1,dq2; int max1[maxn][maxn],min1[maxn][maxn]…

PuTTY下载和安装

下载地址: https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html更改安装路径创建桌面快捷方式

数据通路-单总线结构(最头晕的一集)

数据通路就是数据在各个部件之间传输的路径(包括路径上的部件) 控制信号是有控制部件产生的 数据通路的结构 1cpu内部单总线方式 2cpu内部多总线方式 3专用数据通路方式 内部总线 是指同一个部件,如cpu内部链接各寄…

python基础篇-集合

集合 :集合内的数据不重复,但是数据是无序的创建集合 {} 或者set()注: 创建空集合只能用set(), 因为{}已经被字典占用了eg: s1 = {10, 20 ,40,30 }eg: s2 = set(abcdefg) :用set创建,序列会被拆开 = 》 {’a, b…

#egsg:在同一程序中比较-计算圆的面积

以下是一个同时使用easygui和pysimplegui实现的圆形面积计算程序,通过菜单让用户选择使用哪种GUI库: import math import easygui import PySimpleGUI as sgdef easygui_calculator():"""使用easygui…

282 项多模态胃肠病学数据集:适配 VLM 与 MLLM 微调,融合医学图像与临床文本的医疗 AI 训练数据

​ 获取更多高质量数据集,请访问典枢数据交易平台:https://dianshudata.com一、引言与背景 在医疗人工智能领域,胃肠病学的智能化诊断与分析始终依赖高质量数据的支撑,而视觉语言模型(VLM)与多模态大型语言模型(…

2-sat板子

vector<int>e[maxn]; int n,m; int inscc[maxn]; int low[maxn],dfn[maxn]; stack<int>stk; int instk[maxn]; int tot,cnt; vector<int>scc[maxn];void dfs(int u,int fa){low[u]=dfn[u]=++tot;stk…

Node.js 中使用 .env 文件管理环境变量

Node.js 中使用 .env 文件管理环境变量Node.js 中使用 .env 文件管理环境变量xiaochong0302鸠摩智首席音效师​关注他1 人赞同了该文章 Using .env File in Node.jsNode.js 应用程序通常依赖于环境变量来管理敏感信息或…

centos 7中安装jenkins

1.安装java11 [root@localhost ~]# yum install -y java-11-openjdk-devel [root@localhost ~]# java --version openjdk 11.0.23 2024-04-16 LTS OpenJDK Runtime Environment (Red_Hat-11.0.23.0.9-2.el7_9) (build …

pythonjs逆向 破解滑动验证码 - hello-*

现在的滑动验证码防盗等级都比较高,之前的是一张完整的图片带缺口,现在返回的图片是打乱顺序拼接而成的,所以现在破解不仅要识别滑块的缺口,同时还需要复原完整的图片一.伪造请求获取验证码图片可以看到请求中主要…