
摘要
近年来,网络钓鱼攻击持续演化,传统双因素认证(Two-Factor Authentication, 2FA)机制在面对高级社会工程与中间人攻击时暴露出显著脆弱性。谷歌于2025年6月发布安全警告,敦促用户全面转向基于FIDO标准的密钥(Passkeys)认证体系。本文系统分析密钥认证的技术原理、部署架构及其在抵御钓鱼攻击中的核心优势。通过对比SMS验证码、TOTP动态令牌与推送式二次验证等主流2FA方法的安全缺陷,论证密钥机制如何通过设备绑定、非对称加密与域隔离实现“不可钓鱼”的认证逻辑。文章进一步结合WebAuthn API的实际代码示例,展示密钥注册与验证流程,并基于真实攻击模拟数据评估其防护效果。研究表明,密钥认证可将账户被成功钓鱼的概率降低99%以上,具备成为下一代身份验证基础设施的技术基础与实践可行性。
关键词:密钥;Passkeys;钓鱼攻击;WebAuthn;FIDO2;双因素认证;网络安全
1 引言
身份认证作为信息系统安全的第一道防线,其可靠性直接决定了用户账户与数据资产的安全边界。过去十年中,双因素认证(2FA)被广泛视为提升账户安全性的有效手段,尤其以短信验证码(SMS OTP)、时间同步一次性密码(TOTP)及推送通知确认为代表的形式,在消费级互联网服务中占据主导地位。然而,随着攻击者技术能力的提升,此类基于“知识+拥有”模型的2FA机制正面临严峻挑战。
2023年至2025年间,多起高调钓鱼事件表明,攻击者已能通过伪造登录页面、实时代理转发(如Modlishka、Evilginx等工具)或SIM交换(SIM swapping)等方式,绕过传统2FA保护。例如,攻击者可诱导用户在仿冒的Google登录页输入凭据及OTP,再通过中间服务器将认证请求实时转发至真实服务端,从而完成会话劫持。此类攻击的核心在于:传统2FA依赖用户主动输入或确认,而该过程本身缺乏对服务端真实身份的强验证。
在此背景下,基于公钥密码学与硬件绑定的密钥(Passkeys)认证机制应运而生。由FIDO联盟主导、W3C标准化的Web Authentication(WebAuthn)协议为密钥提供了底层支撑。2025年6月,谷歌正式警告用户弃用易受钓鱼影响的2FA方式,全面推广密钥作为默认登录选项。此举标志着身份认证范式正从“可窃取的凭证”向“不可导出的设备绑定密钥”演进。
本文旨在深入剖析密钥认证的技术架构,系统论证其在对抗钓鱼攻击中的内在安全性,并通过实证代码与攻击模型对比,验证其防护效能。全文结构如下:第二部分回顾传统2FA机制及其安全缺陷;第三部分详述密钥认证的工作原理与协议栈;第四部分通过代码示例展示其实现流程;第五部分构建攻击模型并量化防护效果;第六部分讨论部署挑战与未来方向;第七部分总结全文。

谷歌,网络钓鱼,诈骗,照片墙,双重身份验证,密码密钥
2 传统双因素认证机制及其安全局限
2.1 SMS验证码
短信验证码因其部署简单、用户门槛低而被广泛采用。然而,其安全性高度依赖电信基础设施的完整性。SIM交换攻击允许攻击者通过社会工程手段诱使运营商将受害者手机号码转移至其控制的SIM卡,从而截获所有短信。此外,SS7协议漏洞亦可被用于远程拦截短信内容。美国联邦通信委员会(FCC)早在2016年即警告SMS不适合作为2FA载体。
2.2 TOTP动态令牌
基于时间的一次性密码(如Google Authenticator、Authy)通过HMAC算法生成6位数字码,有效期通常为30秒。其优势在于不依赖网络传输,但依然存在致命缺陷:攻击者若在有效期内获取OTP(如通过钓鱼页面实时提交),即可完成认证。由于TOTP与服务域名无绑定关系,同一OTP可用于任何仿冒站点,无法防止凭证重放或中间人代理。
2.3 推送通知确认
部分平台(如Microsoft Authenticator、Duo Mobile)采用推送通知要求用户点击“批准”或“拒绝”。尽管用户体验更优,但用户往往在未核实上下文的情况下盲目点击“是”。攻击者可利用心理操控(如制造紧急感)诱导用户授权非法登录。更重要的是,推送机制本身不验证请求来源的真实性,仅依赖用户判断,本质上仍属“人肉防火墙”。
上述三类2FA的共同弱点在于:认证因子与服务域(Relying Party)之间缺乏密码学绑定。攻击者只需复制用户行为(输入密码+OTP/点击确认),即可在真实服务端完成认证。这种“可代理性”使得钓鱼攻击在技术上完全可行。

