如何使jwt更安全?

pzfprimi  于 2021-10-10  发布在  Java
关注(0)|答案(2)|浏览(447)

我正在部署在wildfly服务器上的应用程序中创建基于jwt的身份验证。
对于到达我的服务器的任何请求,都会验证该请求是否具有基本的auth头。在没有得到标题的情况下,我会得到带有用户名和密码的post请求负载。我用httpservletrequestwrapper Package 请求,并向其添加基本的auth头,然后调用另一个应用程序,该应用程序在使用登录模块自动验证后返回200 ok。此外,我还有一个带有concurrenthashmap<string,myuser>的singleton,在其中我存储了用户登录和带有其他用户详细信息的用户对象。
收到200OK后,我创建一个jwt并将其返回给客户机。然后,客户机向ejb服务发送带有每个请求的jwt。我以持票人的身份获得授权标头******。我从jwt令牌解码用户,然后使用map,再次创建基本auth头并向另一个应用程序发送请求,该应用程序仅在找到基本auth头时才公开服务。
我的疑问是:
a) 在上面的1)中,我正在发送post负载,我可以在浏览器网络日志中看到。而且,我可以清楚地看到发送的用户名和密码。是否需要采取额外措施来防止这种情况。或者,其他用户看不到?或者,https是解决方案?
b) 在上面的2)中,任何人都可以获得我的令牌,如果他们正在进行mitm攻击,或者知道我的凭据(如a)。然后,他们可以无缝地访问服务。我可以添加请求用户的ip地址并存储在Map中吗?在验证jwt的同时,也可以验证ip,以便防止mitm攻击吗?
我访问过其他关于sfo和okta开发者的帖子,他们回答了jwt不安全的原因和原因。但是,我很好奇,在我的情况下,我是否能做一些我所缺少的额外的事情?

bxfogqkk

bxfogqkk1#

这里有几个杠杆可以用来改变jwt设置中的安全性。考虑以下选项:
没有ssl和jwt的加密。在这种情况下,你的JWT不仅对用户来说是可见的,而且对任何正在听的人(无论是合法的还是恶意的)都是可见的。这意味着jwt中包含的任何敏感信息可能对其他人可见。然而,jwt仍然无法被黑客攻击,即使在这种最大程度上不安全的设置中也是如此。原因是每个jwt都包含一个校验和,它是令牌内容的散列,使用只有服务器拥有的密钥进行签名。因此,即使一个mitm或用户与您的jwt发生冲突,当校验和失败时,服务器也会立即识别出令牌已被入侵。
ssl已启用,但jwt未加密。这提供了与上述相同的保护,而且它也使得mitm不太可能在运输过程中获得任何来回的jwt。因此,jwt中的敏感信息只对接收者可见。
ssl已启用,并且令牌已加密。在这种最大程度上安全的设置中,没有任何mitm可以看到jwt在传输中。此外,一旦收到,用户必须使用一些密钥解密jwt。因此,即使jwt最终变成了一个cookie,理论上它也不是一个安全风险,前提是它不能被预期接收者以外的任何人解密。
大多数情况下,我们倾向于选择2,但我们不会将敏感信息放入jwt。不需要在jwt中存储登录密码,因为令牌本身可以证明身份验证。jwt是防篡改的,如果有恶意的人想办法查看诸如到期日或用户名之类的声明,我们通常不在乎。

6ljaweal

6ljaweal2#

1->是的https是唯一的解决方案,无论您在没有https mitm攻击的情况下使API多么安全都很容易。
2->多方面的好处带来了一些折衷,jwt泄漏或窃取是一个真正的问题,而且不容易解决,向jwt添加ip地址不是一个好主意,因为它们会发生很多变化,您的用户必须再次进行身份验证。您尝试的是快速jwt过期在这种情况下,用户必须在每次令牌过期时进行身份验证,现在为了解决这个问题,您可以使用刷新令牌,实现起来并不困难。
想在这里更深入吗-->https://www.youtube.com/watch?v=dprhem174ws&t=1089s

相关问题