身份认证基础
身份认证基础
复习定位
认证和授权是两个容易混淆的概念——认证证明用户的身份(你是不是你声称的人)、授权决定用户可以做什么(你有权做什么操作)。多因素认证组合两种不同的因子增加登录的可靠性。在现代应用中OAuth 2.0广泛用于授权第三方应用访问用户资源而不暴露用户密码。
认证 vs 授权
认证——确认用户的身份。用户输入用户名和密码——系统验证密码是否正确——如果正确则用户通过认证——系统"知道"你是谁。
授权——在认证之后——决定用户是否具有执行某操作或访问某资源的权限。例如用户通过认证登录后——请求敏感API(删除所有数据)——系统检查该用户的角色是否有删除权限——拒绝或准许。
| 概念 | 回答的问题 | 典型技术 |
|---|---|---|
| 认证 | 你是谁? | 密码、证书、指纹 |
| 授权 | 你能做什么? | ACL、RBAC、ABAC、权限 |
| 审计 | 你做了什么? | 日志、监控 |
三种认证因子
第一因子(所知Something you know)——密码、PIN码、密保问题。成本最低——但容易被猜中、钓鱼获取或被撞库攻击。
第二因子(所有Something you have)——手机(SMS OTP/TOTP)、安全密钥(YubiKey)、智能卡。第二因子即使密码泄露——攻击者没有你的手机也无法登录。TOTP(基于时间的一次密码)的时间窗口30秒——客户端和服务器共享密钥——每30秒根据当前时间戳+密钥计算一个6位数字代码。这是目前最广泛部署的额外认证方式。
第三因子(所是Something you are)——指纹、面部识别、虹膜。属于生物特征——不易被复制但不可能在泄露后更新(不像密码可以被重置)。生物识别通常用于本地设备的解锁而非登录远程服务——因为远程传输生物数据可能被中间人截获且用户无法更改它。
OAuth2.0的基本流程(以GitHub授权登录为例)
用户点击"使用GitHub登录"——
- 第三方网站(如新应用)将用户重定向到GitHub的授权页面——附带参数:client_id,redirect_uri,scope。
- 用户在GitHub上登录——确认授权——GitHub生成一个临时授权码——通过浏览器重定向回第三方网站(callback URL上附带了code)。
- 第三方网站用这个code + client_secret(和GitHub共享的密钥)请求GitHub的Token端点。
- GitHub验证code和secret——返回access_token(真正的通行凭证)。
- 第三方网站用access_token请求GitHub的用户API——得到用户的GitHub信息(用户名、邮箱、头像)。
OAuth2.0的认证授权流程本质是资源所有者(用户)在资源服务器(GitHub)上——对客户端(第三方网站)授权——颁发令牌(token)。第三方网站从不接触用户的密码,当令牌过期或用户撤销授予时就有效结束。
复习检查
认证和授权的区别——以刷卡进入公司为场景——刷卡时验证员工身份——之后员工只能进入其权限所在区域——这两个阶段各属于认证还是授权?
生物特征作为密码有什么独特的安全缺陷——密码泄露可以重置——但指纹或虹膜泄露后——用户不能"修改指纹"——这个不可撤销性是生物特征用于身份认证的最重要风险。
OAuth 2.0的Authorization Code和Implicit grant type在颁发token的流程上有什么不同——授权码流程的code是一种临时票据——为何为服务器端应用(后端可以保存secret)提供更安全的环境?
TOTP时间同步——如果手机的本地时间和服务器时间偏移超过30秒——TOTP生成的验证码被拒绝——通常怎么解决(允许前后一两个时间窗口容差验证)?
为什么MFA(多因素认证)能大幅提升账户安全——即使攻击者通过钓鱼获得用户密码——第二因素(如YubiKey或TOTP)需要攻击者同时物理持有——攻击者几乎无法随远程钓鱼获取此物——从而可以有效防止凭据窃取造成的账户入侵。