JWE全稱是Json Web Encripytion ,即json web 加密,其本身是由一系列標準構成的,本文章講解的是采用軟加密的方式:
JWE加密分為RSA公鑰和EC公鑰兩種模式,RSA公鑰采用的是傳統(tǒng)大質(zhì)數(shù)相乘原理,ECC公鑰為橢圓曲線算法原理;相對來說ECC模式要比RSA模式快;當RSA加密需要的秘鑰長度越來越長時,相應的運算也越來越耗時,這幾乎呈指數(shù)級增長;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實現(xiàn)這一標準的一個類,關于JWE標準的文章可以參照下面的的連接:
http://www.mamicode.com/info-detail-2865896.html
JWEHeader里面有各種各樣的參數(shù),比較重要的有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)