前端加密

2021/9/27 jQuery

说明

如果是http请求,前端登录的时候用户名、密码都会在互联网上明文传输,很不安全。 所以可使用非对称的RSA加密算法,前端使用公钥加密后传输到后台,后端接收密文后使用私钥解密再进行业务处理

# 准备工作

<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.6.1</version>
</dependency>
1
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

# 前端加密

前端引入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

# 后台解密

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

# 使用总结

  1. 准备好需要的第三方库,前后端各自引入
  2. 生成公钥私钥,公钥存前台私钥存后台
  3. 前端登录功能处向后台传参数时把参数值进行加密
  4. 后台获得参数后调用解密工具类进行解密
  5. 使用解密后的数据进行业务处理等
留言:
    更新日期: 2022/2/8 下午11:10:51