javajs⾮对称加密_RSA⾮对称加密实现
1. 基本原理
1.1 对称加密
基本概念
加密解密都使⽤同⼀个密钥。
缺点
安全问题:⼀旦密钥泄露,传输数据将不会安全
保管问题:每⼀类的数据加密需要重新⽣成⼀个密钥,⼀旦需要传输的数据类型多了,密钥管理就成了⼀个负担
1.2 ⾮对称加密
基本概念
数据传输⽅和接收⽅都拥有⾃⼰的公钥和私钥,他们将公钥暴露出来提供给对⽅加密/解密数据,⾃⼰使⽤⾃⼰的私钥对数据进⾏加密/解密。保证加密和解密使⽤的是不同的密钥,所以叫做⾮对称加密
数据传输过程
传输双⽅AB都需要⽣成⾃⼰的⼀对私钥和公钥
A将数据⽤B提供的公钥将数据进⾏加密,传输给B
B将数据拿到,⽤⾃⼰的私钥对数据进⾏解密。反过来B传数据给A也是⼀样
这个过程保证了解密使⽤的私钥是⾃⼰私有的,对数据解密只能使⽤⾃⼰知道的私钥进⾏解密,这个过程就避免了密钥泄露的问题。
1.3 ⾮对称加密实例(RSA算法)
这⾥⽤登录校验功能展开。
前端通过调⽤后端提供的接⼝获取公钥,在前端对密码进⾏加密后传输给后端
后端通过⾃⼰的私钥对数据进⾏解密,在数据库进⾏校验后保存登录⽤户信息
需要引⽤的包
org.bouncycastle
bcprov-jdk16
1.46
commons-codec
commons-codec
1.10
前端JS
$('#loginButton').click(function(e){
//调⽤后端接⼝获取公钥
$.ajax({
type:'post',
url:'/getPublicKey.do',
data:{},
success:function(publicKey){
//对密码进⾏加密
var encrypt = new JSEncrypt();
encrypt.setPublicKey(publicKey);
that.pt(password));
$('#passwd').submit();
}
})
})
RSA⼯具类
public class RSAUtils {
private static final KeyPair keyPair = initKey();
/**
* 初始化key pair
*
* @return KeyPair
*/
private static KeyPair initKey() {
try {
/
/ 添加provider
Provider provider = new BouncyCastleProvider();
Security.addProvider(provider);
// 随机数⽤于安全加密
SecureRandom random = new SecureRandom();
KeyPairGenerator generator = Instance("RSA", provider); generator.initialize(1024, random);
ateKeyPair();
} catch (Exception e) {
throw new RuntimeException(e);
js代码加密软件}
}
/**
* 产⽣公钥
*
* @return 公钥字符串
*/
public static String generateBase64PublicKey() {
RSAPublicKey publicKey = (RSAPublicKey) Public();
// 使⽤base64算法对⼆进制数据进⾏编码,返回key的原始编码形式
return new Encoded()));
}
/**
* 解密数据
*
* @param arg 需要解密的字符串
* @return 解密后的字符串
*/
public static String decryptBase64(String arg) {
try {
Provider provider = new BouncyCastleProvider();
Security.addProvider(provider);
// Cipher 提供加密和解密功能
Cipher cipher = Instance("RSA/None/PKCS1Padding", provider);
PrivateKey privateKey = Private();
cipher.init(Cipher.DECRYPT_MODE, privateKey);
// doFinal(): 加密或者解密数据
byte[] plainText = cipher.doFinal(Base64.decodeBase64(arg));
return new String(plainText);
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
获取公钥
@RequestMapping("/getPublicKey.do")
public String getPublicKey(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) { try {
PrintWriter writer = Writer();
String publicKey = ateBase64PublicKey();
writer.write(publicKey);
return publicKey;
} catch (Exception e) {
return null;
}
}
解密处理
@RequestMapping("/login.do")
public String login(HttpServletRequest request, HttpServletResponse response) { String account = Parameter("usename");
String passwd = Parameter("passwd");
try {
//解密
passwd = RSAUtils.decryptBase64(passwd);
} catch (Exception e) {
e.printStackTrace();
}
if (account != "" && passwd != "") {
//校验账号密码,成功则保存到session
User user = UserDao.check(account, passwd);
if (user != null) {
session.setAttribute("loginUser", user);
}
}
return "";
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论