前端
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>JSEncrypt Example</title>
<script src="https://cdn.rawgit.com/spark/crypto-js/master/crypto-js.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jsencrypt/3.0.0/jsencrypt.min.js"></script>
</head>
<body>
<script>
const encrypt = new JSEncrypt();
//从后端请求获取公钥
const publicKey = 'MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtrtCYsDNujsZxemUPUAga4CQ78QT8ImCXk8kkdDi9brJQAGINg1jiMYeQ4NAb5Ct3YMcZLuqVVvlO51tkj8CNOhR93weRH0HPMG51mrF19MFqZOT3Eqr073DkeeenCfgF/YOOcCPalCYYxdPf2bYIZ9ET6tyd04b+uaIzr0GK0B+NPYyurI1VL1T4inD7t38It5EXVbbrOjtUdZq/zmHYU95ONQo23qY5gY45Esq+N2u3rhLlzAsKq0d+elgKfzn2I9vEaqDbaGxGT9Es7owXClDG94GraRkQFYQil9H5/iVJ9oDqVGhEJlRyXx3yrX8oull8WY1n9nSW7h6UbyAoQIDAQAB'
// 设置公钥
encrypt.setPublicKey(publicKey);
// 定义要加密的数据
const password = 'hello world';
// 加密数据,加密后的数据为base64编码的字符串,后端需先解码
const encryptedPassword = encrypt.encrypt(password);
//向后端发起请求
await axios({
url:"http",
data:{
password:encryptedPassword
}
})
// 输出加密后的字符串
console.log(encryptedPassword);
</script>
</body>
后端
包为
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import java.security.*;
import java.util.Base64;
private static final KeyPairGenerator keyPairGen;
private static final KeyPair keyPair ;
private static final PublicKey publicKey ;
private static final PrivateKey privateKey ;
static {
try {
keyPairGen = KeyPairGenerator.getInstance("RSA");
keyPairGen.initialize(2048);
keyPair = keyPairGen.generateKeyPair();
publicKey = keyPair.getPublic();
privateKey = keyPair.getPrivate();
} catch (NoSuchAlgorithmException e) {
throw new RuntimeException(e);
}
}
//获取rsa公钥
public static String getPublicKey(){
return Base64.getEncoder().encodeToString(publicKey.getEncoded());
}
//对获取的rsa密文解码获取密码
public static String decryptRSA(String rawPassword) throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException {
//注意这里一定要指定rsa的加密方式和填充方式为下面的,不然前端加密后的密文解析不了
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
cipher.init(Cipher.DECRYPT_MODE, privateKey);
byte[] bytes = cipher.doFinal(Base64.getDecoder().decode(rawPassword));
return new String(bytes);
}
//获取密码
@GetMapping("/test")
public String test(@RequestBody res r,@RequestParam("raw")String raw) throws NoSuchPaddingException, IllegalBlockSizeException, NoSuchAlgorithmException, BadPaddingException, InvalidKeyException {
return PasswordUtil.decryptRSA(r.getRaw());
}