需求分析
有些接口传参时会对敏感信息进行加密处理,如常见的登陆接口中的账号、密码,其中常见的加密方式有RSA加密,RSA加密的原理此处不再赘述,因此需要通过代码实现对所需要加密的字符串进行加密并返回加密后的结果,其中公钥通过接口来自动获取。
语言选择
起初考虑使用python处理加密,实现过程中发现MeterSphere平台使用的内置的python解释器使用第三方库需要借助 Virtualenv 较为繁琐,所以这里我们选择使用Java语言实现。
代码实现
代码结构
|com.chenguoxin
|----GetApi.java
|----RsaEncrypy.java
|--lib
| json.jar
| commons-codec-1.15.jar
具体代码
RsaRncrypt.java
package com.chenguoxin;
import org.apache.commons.codec.binary.Base64;
import java.security.interfaces.RSAPublicKey;
import javax.crypto.Cipher;
import java.security.KeyFactory;
import java.security.spec.X509EncodedKeySpec;
public class RsaEncrypt {
public String RSAjiami(String mingwen) {
//解密数据
String encryptStr = null;
try {
//生成公钥和私钥
String publicKey = GetApi.getPublicKey();
String orgData = mingwen;
encryptStr = encrypt(orgData, publicKey);
// System.out.println("加密结果:" + encryptStr);
} catch (Exception e) {
e.printStackTrace();
}
return encryptStr;
}
/**
* RSA公钥加密
*
* @param str 加密字符串
* @param publicKey 公钥
* @return 密文
* @throws Exception 加密过程中的异常信息
*/
public static String encrypt(String str, String publicKey) throws Exception {
//base64编码的公钥
byte[] decoded = decryptBASE64(publicKey);
RSAPublicKey pubKey = (RSAPublicKey) KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec(decoded));
//RSA加密
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE, pubKey);
String outStr = encryptBASE64(cipher.doFinal(str.getBytes("UTF-8")));
return outStr;
}
//编码返回字符串
public static String encryptBASE64(byte[] key) throws Exception {
return (Base64.encodeBase64String(key));
}
//解码返回byte
public static byte[] decryptBASE64(String key) throws Exception {
return (Base64.decodeBase64(key));
}
}
GetApi.java
package com.chenguoxin;
import java.net.*;
import java.io.*;
import org.json.*;
public class GetApi {
public static String getPublicKey() {
String data = null;
try {
// 创建URL对象
URL url = new URL("获取公钥接口地址");
// 打开连接
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
// 设置请求方法为GET
connection.setRequestMethod("GET");
// 获取响应结果
InputStream responseStream = connection.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(responseStream));
StringBuilder responseBuilder = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
responseBuilder.append(line);
responseBuilder.append("\n");
}
reader.close();
String response = responseBuilder.toString();
// 解析JSON数据
JSONObject jsonResponse = new JSONObject(response);
int code = jsonResponse.getInt("code");
if (code == 0) {
data = jsonResponse.getString("data");
}
// 关闭连接
connection.disconnect();
} catch (Exception e) {
e.printStackTrace();
}
return data;
}
}
BeanShell脚本
import com.chenguoxin.RsaEncrypt;
String user = "user";//需要加密的字段1
String pwd = "pwd";//需要加密的字段2
RsaEncrypt jiami = new RsaEncrypt();//创建对象
String rsa_user = jiami.RSAjiami(user);//获取加密user后的密文
String rsa_pwd = jiami.RSAjiami(user);//获取加密pwd后的密文
vars.put("rsa_user", rsa_user)//设置加密后的user密文为全局变量
vars.put("rsa_pwd", rsa_pwd)//设置加密后的pwd密文为全局变量
踩过的坑
在项目中,设计到64位编码的。有时开发会用到JDK中自带的BASE64工具。但sun公司是建议不这样做的。尤其是更新了JDK版本,项目甚至还存在保存的信息。
可引用 import org.apache.commons.codec.binary.Base64;进行替换
编码部分替换: BASE64Encoder base64encoder = new BASE64Encoder(); return base64encoder.encode(xxx); 替换为 Base64 base64encoder = new Base64(); return base64encoder.encodeBase64String(xxx); 同理解码部分替换为 Base64 base64decoder = new Base64(); byte[] bytes = base64decoder.decodeBase64(str);