1. 认证基础:什么是身份认证?认证三要素及常见协议概览

大家好,我是老周。做安全这行十几年了,每次给新团队做培训,我总会从这个问题开始——身份认证到底是什么?

说白了,认证就是回答三个问题:你是谁?你怎么证明?我凭什么信你?

你想想看,每次登录系统、刷门禁、取快递,本质上都在做同一件事——向对方证明「我就是我」。这听起来简单,但我在项目中见过太多翻车案例了。有一次客户的核心业务系统被拖库,原因居然是管理员把 SSH 密钥当成了「用户名+密码」的替代品,根本没做二次校验。嗯,这里面的坑,我们慢慢聊。

1.1 认证三要素:你知道/你拥有/你是

业内公认的认证三要素,我习惯叫它「三把钥匙」:

要素 含义 典型例子 我踩过的坑
你知道 (Knowledge) 只有你本人知道的信息 密码、PIN码、密保答案 有人把密码设成「123456」,跟没设一样
你拥有 (Possession) 只有你本人持有的实物 手机验证码、硬件令牌、U盾 SIM卡被克隆,验证码就废了
你是 (Inherence) 你与生俱来的生物特征 指纹、人脸、虹膜、声纹 3D打印人脸膜能骗过部分2D摄像头

核心原则:单要素认证 = 单点失效。真正的安全认证,至少需要组合两种不同要素。这就是我们常说的双因素认证 (2FA)。

我个人习惯把三要素比作「密码、钥匙、指纹」。你想想看,光有密码(你知道),别人猜中了怎么办?光有钥匙(你拥有),被人偷了怎么办?光有指纹(你是),被复制了怎么办?只有两两组合,才能把攻击者的门槛拉高一个量级。

1.2 常见认证协议概览

聊完三要素,咱们看看实际工程里怎么落地。我按使用频率排个序,这些都是我在项目里真刀真枪用过的:

1.2.1 密码认证(最古老,也最脆弱)

HTTP Basic Auth、Digest Auth、表单登录。说白了就是「你告诉我密码,我比对哈希」。我在一次渗透测试中,发现某内部系统居然用明文存密码……嗯,那个月我写了三份整改报告。

1.2.2 基于令牌的认证(现代应用的主流)

  • OAuth 2.0:授权框架,不是认证协议。很多人搞混了。它让第三方应用「代你」访问资源,但不验证你是谁。
  • OpenID Connect (OIDC):在 OAuth 2.0 之上加了一层身份层。我最近做的零信任项目,全部用 OIDC 做身份代理。
  • SAML:企业级单点登录的老大哥。XML 格式,配置起来有点繁琐,但胜在成熟稳定。
  • JWT (JSON Web Token):轻量、自包含、无状态。前后端分离项目的标配。但要注意——JWT 一旦签发,在过期前无法撤销。我见过有人把 JWT 过期时间设成 7 天,结果泄露后被人用了整整一周。

1.2.3 证书认证(PKI体系)

HTTPS、客户端证书、SSH 密钥对。这是「你拥有」的典型代表。私钥一旦泄露,整个信任链就崩了。我建议:私钥必须硬件隔离,至少也要加密存储。

1.2.4 生物特征认证(正在普及)

指纹支付、人脸解锁、声纹登录。方便是真方便,但生物特征一旦泄露,你没法「改密码」。所以我在设计高安全系统时,生物特征只作为辅助因子,绝不单独使用。

我的经验:选协议时,先问三个问题——1. 你的用户是谁?(内部员工 vs 公众用户)2. 你的安全等级要求多高?(普通业务 vs 金融交易)3. 你的运维能力够不够?(自建 IdP vs 用第三方)。这三个问题能帮你筛掉 80% 的错误选择。

1.3 认证协议对比速查

协议 认证要素 适用场景 我见过的坑
HTTP Basic Auth 你知道(密码) 内部API、测试环境 明文传输,必须配HTTPS
OAuth 2.0 + OIDC 你知道/你拥有 Web/移动应用、第三方登录 授权码泄露、CSRF攻击
SAML 2.0 你知道/你拥有 企业SSO、跨域联邦 XML签名绕过、配置复杂
客户端证书 (mTLS) 你拥有 高安全API、设备认证 私钥管理不善、吊销不及时
WebAuthn (FIDO2) 你拥有 + 你是 无密码登录、防钓鱼 浏览器兼容性、硬件成本

1.4 一张图看懂认证体系

下面这张图是我自己画的,把认证三要素和常见协议串起来了。你看完应该能对整个体系有个全局印象:

身份认证体系全景图 你知道 Knowledge 你拥有 Possession 你是 Inherence 静态密码 / PIN码 密保问题 图形密码 手机验证码 (OTP) 硬件令牌 / U盾 SSH密钥 / 客户端证书 指纹识别 人脸识别 虹膜 / 声纹 常见认证协议 HTTP Basic / Digest OAuth 2.0 + OIDC SAML 2.0 WebAuthn / FIDO2 安全建议:至少组合两种不同要素(如密码 + 硬件令牌),避免单点失效

⚠️ 重要提醒:千万不要把「多因素认证」和「多步骤认证」搞混。多步骤认证(比如先输密码,再输验证码)只是把同一个要素拆成了两步,本质上还是单因素。真正的多因素,必须来自两个不同的要素类别。

1.5 避坑指南:我踩过的三个大坑

  1. 坑一:把 OAuth 2.0 当认证协议用
    我曾经有个项目,团队直接用 OAuth 2.0 的 access token 来识别用户身份。结果呢?token 里没有用户信息,后端只能靠 client_id 猜是谁。后来全部改成 OIDC,加了一层 id_token 才解决问题。
  2. 坑二:生物特征做主认证因子
    某客户的人脸支付系统,被一张高清照片+简单3D建模就绕过了。我当时的建议是:生物特征只做「便捷因子」,必须配合「你拥有」(比如手机设备)一起用。
  3. 坑三:JWT 不设过期时间
    嗯,这个我都不好意思说。某内部管理系统的 JWT 过期时间设成了 0(永不过期)。结果一个离职员工的 token 被用来登录了三个月才被发现。从那以后,我强制要求所有 JWT 必须有过期时间,最长不超过 24 小时。

1.6 小结

身份认证是整个安全体系的第一道门。三要素(你知道、你拥有、你是)是理论基础,常见协议是工程实现。我个人建议:选协议时,先想清楚你的威胁模型。别为了「方便」牺牲安全,也别为了「绝对安全」搞得用户没法用。

记住一句话:认证没有银弹,只有权衡。后面我们会深入每个协议的实现细节和攻击手法,到时候再细聊。