您的位置 首页 java

java结合android和ios的三端非对称接口加密讲解

算法:有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<String, String[]> getParameterMap() {

Map<String, String[]> 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<String, String> map = new HashMap<String, String>();

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);

文章来源:智云一二三科技

文章标题:java结合android和ios的三端非对称接口加密讲解

文章地址:https://www.zhihuclub.com/184767.shtml

关于作者: 智云科技

热门文章

发表回复

您的电子邮箱地址不会被公开。

网站地图