JWE(Json Web Encryption),可以理解为JSON格式的网络加密,有以下几个特点:
- 整个数据分为5端,每段都用"."隔开,形如:
eyJhbGciOiJSU0EtT0FFUCIsImVuYyI6IkEyNTZHQ00ifQ.
OKOawDo13gRp2ojaHV7LFpZcgV7T6DVZKTyKOMTYUmKoTCVJRgckCL9kiMT03JGe
ipsEdY3mx_etLbbWSrFr05kLzcSr4qKAq7YN7e9jwQRb23nfa6c9d-StnImGyFDb
Sv04uVuxIp5Zms1gNxKKK2Da14B8S4rzVRltdYwam_lDp5XnZAYpQdb76FdIKLaV
mqgfwX7XWRxv2322i-vDxRfqNzo_tETKzpVLzfiwQyeyPGLBIO56YJ7eObdv0je8
1860ppamavo35UgoRdbYaBcoh9QcfylQr66oc6vFWXRcZ_ZT2LawVCWTIy3brGPi
6UklfCpIMfIjf7iGdXKHzg.
48V1_ALb6US04U3b.
5eym8TW_c8SuK0ltJ3rpYIzOeDQz7TALvtu6UG9oMo4vpzs9tX_EFShS8iB7j6ji
SdiwkIr3ajwQzaBtQD_A.
XFBoMYUZodetZdvTiFvSkQ
- 每段数据都是以Base64UrlEncode编码的数据 jwe序列化的数据包括5段,内容分别如下:
BASE64URL(UTF8(JWE Protected Header)) || '.' ||
BASE64URL(JWE Encrypted Key) || '.' ||
BASE64URL(JWE Initialization Vector) || '.' ||
BASE64URL(JWE Ciphertext) || '.' ||
BASE64URL(JWE Authentication Tag)`
整个JWE数据共有3部分需要进行加密,分别为:密钥的加密,密文的加密和数字认证码的生成,在生成JWE数据之前,我们首先要对这三种算法进行指定。
JWE是通过JWE Header来进行相应算法的指定说明。其格式如下:
{"alg":"RSA1_5","enc":"A128CBC-HS256"}
Step1.选择算法,生成JWE Header
Step2.生成密钥并加密密钥,得到Encrypted Key
Step3.生成向量数据,得到Initialization Vector
Step4.加密原始报文,得到Cipher text
Step5.生成认证码,得到Authentication Tag
Step6.拼接数据,得到JWE Object
根据上文的加密过程,我们来具体介绍每一步的使用:
此版本密钥加密我们选择RSA,padding方式为:pkcs1-v1_5的加密方法,密文我们选择AES128CBC加密,而认证码的生成则选择HMAC With SH256
JWEHeader为:{"alg":"RSA1_5","enc":"A128CBC-HS256"}
header := NewHeader(ALG_RSA1_5, ENC_A128CBC_HS256)
jsonHeader, err := utils.JsonEncode(header)
随机生成一组AES的Key,然后用RSA进行加密
rsa := rsa.EncryptionMethodRSA{}
publickey, _ := rsa.GetPublicKey()
key, RasKey := jwe.GetEncryptedKey(header, 16, publickey)
参数
header: Step1生成的JWE Header
size:AES加密的密钥长度
key:对密钥进行RSA加密的publicKey
return:aesKey和RsaKey
随机生成一组向量数据(这里为了方便,与Step4合并了)
利用Step2的密钥和Step3的向量数据,将原始报文进行AES加密
cipher, Iv := jwe.GetCipherText(header, []byte(plant), key)
参数
header: Step1生成的JWE Header
plant:原始报文
key:step2得到的aesKey
return:密文和Iv数据向量
用"."的方式将Step2的加密密钥,Step3的向量数据,Step4的密文进行拼接,然后得到认证码
Atag := jwe.GetAuthenticationTag(header, []string{string(RasKey), string(Iv), string(cipher)}, key)
参数
header: Step1生成的JWE Header
args:Step2的加密密钥,Step3的向量数据,Step4的密文组成的数组
key:进行Hmac加密的Key
return:生成的认证码
把以上5个步骤的数据进行Base64UrlEncode,然后按照顺序拼接,用"."分割,得到最后的数据。
jw := jwe.GetJWE(args)
参数
args:以上5的步骤的数据
return:以Base64Base64UrlEncode编码的JWE Object
- JWE是一个数据加解密协议(protocol),是一种流程和数据结构的规范
- JWE有着非常强的定制性和可扩展性。
开发者可以根据自己的需要,选择适合的算法对数据进行JWE加解密
后续还会增加其他的算法。