在Web项目中有些时候需要对传输的数据加密后再传输到服务端进行解密使用,这里采用RSA进行公钥加密 私钥解密的模式会有较高的安全性。
这里选用的工具库是 JSEncrypt.js 与 javax.crypto.Cipher
一、获取公钥与私钥
这里直接使用 JSEncrypt.js 来生成最初的公钥与私钥即可,在浏览器控制台中输入下面代码获取结果
1 var crypt = new JSEncrypt(); 2 var publicKey = crypt.getPublicKey(); 3 var privateKey = crypt.getPrivateKey(); 4 console.log("publickKey",publickKey); 5 console.log("privateKey",privateKey);
二、转换私钥格式
由于Java中使用的密钥格式是 PKCS8 而 JSEncrypt.js 生成的私钥是 PKCS#1 格式,所以需要进行格式转换,这里用到一个在线转换工具http://tool.chacuo.net/cryptrsapkcs1pkcs8 进行私钥格式转换。
前端加密数据
1 var publicKey = "RSA PUBLIC KEY";//前面生成的公钥字符串 2 var crypt = new JSEncrypt(); 3 crypt.setPublicKey(publicKey); 4 crypt.encrypt(value);
三、后端解密数据
1 import javax.crypto.Cipher; 2 import java.security.KeyFactory; 3 import java.security.spec.PKCS8EncodedKeySpec; 4 import java.util.Base64; 5 6 public class RSAUtils { 7 private static Cipher cipher = null; 8 public static String decoder(String password) throws Exception { 9 if (cipher == null) { 10 String privateKey = "RSA PRIVATE KEY";//前面转换后PKCS8格式私钥 11 cipher = Cipher.getInstance("RSA"); 12 String privateKeyPEM = privateKey.replace("-----BEGIN PRIVATE KEY-----", "") 13 .replace("-----END PRIVATE KEY-----", "") 14 .replaceAll("\\s", ""); 15 byte[] privateKeyByte = Base64.getDecoder().decode(privateKeyPEM); 16 cipher.init(Cipher.DECRYPT_MODE, KeyFactory.getInstance("RSA").generatePrivate(new PKCS8EncodedKeySpec(privateKeyByte))); 17 } 18 byte[] passwordByte = Base64.getDecoder().decode(password); 19 return new String(cipher.doFinal(passwordByte)); 20 } 21 }