面试题答案
一键面试一次性Token面临的安全风险
- 重放攻击:攻击者捕获并多次使用已发送的一次性Token,以获取未经授权的访问。例如在用户登录场景下,攻击者拦截登录成功返回的一次性Token,后续利用该Token重复发起请求,而无需再次输入用户名密码进行身份验证。
- 窃取风险:如果传输过程未加密,Token可能被窃取。例如通过网络嗅探工具捕获在网络中传输的Token,然后攻击者可利用窃取的Token进行非法操作。
防范技术手段、原理及实施要点
- 加密
- 原理:对Token进行加密处理,使得即使Token被拦截,攻击者也无法解析出有效信息。常见的加密方式有对称加密(如AES)和非对称加密(如RSA)。对称加密使用相同的密钥进行加密和解密;非对称加密使用公钥加密,私钥解密。
- 实施要点:
- 选择合适的加密算法和密钥长度。例如AES - 256位加密通常被认为具有较高的安全性。
- 妥善保管密钥,对称加密的密钥需要在发送方和接收方安全共享;非对称加密中私钥必须严格保密,公钥可公开分发。
- 在Token生成和验证过程中正确调用加密和解密方法。在Spring Cloud应用中,可以利用Spring Security提供的加密工具类,如BCryptPasswordEncoder等。
- 时间戳
- 原理:在Token中加入时间戳信息,接收方验证Token时检查时间戳。如果Token的时间戳超出了允许的时间范围(如5分钟),则判定Token无效。这是因为攻击者重放Token时,由于时间的推移,该Token的时间戳会不符合当前时间要求,从而被拒绝。
- 实施要点:
- 在生成Token时,准确记录当前时间并嵌入Token中。例如使用Java的
System.currentTimeMillis()
获取当前时间戳。 - 在验证Token时,设置合理的时间容忍范围。这个范围需要根据业务场景调整,既要防止重放攻击,又不能因为网络延迟等原因导致合法Token被误判。
- 确保服务器之间的时间同步,可使用NTP(网络时间协议)服务,保证验证时间戳的准确性。
- 在生成Token时,准确记录当前时间并嵌入Token中。例如使用Java的
- 随机数(Nonce)
- 原理:在每次生成Token时添加一个唯一的随机数。当接收方验证Token时,会记录已使用过的随机数。如果接收到的Token中的随机数已经存在于记录中,说明该Token可能是重放的,从而拒绝该请求。
- 实施要点:
- 生成高质量的随机数,确保其唯一性和不可预测性。例如使用Java的
SecureRandom
类生成随机数。 - 维护一个已使用随机数的记录,可使用缓存(如Redis)存储已使用的随机数,以提高查询效率。
- 定期清理已使用随机数记录,避免存储数据无限增长。例如设置合理的过期时间,如一天后清除已使用的随机数。
- 生成高质量的随机数,确保其唯一性和不可预测性。例如使用Java的
- 签名
- 原理:使用私钥对Token的内容(如包含用户信息、时间戳等)进行签名,接收方使用对应的公钥验证签名。如果签名验证失败,说明Token可能被篡改。因为只有持有私钥的合法方才能生成有效的签名,攻击者即使修改了Token内容,也无法生成正确的签名。
- 实施要点:
- 选择合适的签名算法,如RSA签名算法。
- 严格保管私钥,仅在生成签名时使用。公钥可以安全地分发给需要验证签名的服务。
- 在生成Token时,正确使用签名算法对Token内容进行签名,并将签名结果附加到Token中。在验证Token时,提取签名并使用公钥进行验证。在Spring Cloud中,可以利用一些库如Apache Commons Codec来实现签名和验证功能。