后端-常见身份认证协议详解与应用场景

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 进行认证
流程:

  1. 服务端返回一个字符串,
  2. 客户端使用 NTLM Hash(固定)和 返回的随机字符串生成一个 hash,
  3. 使用这个 hash 进行认证

Kerberos 认证

引入一个第三方 KDC(密钥分发中心), 进行身份验证

  1. 身份认证: 将账户密码加密后发送给 KDC 的 AS(验证服务), 返回加密的票据(TGT, 票据授权票据)和加密的会话密钥(用于和 TGS 通信), 客户端解密(使用密码派生密钥, 密码对称加密后的密钥)后保存票据
  2. 请求服务票据: 向 KDC 的 TGS (颁发服务票据)申请服务的票据 , 同时生成会话密钥(用于目标服务通信)
  3. 访问服务: 客户端使用服务票据和会话密钥的认证信息到目标服务器进行访问

OIDC (openid connect)

基于 OAuth2 认证协议, 用于单点登录和身份认证, 扩展 OAuth, 不仅支持授权还支持身份认证

  1. 客户端向 idP(身份提供者)发起认证
  2. 身份提供者要求用户登录
  3. 登录成功返回 id token 和 access token
  4. 客户端使用 id token (JWT) 验证用户身份(包含用户信息, 防止被篡改, 利用其他人的身份)
  5. 使用 access token 进行资源访问

CAS (中央认证服务)

主要用于单点登录, 集中式的认证机制

  1. 用户通过应用程序访问受保护资源
  2. 应用程序重定向到 CAS
  3. 用户在 CAS 中认证
  4. CAS 返回服务票据
  5. 用户将服务票据发往应用程序
  6. 应用程序使用票据访问 CAS 验证票据
  7. 验证成功,应用返回受保护资源

WebAuthh

使用本地设备的生物识别进行无密码登录, 辅助认证手段, 不能保证生物识别在每一个机器上都拥有, 所以不能用作登录认证场景