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

好,咱们开始第一讲。身份认证这东西,说白了就是回答一个问题:「你凭什么说你是你?」

我在刚入行做安全开发时,觉得认证不就是输个密码嘛,有啥好学的?直到第一次被安全审计报告打脸——系统被暴力破解、会话劫持、中间人攻击……嗯,从那以后我再也不敢小看这个环节了。

1.1 什么是身份认证

身份认证(Authentication),是系统确认用户、设备或服务声称的身份是否真实的过程。它不等于授权(Authorization),授权是「你能干什么」,认证是「你是谁」。

一句话记住:认证在前,授权在后。认证没通过,授权免谈。

举个例子:你拿着工卡进公司大门,保安核对照片——这是认证。保安看你工卡是「技术部」,放你进机房——这是授权。两个环节搞混了,安全就漏了。

1.2 认证三要素

所有认证手段,归根结底都基于以下三类信息。我习惯叫它「三把钥匙」:

要素 含义 典型例子 弱点
你知道什么 只有你本人知道的秘密 密码、PIN码、密保答案 容易被猜、被钓鱼、被泄露
你拥有什么 你持有的物理或数字凭证 手机验证码、U盾、智能卡、TOTP令牌 可能丢失、被复制、被劫持
你是什么 你独有的生物特征 指纹、人脸、虹膜、声纹 不可重置、有误识率、可被伪造

我的经验:单要素认证就像只用一把锁锁门。我在项目中见过只靠密码的系统,被撞库攻击一天破掉30%的账号。后来强制加了短信验证码(双因素),攻击量直接降到零头。

为什么强调「多因素」?因为三要素的弱点正好互补。密码可能被偷,但手机在你手上;手机可能丢,但指纹偷不走。两两组合,安全性是指数级上升的。

1.3 常见认证协议概览

理论说完了,咱们看看实际中怎么落地。认证协议就是「你和系统之间怎么约定认证流程」的一套规则。我挑几个最常用的讲讲:

1.3.1 基于密码的认证(PAP / HTTP Basic Auth)

最原始的方式。客户端把用户名+密码直接发给服务器。简单粗暴,但明文传输是硬伤。

// HTTP Basic Auth 的请求头长这样
Authorization: Basic base64(username:password)

注意:Base64 不是加密,是编码。抓包就能直接解码出密码。我在早期项目里见过有人直接用 Basic Auth 做生产环境认证……嗯,后来被安全团队约谈了。

1.3.2 挑战-响应认证(Challenge-Response)

为了解决明文传密码的问题,出现了挑战-响应模式。服务器先发一个随机数(挑战),客户端用密码+随机数算出一个哈希值(响应)发回去。密码本身不在网络上传输。

// 简化的挑战-响应流程
Server -> Client: 随机数 nonce
Client -> Server: hash(password + nonce)
Server: 用本地存储的密码哈希 + nonce 重新计算,比对

你想想看,就算攻击者截获了 nonce 和响应值,他也反推不出原始密码。这就是「一次一密」的思想。

1.3.3 基于令牌的认证(Token-Based)

现在最主流的做法。用户登录成功后,服务器签发一个令牌(Token),客户端后续请求带上这个令牌即可。典型代表是 JWT(JSON Web Token)。

// JWT 的结构:header.payload.signature
// 例如:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.
eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIn0.
SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

避坑指南:我曾经接手过一个项目,JWT 的 secret key 直接硬编码在代码里,而且用的是 'secret123'。这种令牌跟没签一样,谁都能伪造。记住:JWT 的安全完全取决于签名密钥的强度和保护。

1.3.4 单点登录协议(SSO)

企业级系统里,你不可能每个应用都输一次密码。SSO 让你登录一次,访问所有关联系统。主流协议有:

  • SAML 2.0:基于 XML,企业老系统用得最多。我在做政府项目时经常遇到。
  • OAuth 2.0:授权框架,但常被用来做认证。登录、Google 登录都是它。
  • OpenID Connect (OIDC):在 OAuth 2.0 之上加了身份层,是目前最推荐的认证协议。

1.3.5 证书认证(PKI / TLS 双向认证)

服务器和客户端各持一张数字证书,通过 CA 链验证身份。常见于金融、IoT、微服务间通信。安全性极高,但部署成本也高。

1.4 知识体系总览

下面这张图把本章的核心逻辑串起来了。我建议你保存下来,后面每学一章都可以回来对照看看。

身份认证知识体系总览 身份认证 你知道什么 你拥有什么 你是什么 密码 / PIN / 密保 手机令牌 / U盾 / 智能卡 指纹 / 人脸 / 虹膜 常见认证协议 密码认证 挑战-响应 令牌认证 (JWT) SSO / 证书认证 核心原则:多因素组合 > 单因素 协议选择取决于:安全等级、用户体验、部署成本

1.5 本章小结

这一章咱们把地基打好了。记住三件事:

  • 认证三要素:你知道的、你拥有的、你是什么。能上两个就别只上一个。
  • 常见协议各有适用场景:密码认证简单但脆弱,令牌认证灵活,证书认证安全但重。
  • 没有银弹:我在不同项目里用过不同的组合——内部管理系统用密码+OTP,金融接口用双向证书,移动端用生物识别+JWT。关键是根据你的威胁模型来选。

一个小练习:看看你手头的项目,当前用了哪种认证方式?如果只用了密码,想想加一个「你拥有什么」的要素,改动成本有多大?