引言
随着IT和互联网的发展,从国家到企业,网络安全成为数字经济安全的重要内容,是一项每天、长期都要面对的问题。稍大一点的公司每年也都会有护网行动。
随着技术的发展,Token的安全性已成为一个至关重要的议题,Token不仅被广泛用于用户身份验证,还承担着会话管理等关键任务。本文我们就来聊一聊防范伪造、篡改、窃取问题的解决方案。
JWT
提到token,就不得不提到JWT。
什么是JWT
Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准(RFC 7519)。该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景。JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也可以增加一些额外的其它业务逻辑所必须的声明信息,该token也可直接被用于认证,也可被加密。
保证安全的前提,我们先来了解下JWT的起源以及Token的原理
为什么会出现Token-和传统的session认证的区别?
传统的session认证
我们知道,http协议本身是一种无状态的协议,而这就意味着如果用户向我们的应用提供了用户名和密码来进行用户认证,那么下一次请求时,用户还要再一次进行用户认证才行,因为根据http协议,我们并不能知道是哪个用户发出的请求,所以为了让我们的应用能识别是哪个用户发出的请求,我们只能在服务器存储一份用户登录的信息,这份登录信息会在响应时传递给浏览器,告诉其保存为cookie,以便下次请求时发送给我们的应用,这样我们的应用就能识别请求来自哪个用户了,这就是传统的基于session认证。
但是这种基于session的认证使应用本身很难得到扩展,随着不同客户端用户的增加,独立的服务器已无法承载更多的用户,而这时候基于session认证应用的问题就会暴露出来.
基于session认证所显露的问题
Session: 每个用户经过我们的应用认证之后,我们的应用都要在服务端做一次记录,以方便用户下次请求的鉴别,通常而言session都是保存在内存中,而随着认证用户的增多,服务端的开销会明显增大。
扩展性: 用户认证之后,服务端做认证记录,如果认证的记录被保存在内存中的话,这意味着用户下次请求还必须要请求在这台服务器上,这样才能拿到授权的资源,这样在分布式的应用上,相应的限制了负载均衡器的能力。这也意味着限制了应用的扩展能力。
CSRF:因为是基于cookie来进行用户识别的,cookie如果被截获,用户就会很容易受到跨站请求伪造的攻击。
Token的鉴权机制是怎样的
图片
基于token的鉴权机制类似于http协议也是无状态的,它不需要在服务端去保留用户的认证信息或者会话信息。这就意味着基于token认证机制的应用不需要去考虑用户在哪一台服务器登录了,这就为应用的扩展提供了便利。
流程上是这样的:
- 用户使用用户名密码来请求服务器
- 服务器进行验证用户的信息
- 服务器通过验证发送给用户一个token
- 客户端存储token,并在每次请求时附送上这个token值
- 服务端验证token值,并返回数据
这个token必须要在每次请求时传递给服务端,它应该保存在请求头里, 另外,服务端要支持CORS(跨来源资源共享)策略,一般我们在服务端这么做就可以了Access-Control-Allow-Origin: *。
Token的安全问题
Token的安全威胁
窃取攻击
重放攻击
重放攻击是另一种常见的威胁,攻击者可以通过截获Token并重新发送来模拟合法用户的请求。这种攻击可能导致未经授权的操作,例如执行恶意操作或者获取未授权的资源。为了防止重放攻击,开发人员可以采用一些策略,如为Token设置短暂的有效期,并使用一次性的随机数或时间戳来增加Token的复杂度,使其难以被重复使用。
这里要强调下重放攻击,他往往不容易被察觉,因为他拿到了一个有效的token,但是他危害性 又很大,轻则流量打满,系统不可用,重则经济损失。
伪造攻击
Token的安全性方案
使用HTTPS
确保所有与Token相关的通信都通过HTTPS协议进行加密传输。HTTPS提供了端到端的加密,可以防止中间人攻击和窃取Token的威胁。使用SSL/TLS证书对通信进行加密,确保Token在传输过程中不会被窃取或篡改。
Token加密
对于敏感信息或者需要保护的Token内容,采用加密算法进行加密处理是一种有效的方式。通过加密Token内容,即使Token被窃取,攻击者也无法解析其中的信息。使用强大的加密算法如AES或者RSA来加密Token,确保其内容在存储和传输过程中的安全性。
安全的Token存储
在客户端和服务器端安全地存储Token是至关重要的。避免将Token存储在不安全的地方,如浏览器的本地存储或者未加密的数据库中。建议将Token存储在安全的存储介质中,如加密的本地存储或者安全的数据库中,并采取措施限制对Token的访问权限。
设置合理的Token过期时间
通过设置合理的Token有效期来限制Token的使用时间,可以减少Token被滥用的风险。根据应用程序的需求和安全策略,设置Token的有效期,建议不要过长,通常几分钟到几小时为宜。定期更新Token并且及时使其过期可以有效地减少Token被攻击者利用的机会。
使用双因素认证
在关键操作中使用双因素认证可以增加用户身份验证的安全性。当用户进行重要操作时,要求用户除了提供Token外,还需要进行另一种身份验证,如短信验证码、硬件令牌或生物识别等。这样可以大大提高系统的安全性,即使Token被盗取,攻击者也无法完成关键操作。
安全地刷新Token
安全地刷新Token是确保用户会话持续有效的关键步骤
定期刷新
设置合理的Token过期时间,并在Token即将过期之前进行刷新。通常,可以在Token过期前的一段时间内发起刷新请求,以确保用户会话的连续性。
验证用户身份
在刷新Token时,要求用户重新进行身份验证,以确保请求来自合法用户。可以要求用户提供密码、指纹、短信验证码等额外的身份验证信息,以确认用户身份的真实性。
限制刷新次数
为了防止恶意攻击者滥用Token刷新功能,可以限制Token的刷新次数和频率。设定合理的刷新频率和最大刷新次数,防止攻击者利用刷新功能进行暴力破解或滥用。
使用安全通道
在刷新Token时,要求使用安全的通信渠道,如HTTPS协议,确保Token刷新请求的安全性和完整性。避免在不安全的网络环境下进行Token刷新操作,以防止Token被窃取或篡改。
更新相关会话信息
在刷新Token的同时,更新相关的会话信息,如会话标识、用户权限等。确保会话信息与新颁发的Token保持同步,以防止出现会话不一致或权限错误的情况。
总结
应对安全问题,我们需要多举措并行。
- 除了我们的技术方案制定上要充分考虑安全性的设计,还要不断地与时俱进,在不断演变的网络安全环境中,不断提高我们的安全能力,完善我们的技术方案。
- 产品方案设计时,在关键节点增加双因子认证环节。
- 建立安全测试机制,有条件的都是建立专业的安全测试团队或者请外部的安全测试公司定期/不定期的进行网络安全扫描,能够及时的发现安全问题以便于及时修复
- 不断完善监控预警机制。通过访问日志记录、异常行为检测、实时监控工具等措施,及时发现异常情况,减少损失。