后端-常见身份认证协议详解与应用场景
Basic 鉴权
在 header 的 auth 字段中 base64 编码过后的账户密码, 安全性较差
格式: Authorization: Basic YWRtaW46MTIzNA==
摘要认证
使用哈希算法, 对账户,密码,随机字符串等进行摘要, 不直接将密码传递给后端
格式: Authorization: Digest username="admin", realm="example", nonce="xyz", uri="/resource", response="digest-hash"
Bearer Token
用于 api 或者 Oauth 认证, 通过使用 token 来访问受限资源
token , 可以由认证服务器 或者 后端服务直接返回, 一般为 set-cookie 的方式
令牌中一般具有过期时间, 或者会持续更新 token
格式: Authorization: Bearer <token>
OAuth
场景有 单点登录, api 授权, 第三方登录等
使用第三方授权服务, 分为多种授权模式
- 授权码模式, 重定向到第三方授权服务器, 获取授权码, 通过授权码从授权服务器获取对应资源的 token
- 隐式模式, 授权直接返回, 不用授权码
- 密码模式, 直接将用户密码透传给授权服务器
- 客户端模式 ,机器对机器通信, 服务之间交互
令牌认证 token-base auth
首次登录提供账户密码. 验证后会生成令牌, 后续直接使用 token 进行访问, 令牌泄露会有风险, 一般会有过期时间和强制过期功能
一般格式: Authorization: Bearer <token>
双向 TLS 认证
客户端和服务端需要双向 tls 认证才能访问
一般客户端会检查服务端的证书情况, 服务器也可以检查客户端证书情况, 数据传输系统中, 经常使用这种技术, 客户端证书认证通过后才能访问服务端资源
NTLM 微软开发的认证协议, 逐步被 kerberos 协议替代
基于 MD4 或者 MD5 进行认证
流程:
- 服务端返回一个字符串,
- 客户端使用 NTLM Hash(固定)和 返回的随机字符串生成一个 hash,
- 使用这个 hash 进行认证
Kerberos 认证
引入一个第三方 KDC(密钥分发中心), 进行身份验证
- 身份认证: 将账户密码加密后发送给 KDC 的 AS(验证服务), 返回加密的票据(TGT, 票据授权票据)和加密的会话密钥(用于和 TGS 通信), 客户端解密(使用密码派生密钥, 密码对称加密后的密钥)后保存票据
- 请求服务票据: 向 KDC 的 TGS (颁发服务票据)申请服务的票据 , 同时生成会话密钥(用于目标服务通信)
- 访问服务: 客户端使用服务票据和会话密钥的认证信息到目标服务器进行访问
OIDC (openid connect)
基于 OAuth2 认证协议, 用于单点登录和身份认证, 扩展 OAuth, 不仅支持授权还支持身份认证
- 客户端向 idP(身份提供者)发起认证
- 身份提供者要求用户登录
- 登录成功返回 id token 和 access token
- 客户端使用 id token (JWT) 验证用户身份(包含用户信息, 防止被篡改, 利用其他人的身份)
- 使用 access token 进行资源访问
CAS (中央认证服务)
主要用于单点登录, 集中式的认证机制
- 用户通过应用程序访问受保护资源
- 应用程序重定向到 CAS
- 用户在 CAS 中认证
- CAS 返回服务票据
- 用户将服务票据发往应用程序
- 应用程序使用票据访问 CAS 验证票据
- 验证成功,应用返回受保护资源
WebAuthh
使用本地设备的生物识别进行无密码登录, 辅助认证手段, 不能保证生物识别在每一个机器上都拥有, 所以不能用作登录认证场景