是否可以在JWT中存储用户凭据

Fro*_*art 11 json jwt json-web-token

是否可以在JWT中存储用户凭据(用户名/密码)(所以sign它和verify以后产生的令牌)?

听说

不,在JWT中发送密码是不安全的.这是因为JWT声明只是简单编码,并且可以被看到它们的任何人轻松解码.将任何敏感信息存储在返回给用户的JWT中是不安全的

但我不知道为什么JWT网站建议将其用于身份验证:

什么时候应该使用JSON Web令牌?

以下是JSON Web令牌有用的一些场景:

身份验证:这是使用JWT的最常见方案.一旦用户登录,每个后续请求将包括JWT,允许用户访问该令牌允许的路由,服务和资源.Single Sign On是一种现在广泛使用JWT的功能,因为它的开销很小,并且能够在不同的域中轻松使用

gab*_*ssi 14

JWT是身份验证的结果.例如

  1. 用户将其凭证(例如用户名/密码)发送到身份验证服务.它可能是您的整体内部的第三方或第三方或您自己的专用于身份验证的微服务.
  2. 该服务验证用户名密码.如果身份验证成功,它将返回一个JWT,表示用户已经过身份验证,换句话说,他是谁声称他是.此JWT可能包含没有敏感信息的有效负载(此处不存储密码).
  3. 用户使用JWT向服务业务发送另一个请求.如果JWT未过期且未损坏(标志仍然有效),则该服务可以信任其JWT.也许这项任务将委托给授权服务.

JWT令牌里面有什么?

好吧,最简单的JWT包含有关符号的信息(我不能在这里详细输入,因为我不是安全专家),它允许在收到JWT请求时检查符号是否已损坏.

此信息可以通过数字签名进行验证和信任

除此之外,JWT允许发送有效载荷.

更正式的是,JWT由以下人员组成:

  • 标头:正在使用的令牌+散列算法的类型
  • 有效负载:声明是关于实体(通常是用户)和其他元数据的声明.
  • 签名:签名用于验证JWT的发件人是否是其所说的人,并确保邮件在此过程中未被更改.

例如,如果我使用我的凭据用户名:密码为gabriel:giussi向身份验证服务发送请求,它将检查此凭据,如果它们可以,则可以创建以下JWT. 在此输入图像描述

然后对于每个请求,我将编码包含我的用户名和服务的JWT

  • 如果JWT标志有效,执行授权(Gabriel有权做什么?)
  • 如果JWT已过期,请让我再次登录
  • 如果符号损坏,则返回验证错误.


Val*_*Shi 7

简而言之:是的,如果您在放入 JWT 的有效负载之前对数据进行加密,并在 JWT 验证后对其进行解密以使用它,那么在 JWT 中传递/接收敏感数据是可以的。

  1. 在一般情况下,您不需要在 JWT 中保留用户凭据,因为 JWT 本身就是动态生成的凭据,表示 JWT 第一次生成时提供的登录名/密码(或其他身份验证方式)。

    1.1 然而,您可以传递不像纯登录名/密码那么敏感但仍然包含 JWT 验证时所需的有价值信息的内容。它可以是用户 ID(在声明中,如果需要,可以进行散列处理)或访问级别代码等。

  2. 不过,如果您愿意,可以使用 JWT 传递敏感信息。如下所示,这一切都很简单。

    2.1 对于敏感数据,您可以在 JWT 的有效负载中使用特定的私有声明,例如:

    {
      // These are registered claims: (see https://www.rfc-editor.org/rfc/rfc7519#section-4.1)
      "sub": "1234567890",
      "name": "John Doe",
      "iat": 1516239022
    
      // There can be some public claims you are not afraid to expose to the world
      // these are omitted here for brevity (see https://www.rfc-editor.org/rfc/rfc7519#section-4.2).
      "omitted": "for brevity",
    
      // And here can go some private claims you wish to include in the payload, e.g.:
      "sensitiveInfo": {
        "username": "admin",
        "password": "12345",
        "account_balance": 10000,
        "etc": "something else"
      }
    }
    
    Run Code Online (Sandbox Code Playgroud)

    2.2sensitiveInfo有效负载密钥默认情况下仅采用 base64 编码(因此任何获得 JWT 的人都可以轻松读取)。为了确保其安全,您可以使用一些外部模块对其进行加密(例如crypto,或者使用您选择的bcryptNodeJS 或PHP 技术)。

    2.3 在这种情况下:

    • 在 JWT 生成步骤中,您必须先加密密钥的数据,然后再将整个有效负载提供给 JWT 生成器。
    • 在 JWT 验证步骤中,在 JWT 成功通过标准验证(例如Node 中的jsonwebtokenjwt.verify())后,您将获得密钥中包含加密数据的解码后的有效负载sensitiveInfo。您现在只需解密数据并按计划使用它即可。

就是这个。