【问题标题】:Encrypting JWT payload加密 JWT 有效负载
【发布时间】:2016-03-12 05:52:15
【问题描述】:

JWT 有 3 个部分:

  1. 标题:算法和令牌类型
  2. 有效负载:数据
  3. 要使用密钥验证的签名

是否可以加密有效载荷?以下是我的令牌的有效负载:

{
"iss": "joe",
"exp": "1300819380",
"data": {
    "id": "12",
    "userName": "PH",
    "qntRed": "7",
    "qntGrad": {
        "1": "800",
        "2": "858",
        "3": "950",
        "4": "745",
        "5": "981"
    }
}

如果“qntGrad”包含敏感数据。我可以使用密钥对其进行加密吗?它仍然是有效的 JWT 吗?

【问题讨论】:

    标签: encryption jwt


    【解决方案1】:

    实际上不仅有签名的 JWT,还有 RFC 描述的几种技术:

    在您的情况下,请阅读 RFC7516 (JWE)。这些 JWE 有 5 个部分:

    • 受保护的标头
    • 加密密钥
    • 初始化向量
    • 密文
    • 身份验证标签

    根据您的平台,您可能会找到一个库来帮助您创建此类加密的 JWT。关于PHP,我正在写a library,它已经能够加载和创建这些jose。

    【讨论】:

    • 嗨,@florent-morselli,我将阅读有关 RFC7516 的信息!它真的很适合我的需要。顺便说一句,我在后端使用PHP。感谢您的帮助!
    • 不客气。如果你决定使用我的图书馆,现在让我来。由于文档尚未编写,您可能需要帮助。
    【解决方案2】:

    不加密令牌意味着其他外部服务可以读取并验证令牌实际上是真实的,而无需访问您的私钥。 (他们只需要公钥)

    【讨论】:

      【解决方案3】:

      下面是一个非常简单有效的使用 AES 加密的方法。请注意,您需要获取自己的密钥(链接包含在 cmets 中)。

      请注意,当您加密时,它会为每个加密调用设置一个 IV。您将需要它来解密。

      public class CustomEncryption
      {
          public static string Encrypt256(string text, byte[] AesKey256, out byte[] iv)
          {
              // AesCryptoServiceProvider
              AesCryptoServiceProvider aes = new AesCryptoServiceProvider();
              aes.BlockSize = 128;
              aes.KeySize = 256;
              aes.Key = aesKey256();
              aes.Mode = CipherMode.CBC;
              aes.Padding = PaddingMode.PKCS7;
              iv = aes.IV;
      
              byte[] src = Encoding.Unicode.GetBytes(text);
      
              using (ICryptoTransform encrypt = aes.CreateEncryptor())
              {
                  byte[] dest = encrypt.TransformFinalBlock(src, 0, src.Length);
      
                  return Convert.ToBase64String(dest);
              }
          }
      
          public static string Decrypt256(string text, byte[] AesKey256, byte[] iv)
          {
              AesCryptoServiceProvider aes = new AesCryptoServiceProvider();
              aes.BlockSize = 128;
              aes.KeySize = 256;
              aes.IV = iv;
              aes.Key = aesKey256();
              aes.Mode = CipherMode.CBC;
              aes.Padding = PaddingMode.PKCS7;
      
              byte[] src = System.Convert.FromBase64String(text);
      
              using (ICryptoTransform decrypt = aes.CreateDecryptor())
              {
                  byte[] dest = decrypt.TransformFinalBlock(src, 0, src.Length);
                  return Encoding.Unicode.GetString(dest);
              }
          }
      
          private static byte[] aesKey256()
          {
              //you will need to get your own aesKey
              //for testing you can generate one from
              //https://asecuritysite.com/encryption/keygen
      
              return new byte[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9, 1, 2, 3, 4, 5 };
          }
      }
      

      }

      【讨论】:

        猜你喜欢
        • 2020-06-17
        • 2020-08-03
        • 2020-05-31
        • 1970-01-01
        • 2021-07-09
        • 1970-01-01
        • 2016-05-29
        • 2019-10-29
        • 2017-01-02
        相关资源
        最近更新 更多