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

时间:2017-03-07 15:54:51

标签: json jwt json-web-token

是否可以在JWT中存储用户凭据(用户名/密码)(以后signverify生成的令牌?

heard

  

不,在JWT中发送密码是不安全的。这是因为   JWT索赔只需编码,任何人都可以轻松解码   看到他们。将任何敏感信息存储在a中是不安全的   返回给用户的JWT

但我不知道为什么JWT网站recommends使用它进行身份验证:

  

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

     

以下是JSON Web Tokens非常有用的一些场景:

     

身份验证:这是使用JWT的最常见方案。一旦   用户登录后,每个后续请求都将包含JWT,   允许用户访问的路由,服务和资源   允许使用该令牌。单点登录是一项广泛的功能   现在使用JWT,因为它的开销很小,而且能力很强   容易在不同的领域使用

3 个答案:

答案 0 :(得分:10)

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

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

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

      

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

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

    更正式地说,JWT由以下人员组成:

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

    例如,如果我使用我的凭据用户名:密码为gabriel:giussi向身份验证服务发送请求,它将检查此凭据,如果它们可以,则可以创建以下JWT。 enter image description here

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

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

答案 1 :(得分:2)

您应该仅使用jwt来存储API将使用的令牌。成功登录后将生成令牌,并且可以将其附加到发送到API的任何请求,并且只有令牌有效时才应继续执行所有请求。

答案 2 :(得分:0)

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

  1. 在一般情况下,您不需要将用户凭据保留在JWT中,因为JWT本身就是一个动态生成的凭证,代表了JWT生成时提供的登录名/密码。

    1.1但是,您可以传递的内容不像纯登录名/密码那样敏感,但仍保留在JWT验证时所需的有价值的信息。它可以是用户ID(在sub声明中,如果需要,可以在hashed中输入)或访问级别代码等。

  2. 但是,如果您希望可以通过JWT传递敏感信息。按照下面的步骤,一切都很容易。

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

    {
      // These are registered claims: (see https://tools.ietf.org/html/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://tools.ietf.org/html/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"
      }
    }
    

    2.2默认情况下,sensitiveInfo有效负载密钥仅以base64编码(因此,获得JWT的任何人都可以轻松读取)。为了使其安全,您可以使用某些外部模块(例如,NodeJS上的cryptobcrypt或您选择的PHP's techniques)对其进行加密。

    2.3在这种情况下:

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

就这样。