有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何使JWT更安全?

我正在部署在Wildfly服务器上的应用程序中创建基于JWT的身份验证

  1. 对于到达我的服务器的任何请求,都会验证该请求是否具有基本的Auth头。在没有得到标题的情况下,我会得到带有用户名和密码的POST请求负载。我用HttpServletRequestWrapper包装请求,并向其添加基本的auth头,然后调用另一个应用程序,该应用程序在使用登录模块自动验证后返回200 OK。此外,我还有一个带有ConcurrentHashMap的单例<;字符串,MyUser>;我在其中存储用户登录和带有其他用户详细信息的用户对象

  2. 收到200OK后,我创建一个JWT并将其返回给客户机。然后,客户机向EJB服务发送带有每个请求的JWT。我以持票人的身份获得授权标头******。我从JWT令牌解码用户,然后使用map,再次创建基本Auth头并向另一个应用程序发送请求,该应用程序仅在找到基本Auth头时才公开服务

我的怀疑:

a)在上面的1)中,我正在发送POST负载,我可以在浏览器网络日志中看到。而且,我可以清楚地看到发送的用户名和密码。是否需要采取额外措施来防止这种情况。或者,其他用户看不到?或者,https是解决方案

b)在上面的2)中,任何人都可以获得我的令牌,如果他们正在进行MITM攻击,或者知道我在a)中的凭据。 然后,他们可以无缝地访问服务我可以添加请求用户的IP地址并存储在映射中吗?在验证JWT的同时,也可以验证IP,以便防止MITM攻击

我访问过其他关于SFO和Okta开发者的帖子,他们回答了JWT不安全的原因和原因。但是,我很好奇,在我的情况下,我是否能做一些我所缺少的额外的事情


共 (2) 个答案

  1. # 1 楼答案

    1->;是的,HTTPS是唯一的解决方案,无论您的API有多安全 HTTPS MITM攻击很容易

    2->;多方面的好处带来了一些折衷,JWT泄漏或窃取是一个真正的问题,而且不容易解决,向JWT添加IP地址不是一个好主意,因为它们会发生很多变化,您的用户必须再次进行身份验证。 您尝试的是快速JWT过期在这种情况下,用户必须在每次令牌过期时进行身份验证,现在为了解决此问题,您可以使用刷新令牌,实现起来并不困难

    想要在这里更深入>https://www.youtube.com/watch?v=DPrhem174Ws&t=1089s

  2. # 2 楼答案

    这里有几个杠杆可以用来改变JWT设置中的安全性。考虑以下选项:

    1. 您的JWT没有SSL和加密服务器拥有的密钥进行签名。因此,即使一个MITM或用户与您的JWT发生冲突,当校验和失败时,服务器也会立即识别出令牌已被入侵
    2. SSL已启用,但JWT未加密这提供了与上述相同的保护,而且它也使得MITM不太可能在运输过程中获得任何来回的JWT。因此,JWT中的敏感信息只对接收者可见
    3. SSL已启用,且令牌已加密在这个最大限度安全的设置中,没有任何MITM可以看到JWT在传输中。此外,一旦收到,用户必须使用一些密钥解密JWT。因此,即使JWT最终变成了一个cookie,理论上它也不是一个安全风险,前提是它不能被预期接收者以外的任何人解密

    大多数情况下,我们倾向于选择2,但我们不会将敏感信息放入JWT。不需要在JWT中存储登录密码,因为令牌本身可以证明身份验证。JWT是防篡改的,如果有恶意的人想办法查看诸如到期日或用户名之类的声明,我们通常不在乎