admin管理员组文章数量:1574108
RSA加密web前端用户名密码加密传输至后台并解密
编写加解密公共方法类RSAUtils
import org.apachemons.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());
解密这块就不贴所有代码了,就是在后台登录验证方法中,验证之前将从前端拿到的用户名密码解密一下就可以。基本上这样差不多就可以实现前端用户名密码加密之后传输到后台,后台解密的功能了。
版权声明:本文标题:RSA加密web前端用户名密码加密传输至后台并解密 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://www.elefans.com/dongtai/1726165252a1058156.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论