网页抓取解密( 编写加解密公共方法类RSAUtils前端传输过来的密文进行解密)
优采云 发布时间: 2021-10-18 12:14网页抓取解密(
编写加解密公共方法类RSAUtils前端传输过来的密文进行解密)
RSA加密web前端用户名密码加密传输到后台解密
编写加解密公共方法类RSAUtils
import org.apache.commons.codec.binary.Base64;
import javax.crypto.Cipher;
import java.security.*;
import java.security.interfaces.RSAPublicKey;
public class RSAUtils {
private static final KeyPair keyPair = initKey();
private static KeyPair initKey() {
try {
Provider provider =new org.bouncycastle.jce.provider.BouncyCastleProvider();
Security.addProvider(provider);
SecureRandom random = new SecureRandom();
KeyPairGenerator generator = KeyPairGenerator.getInstance("RSA", provider);
generator.initialize(1024,random);
return generator.generateKeyPair();
} catch(Exception e) {
throw new RuntimeException(e);
}
}
public static String generateBase64PublicKey() {
PublicKey publicKey = (RSAPublicKey)keyPair.getPublic();
return new String(Base64.encodeBase64(publicKey.getEncoded()));
}
public static String decryptBase64(String string) {
return new String(decrypt(Base64.decodeBase64(string.getBytes())));
}
private static byte[] decrypt(byte[] byteArray) {
try {
Provider provider = new org.bouncycastle.jce.provider.BouncyCastleProvider();
Security.addProvider(provider);
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding", provider);
PrivateKey privateKey = keyPair.getPrivate();
cipher.init(Cipher.DECRYPT_MODE, privateKey);
byte[] plainText = cipher.doFinal(byteArray);
return plainText;
} catch(Exception e) {
throw new RuntimeException(e);
}
}
}
前端向后端发起登录请求前,首先请求后端方法获取公钥
var publicKey = null;
$.ajax({
url: "xxx",
type: "post",
dataType: "text",
success: function(data) {
var encrypt = new JSEncrypt();
if(data){
publicKey = data;
};
if(publicKey==null){
$("#msg").html("获取publicKey失败,请联系管理员!");
$("#login-btn").removeAttr("disabled");
return;
};
}
});
后台公钥生成方法
@RequestMapping(value = "/xxxx", method = RequestMethod.POST)
public String getKey(HttpServletRequest request){
String publicKey = RSAUtils.generateBase64PublicKey();
return publicKey;
}
前端引入jsencrypt.min.js文件。这些js文件网上有很多,大家可以随意搜索,我就不贴了。
用公钥加密用户名和密码
encrypt.setPublicKey(publicKey);
var username;
var password;
username = encrypt.encrypt(vm.username.trim());
password = encrypt.encrypt(vm.password.trim());
下一步是用加密后的用户名和密码请求后台
$.ajax({
type: "POST",
url: "xxxxxx",
data: {
"username":username,
"password":password,
},
dataType: "json",
success: function (result) {
if (result.code == 0) {//登录成功
parent.location.href = 'index.html';
} else {
vm.error = true;
vm.errorMsg = result.msg;
vm.refreshCode();
}
}
});
请求成功后,不需要看代码的处理方式,根据自己的需要进行处理即可。这里要强调的是,传输用户名和密码时,不要通过字符串拼接传输,以免后台接收到密文解析时,密文中的+号会被替换为空格,从而导致密文解析错误。地主差点被杀在这里。. . . . .
下一步就是在后台接收前端传来的密文进行解密
username = RSAUtils.decryptBase64(username.trim());
password = RSAUtils.decryptBase64(password.trim());
解密这块,我们就不贴全部代码了,即在后台登录认证方式中,验证前从前端获取的用户名和密码就可以解密了。基本上可以实现对前端用户名和密码进行加密传输到后端和后端解密的功能。