面试题答案
一键面试JWT生成机制设计
- 密钥管理:
- 使用强加密算法生成的密钥,例如使用
openssl rand -hex 32
生成32字节的十六进制字符串作为密钥。将密钥安全存储在每个边缘节点,推荐使用硬件安全模块(HSM)进行密钥存储,防止密钥泄露。 - 定期更换密钥,比如每30天更换一次,降低密钥长期使用带来的风险。
- 使用强加密算法生成的密钥,例如使用
- 载荷内容:
- 基本信息:包含用户ID(如
sub
字段)、用户名等标识信息,用于唯一识别用户。 - 权限信息:在载荷中设置
scopes
字段,明确用户在边缘计算系统中的操作权限,如读取传感器数据、写入控制指令等。 - 有效期:设置
exp
字段表示JWT的过期时间,例如设置为1小时,确保JWT不会长期有效。同时设置nbf
字段表示生效时间,防止提前使用伪造的JWT。
- 基本信息:包含用户ID(如
- 生成流程:
- 边缘节点接收到用户登录请求,验证用户的用户名和密码。
- 验证通过后,根据上述载荷内容构建JWT的载荷部分。
- 使用存储在本地的密钥和选定的签名算法(如HS256)对载荷进行签名,生成完整的JWT。
JWT验证机制设计
- 验证流程:
- 边缘节点接收到包含JWT的请求。
- 首先验证JWT的格式是否正确,确保其由三部分(头部、载荷、签名)组成且通过点号(
.
)分隔。 - 从本地获取相同的密钥(与生成JWT时使用的密钥一致)。
- 使用相同的签名算法(如HS256)对JWT的头部和载荷部分重新签名,并与JWT中的签名进行比对。如果签名一致,继续下一步验证;否则,拒绝请求。
- 检查JWT载荷中的
exp
字段是否过期,nbf
字段是否已生效。如果过期或未生效,拒绝请求。 - 验证载荷中的权限信息是否满足当前请求的操作要求,如请求写入数据,需检查
scopes
中是否有写入权限。
- 分布式验证:
- 为了确保高可用性,每个边缘节点独立进行JWT验证,避免单点故障。可以通过在每个节点上部署相同的密钥管理和验证逻辑来实现。
JWT刷新机制设计
- 刷新令牌:
- 在用户登录成功时,除了生成JWT,还生成一个刷新令牌(Refresh Token)。刷新令牌可以是一个随机生成的长字符串,例如使用
uuid.uuid4().hex
生成一个128位的十六进制字符串。 - 将刷新令牌与用户ID关联并存储在数据库或分布式缓存(如Redis)中,设置一个较长的过期时间,比如7天。
- 在用户登录成功时,除了生成JWT,还生成一个刷新令牌(Refresh Token)。刷新令牌可以是一个随机生成的长字符串,例如使用
- 刷新流程:
- 当JWT过期后,客户端向边缘节点发送刷新JWT的请求,请求中包含刷新令牌。
- 边缘节点验证刷新令牌的有效性,检查其是否存在于存储中且未过期。
- 验证通过后,重新生成新的JWT,包含新的有效期和权限信息,同时可以选择更新刷新令牌(延长过期时间或重新生成)。
- 将新的JWT返回给客户端。
可能遇到的安全风险及应对措施
- 密钥泄露:
- 风险:如果密钥泄露,攻击者可以伪造JWT,获取系统的访问权限。
- 应对措施:使用HSM存储密钥,限制密钥的访问权限,只有授权的进程可以访问。定期更换密钥,即使密钥泄露,旧密钥生成的JWT过期后也会失效。
- JWT劫持:
- 风险:攻击者通过网络监听等手段获取JWT,然后使用该JWT进行未授权访问。
- 应对措施:在网络传输过程中使用SSL/TLS加密,防止JWT被明文截获。设置较短的JWT有效期,减少JWT被劫持后的有效使用时间。
- 重放攻击:
- 风险:攻击者记录合法的JWT请求,然后重复发送以获取资源。
- 应对措施:在JWT中加入唯一标识符(如
jti
字段),每次请求时服务器记录已使用的JWT标识符,拒绝重复的请求。或者使用时间戳验证,检查JWT的生成时间与当前时间的差值,超出一定时间范围的请求被拒绝。
- 刷新令牌泄露:
- 风险:刷新令牌泄露后,攻击者可以使用它获取新的JWT,从而持续访问系统。
- 应对措施:存储刷新令牌时进行加密处理。对刷新令牌的使用进行严格的日志记录和监控,发现异常使用及时处理。设置较短的刷新令牌有效期,降低泄露后的风险。