算法:有rsa及aes算法
Java端处理方式:
入参处理方式
1、参数通过request.getParameter获取的话,可以通过自己定义一个filter来进行处理。
定义两个类,分别继承HttpServletRequestWrapper及Filter,将该filter配置到web.xml里面,在其他filter前面,以免影响程序获取参数的调用
public class SafeTextRequestWrapper extends HttpServletRequestWrapper {
public SafeTextRequestWrapper(HttpServletRequest req) {
super(req);
}
@Override
public Map getParameterMap() {
Map paramMap=super.getParameterMap();
for (String[] values : paramMap.values()) {
for (int i=0; i < values.length; i++) {
values[i]=SensitiveUtil.filter(values[i]);
}
}
return paramMap ;
}
@Override
public String getParameter(String name) {
//这里就是对request请求获取的参数进行解密
return SensitiveUtil.filter(super.getParameter(name));
}
}
public class SafeTextFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
SafeTextRequestWrapper safeTextRequestWrapper=new SafeTextRequestWrapper((HttpServletRequest) request);
chain.doFilter(safeTextRequestWrapper, response);
}
@Override
public void destroy() {
}
}
2、参数如果是调用接口的入参,那么可以通过aop的around注解的方式进行处理
@Around("webLog()")
public Object aroundMethod(ProceedingJoinPoint pjd) {
Object result=null;
HttpServletRequest request=((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
Object[] args=pjd.getArgs(); // 获取目标对象方法参数
if (args.length > 0) {
//对入参进行解密,这块主要是针对方法里面的参数处理的
for (int i=0; i < args.length; i++) {
if (args[i] instanceof String) {
try {
args[i]=AES.decrypt(args[i].toString(), key);
} catch (Exception e) { // 使用异常机制来验证 log.error("SystemLogs解密参数错误" + args[i], e);
}
}
}
}
try {
// 记录方法开始执行时间
long startTime=System.currentTimeMillis();
result=pjd.proceed(args);
// 记录方法结束执行时间,及写入到数据库
long E_time=System.currentTimeMillis() - startTime;
String methodName=pjd.getSignature().getDeclaringTypeName() + "." + pjd.getSignature().getName() + "()";
//将方法的执行时间记入到数据库
logsService.saveSysLogs(request, E_time + "ms");
// 对结果进行加密处理
Map map=new HashMap();
map.put("result", AES.encrypt(JSON.toJSONString(result), key));
map.put("end","ok");
return map;
} catch (Throwable throwable) {
log.error(throwable.toString());
}
return result;
}
Java加解密方案到此为止
-----------------------------------------------------------------------
Ios加解密方案:
加密流程:
APP:代码随机生成16位字符串的key,用这个二手游戏转让平台key对加密内容进行AES加密
把随机生成的16位key用RSA公钥加密
把加密的key 和 加密的内容两个部分 传到后台
后台Java:
收到两个部分的东西,一个是加密的key,一个是加密的内容
用RSA私钥解密key,得到key
用key解密用AES加密的内容,得到请求的信息
操作流程:
通过OpenSSL生成私钥和公钥
根据生成的公钥找到公钥字符串
#define pubkey @"-----BEGIN PUBLIC KEY-----MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwgsVWu7N9gpH4/V65WjiU+D0KkLE94uOmaChU/waE1LvOOOl4jzvbeXtFzILsbAaeZnT6xR/M7LEV3Kx8YyQk1/IhxR8D8jG64p6Y5gaQlji2QkG6qBrvXN8zhqb4qhEGsVmVAnEhJnICF2Z9pdfak/yE8IV4hOd7aXywNHkOT1PVVsUM8PMXdWa2tSJIGGleRhNilH2pI780enBJGOiLiZj4j6BZZhpfht8a7QV2Vxb6SiIthdOCeWeCmGXQvekmJNlbxDybA6kqH6qfL/Y/vk2xeRLxPYx6WQIDAQAB-----END PUBLIC KEY-----"
1、 首先随机生成16位字符串,作为AES加密的key
NSString *key=[SecurityUtil randomlyGenerated16BitString];
2、 用AES的KEY 加密传输内容
NSString * encryptString=[SecurityUtil encryptAESData:paramstring withKey:key];
3、 用RSA加密 AES的key
NSString * encWithPubKey=[RSA encryptString:key publicKey:pubkey];
4、 把加密的key 和 加密的内容发给后台服务器
[dic setObject: encryptString forKey:@"parameters"];
[dic setObject:encWithPubKey forKey:@"key"];
Android加解密方案:
1、 加载公钥
String public Key="DvhHR9zS3n91VP9uG7Nv08S2uFipntadwdeILsbAaeZnT6xR/M7LEV3Kx8YyQk1/IhxR8D8jG64p6Y5gaQlji2QkG6qBrvXN8zhqb4qhEGsVmVAnEhJnICF2Z9pdfak/yE8IV4hOd7aXywNHkOT1PVVsUM8PMXdWa2tSJIGGleRhNilH2pI780enBJGOiLiZj4j6BZZhpfht8a7QV2Vxb6SiIthdOCeWeCmGXQvekmJNlbxDybA6kqH6qfL/Y/vk2xeRLxPYx6WQIDAQAB";
2、 生成一个16位随机字符串作为AES的key
strRand="" ;
for(int i=0;i<16;i++){
strRand +=String.valueOf((int)(Math.random() * 10)) ;
}
3、 用AES 加密内容
String encryptContent=AESOperator.encrypt(content, strRand);
4、 用RSA公钥对key加密
String key=RSAUtils.encryptData(strRand);
5、 用key对AES解密
String decrypt=AESOperator.decrypt(content, strRand);