JWE全称是Json Web Encripytion ,即json web 加密,其本身是由一系列标准构成的,本文章讲解的是采用软加密的方式:
JWE加密分为RSA公钥和EC公钥两种模式,RSA公钥采用的是传统大质数相乘原理,ECC公钥为椭圆曲线算法原理;相对来说ECC模式要比RSA模式快;当RSA加密需要的秘钥长度越来越长时,相应的运算也越来越耗时,这几乎呈指数级增长;ECC模式要比RSA模式好很多,当所需的秘钥长度越来越长时,ECC的cpu消耗是线性增长的。
本文章讲解的是RSA的方式进行jwe的加密。
使用JWE加密时需要引入的maven依赖包:
<dependency>
<groupId>com.nimbusds</groupId>
<artifactId>nimbus-jose-jwt</artifactId>
<version>8.20</version>
</dependency>
需要使用nimbusds提供的JWE加密组件,废话不多说,直接上代码:
private static String jweEncryption(Key publicKey, String payload)
throws Exception {
System.out.println("Payload before encryption :: " + payload);
/*Encryption*/
JWEHeader.Builder builder =
new JWEHeader.Builder(JWEAlgorithm.RSA_OAEP, EncryptionMethod.A128GCM);
builder.keyID("encryptKid");
JWEHeader header = builder.build();
JWEEncrypter encryptedJWE = new RSAEncrypter((RSAPublicKey) publicKey);
JWEObject jweObject = new JWEObject(header, new Payload(payload));
jweObject.encrypt(encryptedJWE);
String serializedJWE = jweObject.serialize();
// System.out.println("Payload after Encryption:: " + serializedJWE);
return serializedJWE;
}
JWE是由系列标准组成的,JWEHeader就是java实现这一标准的一个类,关于JWE标准的文章可以参照下面的的连接:
http://www.mamicode.com/info-detail-2865896.html
JWEHeader里面有各种各样的参数,比较重要的有alg,enc,kid,
alg表示使用的的公钥算法模式,我们使用的是alg=RSA-OAEP;
alg和使用的公钥有关,如果使用的是RSA公钥,alg可以取值:RSA1_5,RSA_OAEP,RSA-OAEP-256;如果使用的是ECC公钥,则取值可能为:A128KW,A192KW,A256KW等
enc表示的是使用的加密分组是多少位,并采用哪种方式,enc=A128GCM,表示使用128位分组的GCM加密方式。
kid用来标识使用的公钥,一般由解密方提供,用来告诉解密方用的哪把秘钥。
最后是JWE加密的输出,JWE加密的输入也是有一系列的标准定义的:一般密文输出都是如下格式:
输出的JWE Compact序列为:BASE64URL(UTF8(JWE Protected Header)) || ’.’ || BASE64URL(JWE Encrypted Key) || ’.’ ||BASE64URL(JWE Initialization Vector) || ’.’ || BASE64URL(JWE Ciphertext) || ’.’ || BASE64URL(JWE Authentication Tag)