加密 JWT 有效负载

Posted

技术标签:

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

JWT 有 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 吗?

【问题讨论】:

【参考方案1】:

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

JWS JSON Web Signature (RFC 7515), JWT JSON Web Token (RFC 7519), JWE JSON Web Encryption (RFC 7516), JWA JSON Web Algorithms (RFC 7518). JWK JSON Web Key (RFC 7517).

在您的情况下,请阅读 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 ;
    

【讨论】:

以上是关于加密 JWT 有效负载的主要内容,如果未能解决你的问题,请参考以下文章

在验证之前使用 JWT 有效负载

如何使用完全自定义的有效负载制作 JWT

生成 JWT 表单头和有效负载

python jwt中令牌过期时如何提取jwt令牌有效负载

真的有必要在 JWT 中内置有效负载吗?

提取过期 jwt 令牌的有效负载