python - JWT 授权和令牌泄漏
问题描述
我需要帮助了解用于登录功能的 JWT 令牌的安全性。具体来说,它如何防止可以看到用户数据包的攻击者的攻击?我的理解是,无论是否加密,如果攻击者获得对令牌的访问权限,他们将能够复制令牌并使用它来登录自己并访问受保护的资源。我读过这就是为什么令牌的生存时间应该很短的原因。但这实际上有多大帮助?获取资源并不需要很长时间。如果攻击者可以窃取一次令牌,他们不能在刷新后再次这样做吗?
有没有办法验证客户端发送的令牌是从您发送它的同一个客户端发送的?还是我错过了重点?
解决方案
它如何防止可以看到用户数据包的攻击者的攻击?
仅仅因为您可以看到某人的数据包并不意味着您可以看到内容。HTTPS 对流量进行加密,因此即使有人设法捕获您的流量,他们也无法从中提取 JWT。每个使用身份验证的网站都只能通过 HTTPS 运行。如果有人能够进行中间人攻击,那就另当别论了。
他们将能够复制令牌并使用它来登录自己并访问受保护的资源
是的,但仅作为他们窃取令牌的用户。JWT 已签名,这意味着您无法在不破坏服务器检测到的签名的情况下修改其内容(至少在计算上无法找到哈希冲突以便您可以修改 JWT 的内容)。对于高度敏感的访问(银行账户、医疗数据、企业云管理员账户......),您将需要至少 2 因素身份验证。
如果攻击者可以窃取一次令牌,他们不能在刷新后再次这样做吗?
可能,但这取决于令牌的暴露方式。如果被攻击者位于您和服务器之间的未加密通道上,那么确保他们可以重复相同的过程,但这种暴露可能是临时故障/人为错误的结果,可能很快就会得到修复,这将阻止攻击使用令牌一旦它过期。
有没有办法验证客户端发送的令牌是从您发送它的同一个客户端发送的?
如果攻击者成功执行了中间人攻击,他们可以伪造您可能用来验证客户端的任何信息,因此答案是否定的,没有 100% 可靠的方法来验证客户端。
我在 JWT 中看到的最大问题不是 JWT 本身,而是某些人处理它们的方式(存储在未加密的浏览器本地存储中,包含 PII、没有 HTTPS、必要时没有 2 因素身份验证等......)
推荐阅读
- c# - 获取最近的 ID 并将其插入到 ASP.NET 中的另一个表中
- list - 如何将第一个列表中的元素与 SML 中第二个列表中的所有元素配对?
- sql - SQL Server 存储过程将多行 SELECT 语句结果存储到单个变量中
- ruby-on-rails - 根据用户类型对 has_many 关联进行验证
- css - 在移动设备中隐藏某些图像
- excel - Excel BBG 公式不刷新
- python - 从 Graph 类中提取度数、平均度数
- java - 在 selenium 的活动窗口中未单击 X 图标
- c++ - 在 C++ 中初始化二维向量
- xamarin - 为什么 Navigation.PopAsync() 不触发底层页面的 OnAppearing 方法?