Python JWT授权和令牌泄漏

Python JWT授权和令牌泄漏,python,jwt,access-token,django-rest-auth,Python,Jwt,Access Token,Django Rest Auth,我需要帮助理解用于登录功能的JWT令牌的安全性。具体来说,它如何防止能够看到用户数据包的攻击者的攻击?我的理解是,无论是否加密,如果攻击者获得对令牌的访问权,他们将能够复制令牌并使用它登录自己并访问受保护的资源。我读到,这就是为什么代币的生存时间应该很短的原因。但这到底有多大帮助呢?不需要很长时间就能获得资源。如果攻击者可以偷一次代币,那么他们就不能在重新攻击后再偷一次吗 是否无法验证客户端发送的令牌是从您发送到的同一客户端发送的?还是我没抓住重点 它如何防止能够看到用户数据包的攻击者的攻击 仅

我需要帮助理解用于登录功能的JWT令牌的安全性。具体来说,它如何防止能够看到用户数据包的攻击者的攻击?我的理解是,无论是否加密,如果攻击者获得对令牌的访问权,他们将能够复制令牌并使用它登录自己并访问受保护的资源。我读到,这就是为什么代币的生存时间应该很短的原因。但这到底有多大帮助呢?不需要很长时间就能获得资源。如果攻击者可以偷一次代币,那么他们就不能在重新攻击后再偷一次吗

是否无法验证客户端发送的令牌是从您发送到的同一客户端发送的?还是我没抓住重点

它如何防止能够看到用户数据包的攻击者的攻击

仅仅因为你能看到某人的信息包并不意味着你能看到内容。HTTPS对流量进行加密,因此即使有人设法捕获您的流量,他们也无法从中提取JWT。每个使用身份验证的网站都应该只通过HTTPS运行。如果有人能够执行中间人攻击,那就不同了

他们将能够复制令牌并使用它登录自己并访问受保护的资源

是的,但只是作为他们偷令牌的用户。JWT已签名,这意味着您不能在不破坏服务器将检测到的签名的情况下修改其内容(至少在计算上不可能找到散列冲突,这样您就可以修改JWT的内容)。对于高度敏感的访问(银行帐户、医疗数据、企业云管理帐户…),您将至少需要2因素身份验证

如果攻击者可以偷一次代币,那么他们就不能在重新攻击后再偷一次吗

可能,但这取决于令牌是如何公开的。如果被攻击的令牌位于您和服务器之间的未加密通道上,则确保他们可以重复相同的过程,但此暴露可能是由于临时故障/人为错误造成的,该错误可能很快会得到修复,从而在令牌过期后阻止攻击使用令牌

是否无法验证客户端发送的令牌是从您发送到的同一客户端发送的

如果攻击者成功执行中间人攻击,他们可以伪造您可能用于验证客户端的任何信息,因此答案是否定的,没有100%可靠的方法来验证客户端



我在JWTs中看到的最大问题不是JWTs本身,而是一些人处理它们的方式(存储在未加密的浏览器本地存储中,包含PII、无HTTPS、必要时无双因素身份验证等…)

补充Matus的优秀答案:

大多数真实世界的客户端往往是浏览器和移动用户界面,它们无法保守秘密,也无法自己进行安全加密。您描述的风险与其他类型的消息凭据(如cookie)发生的风险相同

我将详细探讨浏览器案例,以帮助您思考

对于你的情况,我可能会按照类似的思路进行:

  • 还有什么替代方案
  • 在哪些方面存在对持票人代币的担忧
  • 在这些领域有更好的替代方案吗

对于某些类型的客户端,您可以增强身份验证功能,例如基于,但并非所有授权服务器都支持此功能。

这就是令牌需要保密且连接必须安全的原因。https解决了此问题吗?你说的秘密是什么意思?我们正在与客户共享它……需要注意的是,JWT保证数据所有权,但不保证加密;任何截取令牌的人都可以看到存储在JWT中的JSON数据,因为它只是序列化的,而不是加密的。因此,强烈建议将HTTPS与JWTs一起使用