(从this thread催生因为这是真的具体到等的NodeJS自己的,而不是一个问题)最佳实践令牌
我实现与验证的REST API服务器,我已经成功实现了JWT令牌处理,以便用户可以通过带有用户名/密码的/ login端点进行登录,然后根据服务器密钥生成JWT令牌并将其返回给客户端。然后在每个经过验证的API请求中将令牌从客户端传递到服务器,服务器密钥用于验证令牌。
但是,我想了解确切如何以及在多大程度上验证令牌的最佳实践,以制定真正安全的系统。究竟应该参与“验证”令牌?使用服务器密钥验证签名是否足够,还是应该交叉检查令牌和/或令牌有效负载与存储在服务器中的某些数据?
基于令牌的认证系统只会像每个请求中传递用户名/密码一样安全,前提是获得令牌的难度要高于获取用户的密码。但是,在我见过的例子中,生成令牌所需的唯一信息是用户名和服务器端的秘密。这是否意味着假设一分钟恶意用户获得了服务器机密的知识,他现在可以代表任何用户生成代币,从而不仅可以访问给定用户,而且如果密码才获得,但实际上要全部是用户帐号?
这使我想到的问题:
1)如果JWT令牌验证由一个单独的验证机制仅限于核实令牌本身的签名,单独依靠服务器秘密的完整性,或伴有?
在某些情况下,我见过的联合使用令牌和服务器会话其中一旦通过/登录端点登录成功建立会话。 API请求验证令牌,并将令牌中发现的解码数据与会话中存储的一些数据进行比较。但是,使用会话意味着使用cookie,并且在某种意义上它违背了使用基于令牌的方法的目的。它也可能会给某些客户带来问题。
可以想象服务器将所有令牌当前在memcache或类似目录中使用,以确保即使服务器机密受到攻击,以至于攻击者可能产生“有效”令牌,但只会产生确切的令牌通过/登录端点将被接受。这是合理的还是多余的/矫枉过正的?
2)如果JWT签名验证是验证令牌,这意味着服务器秘密的完整性的唯一手段是突破点,应该如何服务器秘密进行管理?从环境变量中读取并在每个已部署的堆栈中创建(随机化?)一次?重新定制或周期性地旋转(如果是这样,如何处理在旋转之前创建的现有有效令牌,但需要在旋转后进行验证,如果服务器在任何给定时间保持当前密钥和以前的密码,则可能已足够) ?还有别的吗?
也许我只是在服务器机密被泄密的风险过分偏执,这当然是一个更加普遍的问题,需要在所有加密情况下解决......
有很大的问题。回复:问题2我有任何密钥保持服务器端相同的问题。如果您正在执行任何类型的散列匹配或非对称解密,无论是签名jwt还是解密存储在数据库中的cc信息,您都必须通过服务器上的代码访问密钥。那么你到底在哪里?以下是我找到的最佳答案:https:// pcinetwork。组织/论坛/的index.php?线程/ PCI-DSS-3-0-3-5-2店秘密和私有密钥,用来对加密 - 解密 - 持卡人数据中,单或更多的619//可能安全,因为它也得到一个jwt密钥。 – jbd
什么是jwt token中的密钥?我认为jwt标志本身就是一个秘密。或者密钥可能是'RSAPrivateKey privateKey'? – kittu
刚才有人问到,但也许有人会觉得它有用。就我而言,每个用户都有一个“密钥”。所以每次用户登录时,我都会生成该密码并将用户记录存储在数据库中。我使用该秘密验证令牌。注销后,我可以清除该值。这会自动使其他创建的令牌失效(这就是我所需要的)。 –