前端加密
微冷 2021/9/27 jQuery
说明
如果是http请求,前端登录的时候用户名、密码都会在互联网上明文传输,很不安全。 所以可使用非对称的RSA加密算法,前端使用公钥加密后传输到后台,后端接收密文后使用私钥解密再进行业务处理
# 准备工作
- 下载前端加密使用的第三方库jsencrypt (opens new window):https://www.bootcdn.cn/jsencrypt/
- 下载后端解密使用的第三方库hutool (opens new window)https://repo1.maven.org/maven2/cn/hutool/hutool-all/5.6.1 或者使用maven库
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.6.1</version>
</dependency>
1
2
3
4
5
2
3
4
5
或者Gradle
compile 'cn.hutool:hutool-all:5.6.1'
1
- 生成密钥
@Test
public void RSATest() {
RSA rsa = new RSA();
//获得私钥,存放在后端(不要公开)
rsa.getPrivateKey();
String pk = rsa.getPrivateKeyBase64();
System.out.println("私钥:" + pk);
//获得公钥,放到前端进行加密使用(可公开)
rsa.getPublicKey();
String puk = rsa.getPublicKeyBase64();
System.err.println("公钥:" + puk);
}
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
# 前端加密
前端引入jquery和jsencrypt,设置公钥并封装加密算法,示例如下
<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.5.1/jquery.js"></script>
<script src="http://passport.cnblogs.com/scripts/jsencrypt.min.js"></script>
<script type="text/javascript">
//设置不可变量公钥
const PUBLICKEY = 'MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCdx4o8f3qH0+vyv1yRgYxTncsvm35mbHIl/fciXXMTSuTp12isObM49ip96nl1wjOeDzbuadFyJ9+0gdh5yLovdXHcAaBsHjd7jaNEV2nYVamz3HZIkfcWJm870ryPzCANrrFWGsTT1iEq2T2ih/0ZQANYzDAczJfEHYn3FpHyUwIDAQAB';
/**
* 加密方法
* @param str: 要加密的数据
* @param publickey:加密公钥,默认使用共有的
*/
function encrypt(str, publickey = PUBLICKEY) { //publickey如果不传则使用PUBLICKEY
let encrypt = new JSEncrypt(); //使用let,没有使用var,区别自查
encrypt.setPublicKey(publickey); //使用给定的公钥构造加密工具
let data = encrypt.encrypt(str); //加密数据
//console.log(data);
return data;
});
</script>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 后台解密
RSA加解密使用说明 (opens new window),示例如下:
package com.biupia.utils;
import cn.hutool.core.codec.Base64;
import cn.hutool.core.util.CharsetUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.crypto.asymmetric.KeyType;
import cn.hutool.crypto.asymmetric.RSA;
/**
* RSA加密工具类
* @author fyd
*/
public class RSAUtil {
/**
* 解密RSA
* @param str 密文
* @return 明文
*/
public static String decrypt(String str){
//根据私钥构造rsa
RSA rsa = new RSA(PRIVATE_KEY, null);
//将加密字符转成字节数组
byte[] bytes = Base64.decode(str);
//解密
byte[] decrypt = rsa.decrypt(bytes, KeyType.PrivateKey);
return StrUtil.str(decrypt, CharsetUtil.CHARSET_UTF_8);
}
//私钥,后台使用私钥解密
private static final String PRIVATE_KEY = "MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAJ3Hijx/eofT6/K/XJGBjFOdyy+bfmZsciX99yJdcxNK5OnXaKw5szj2Kn3qeXXCM54PNu5p0XIn37SB2HnIui91cdwBoGweN3uNo0RXadhVqbPcdkiR9xYmbzvSvI/MIA2usVYaxNPWISrZPaKH/RlAA1jMMBzMl8QdifcWkfJTAgMBAAECgYB31mP/eU+mtOakNIZpmfzsUZBPM4o43yuAAbpgZpwNzje6CLte/GBM5mP1yU7Bi2RLLAEr6kGDtBdscabrMPN/+/xRJRWGMwKo8aOa7N57U2CmGKcjvXuRKHWBZfgt5XgfJAwwpPhBFMdzMGzMmL2Q/6AhfwrksP5DdtkjOqdXcQJBAPGBjmaQCLwk73FTfpZvmZpNOjBmSB+/BcAfHD5rtmX5KLXabFMIdgLWfjR3KwrAF3RRL8mGCXHLdGVXBv7naAsCQQCnP6CMiCKJxtKrj2c0IDQ9suZgeGwDPOu8S1n4Rq/9anmBHDdDTPB53mPXQ3c6srmdExVXycsgursBekPOG+PZAkBJid3GtU0znTucEoSVYl4vchyp6DtGD3C807xR9ZKQ8pHG7j/V+NmWe6Hqb+8XUu7RaHdYsgvmLsG+qgVjUSuJAkEAmEyRh8dkJDCAoSeqJEZ7LAAgV5LxURWF2WaInFTKaCswUAkArfF/PorsQhc2mKYt7kJ1egbRSZGhP1w2KJcvKQJAKtT5TuRYcMKXIBvhIWsxuGTsrW4ukefhB0ipiZgd1Cbv3boDIfQ/wPwt4at1vthVMAsYfxtITor1mSf6pOs+Zw==";
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# 使用总结
- 准备好需要的第三方库,前后端各自引入
- 生成公钥私钥,公钥存前台,私钥存后台
- 前端登录功能处向后台传参数时把参数值进行加密
- 后台获得参数后调用解密工具类进行解密
- 使用解密后的数据进行业务处理等
留言: