Encryption 加密JWT有效载荷

Encryption 加密JWT有效载荷,encryption,jwt,Encryption,Jwt,JWT有3个部分: 标题:算法和令牌类型 有效载荷:数据 要使用密钥验证的签名 可以加密有效负载吗?以下是我的令牌的有效负载: { “国际空间站”:“乔”, “exp”:“1300819380”, “数据”:{ “id”:“12”, “用户名”:“PH”, “qntRed”:“7”, “qntGrad”:{ "1": "800", "2": "858", "3": "950", "4": "745", "5": "981" } } 如果“qntGrad”包含敏感数据。我可以使用密钥对其进行加密

JWT有3个部分:

  • 标题:算法和令牌类型
  • 有效载荷:数据
  • 要使用密钥验证的签名
  • 可以加密有效负载吗?以下是我的令牌的有效负载:

    {
    “国际空间站”:“乔”,
    “exp”:“1300819380”,
    “数据”:{
    “id”:“12”,
    “用户名”:“PH”,
    “qntRed”:“7”,
    “qntGrad”:{
    "1": "800",
    "2": "858",
    "3": "950",
    "4": "745",
    "5": "981"
    }
    }
    

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

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

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

    • 受保护标头
    • 加密密钥
    • 初始化向量
    • 密文
    • 认证标签

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

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

    请注意,当您加密时,它将为每个加密调用设置一个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 };
        }
    }
    

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

    嗨,@florent morselli,我会读到关于RFC7516的文章!它真的符合我的需要。顺便说一下,我在后端使用的是
    PHP
    。谢谢你的帮助!不客气。如果你决定使用我的图书馆,现在就让我来。由于文档尚未编写,您可能需要帮助。