JWT加密有效载荷信息

时间:2015-12-07 15:08:12

标签: encryption jwt

我是JWT技术的新手,我正在阅读很多相关内容。

我知道JWT有3个部分:

  1. HEADER:ALGORITHM& TOKEN TYPE
  2. PAYLOAD:DATA
  3. 使用秘密密钥验证的签名
  4. 是否可以加密有效负载信息?我的意思是,让我们说我的令牌中有这个有效载荷信息:

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

    让我们说" qntGrad"是敏感信息。是否可以使用密钥对其进行加密?它仍然是JWT令牌吗?

3 个答案:

答案 0 :(得分:16)

事实上,不仅签署了JWT,还有RFC描述的几种技术:

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

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

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

答案 1 :(得分:-1)

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

答案 2 :(得分:-2)

以下是使用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 };
    }
}

}