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 知识体系总览
下面这张图把本章的核心逻辑串起来了。我建议你保存下来,后面每学一章都可以回来对照看看。
1.5 本章小结
这一章咱们把地基打好了。记住三件事:
- 认证三要素:你知道的、你拥有的、你是什么。能上两个就别只上一个。
- 常见协议各有适用场景:密码认证简单但脆弱,令牌认证灵活,证书认证安全但重。
- 没有银弹:我在不同项目里用过不同的组合——内部管理系统用密码+OTP,金融接口用双向证书,移动端用生物识别+JWT。关键是根据你的威胁模型来选。
一个小练习:看看你手头的项目,当前用了哪种认证方式?如果只用了密码,想想加一个「你拥有什么」的要素,改动成本有多大?