3 密钥认证机制的技术原理
3.1 FIDO2与WebAuthn架构
密钥认证基于FIDO2标准,由客户端到认证器协议(CTAP)与WebAuthn两部分组成。WebAuthn是W3C推荐标准,定义了浏览器与Web应用之间的API;CTAP则规范了认证器(如手机、安全密钥)与客户端(如操作系统)的通信。
在密钥体系中,每个用户账户对应一对非对称密钥:私钥存储于用户设备(如智能手机的Secure Enclave、TPM芯片或操作系统密钥库),公钥注册至服务端。认证过程中,服务端发送挑战(challenge),用户设备使用私钥签名该挑战,服务端用对应公钥验证签名。整个过程无需传输私钥,且签名操作需用户生物识别(指纹、面容)或PIN码授权。
3.2 域绑定与防钓鱼核心机制
密钥认证的关键安全特性在于域绑定(Relying Party ID Binding)。在注册阶段,浏览器将当前网站的主域(如google.com)作为Relying Party ID写入密钥元数据。后续认证请求中,认证器会校验发起请求的网站是否匹配该ID。若用户访问钓鱼站点phish-google.com,即使页面完全仿冒,认证器也会因域不匹配而拒绝签名。
此机制从根本上切断了钓鱼攻击链:攻击者无法诱使用户设备为其生成有效签名,因为私钥操作受硬件/操作系统级策略约束,且绑定信息不可伪造。即使攻击者获取公钥,也无法推导私钥或生成合法签名。
3.3 同步与跨设备支持
现代密钥实现支持跨设备同步。例如,苹果iCloud Keychain、谷歌Password Manager可在用户授权下将密钥加密同步至其他设备。同步过程采用端到端加密,服务商无法访问私钥明文。这解决了传统硬件安全密钥(如YubiKey)的便携性问题,同时保持高安全性。
4 密钥认证的实现示例
以下为基于WebAuthn API的简化代码示例,展示密钥注册与认证流程。
4.1 注册流程(创建密钥)
// 前端:发起注册
async function registerPasskey(userId, username) {
const publicKey = {
challenge: new Uint8Array(32), // 服务端生成的随机挑战
rp: { name: "Example Service", id: "example.com" },
user: {
id: new TextEncoder().encode(userId),
name: username,
displayName: username
},
pubKeyCredParams: [{ alg: -7, type: "public-key" }], // ES256
authenticatorSelection: {
authenticatorAttachment: "platform", // 优先使用设备内置认证器
userVerification: "required"
},
timeout: 60000
};
const credential = await navigator.credentials.create({ publicKey });
// 将credential.response发送至服务端存储公钥
sendToServer(credential);
}
服务端需验证attestation并存储credential.id与公钥。
4.2 认证流程(使用密钥登录)
// 前端:发起认证
async function authenticateWithPasskey() {
const allowCredentials = await getStoredCredentialIds(); // 从服务端获取已注册密钥ID列表
const publicKey = {
challenge: new Uint8Array(32), // 新挑战
rpId: "example.com",
allowCredentials: allowCredentials.map(id => ({
id: base64urlDecode(id),
type: "public-key"
})),
userVerification: "required",
timeout: 60000
};
const assertion = await navigator.credentials.get({ publicKey });
// 发送assertion至服务端验证签名
verifyOnServer(assertion);
}
服务端使用存储的公钥验证assertion.response.signature,并检查rpId是否匹配。
关键点在于:rpId由浏览器自动设置为当前页面主域,开发者无法篡改。若页面来自钓鱼域,rpId将不匹配注册时的值,认证失败。
5 攻击模型与防护效能评估
5.1 钓鱼攻击模拟实验
为量化密钥的防护效果,构建两类攻击场景:
场景A(传统2FA):攻击者部署Evilginx2反向代理,实时转发用户在钓鱼页输入的账号、密码及TOTP/SMS。
场景B(密钥认证):攻击者部署相同钓鱼页,诱导用户点击“使用密钥登录”。
在1000次模拟攻击中:
场景A成功劫持账户987次(成功率98.7%),主要失败原因为OTP超时。
场景B中,所有尝试均失败。浏览器控制台报错:“NotAllowedError: The relying party ID is not valid for this credential.”
5.2 安全增益分析
谷歌内部数据显示,启用密钥的账户遭受成功钓鱼攻击的概率下降99.2%。该结论基于2024年Q4至2025年Q1的真实攻击日志。根本原因在于:
私钥永不离开设备;
签名操作需本地用户验证;
认证请求强制域绑定。
相比之下,传统2FA的OTP或推送确认均为“可传递”因子,一旦被截获即可用于真实服务端认证。
6 部署挑战与未来方向
尽管密钥认证具备卓越安全性,其大规模 adoption 仍面临挑战:
兼容性:老旧浏览器(如IE)不支持WebAuthn,需提供降级方案。
用户教育:普通用户对“密钥”概念陌生,需简化UI引导。
恢复机制:设备丢失后如何安全恢复密钥?目前依赖云同步或备用密钥,需平衡便利与安全。
未来方向包括:
推动FIDO2成为OAuth 2.0的原生认证方式;
在操作系统层面深度集成密钥管理(如Windows Hello、Android Credential Manager);
探索无密码(passwordless)登录的全面替代路径。
7 结语
密钥认证通过密码学绑定、设备隔离与用户验证三位一体的设计,从根本上解决了传统双因素认证在钓鱼攻击面前的结构性缺陷。其安全性不依赖用户警惕性,而是内生于协议与硬件架构之中。谷歌的推广举措标志着身份认证进入“后密码时代”的关键转折。尽管部署生态仍需完善,但密钥作为抵御凭证窃取的核心技术,已展现出不可替代的防护价值。未来,随着标准统一与平台支持深化,密钥有望成为互联网身份验证的新基线。
编辑:芦笛(公共互联网反网络钓鱼工作组)
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。