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

在线体验各类最新模型,更有模型 免费Token 额度领取!
立即体验
简介:   算法:有rsa及aes算法  Java端处理方式:  入参处理方式  1、参数通过request.getParameter获取的话,可以通过自己定义一个filter来进行处理。  定义两个类,分别继承HttpServletRequestWrapper及Filter,将该filter配置到web.xml里面,在其他filter前面,以免影响程序获取参数的调用  public class SafeTextRequestWrapper extends HttpServletRequestWrapper {  public SafeTextRequestWrapper(H

  算法:有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);

目录
相关文章
|
11月前
|
数据采集 JSON Java
Java爬虫获取1688店铺所有商品接口数据实战指南
本文介绍如何使用Java爬虫技术高效获取1688店铺商品信息,涵盖环境搭建、API调用、签名生成及数据抓取全流程,并附完整代码示例,助力市场分析与选品决策。
|
10月前
|
算法 安全 Java
除了类,Java中的接口和方法也可以使用泛型吗?
除了类,Java中的接口和方法也可以使用泛型吗?
278 11
|
9月前
|
Java Go 开发工具
【Java】(9)抽象类、接口、内部的运用与作用分析,枚举类型的使用
抽象类必须使用abstract修饰符来修饰,抽象方法也必须使用abstract修饰符来修饰,抽象方法不能有方法体。抽象类不能被实例化,无法使用new关键字来调用抽象类的构造器创建抽象类的实例。抽象类可以包含成员变量、方法(普通方法和抽象方法都可以)、构造器、初始化块、内部类(接 口、枚举)5种成分。抽象类的构造器不能用于创建实例,主要是用于被其子类调用。抽象类中不一定包含抽象方法,但是有抽象方法的类必定是抽象类abstract static不能同时修饰一个方法。
359 1
|
11月前
|
存储 缓存 安全
Java集合框架(二):Set接口与哈希表原理
本文深入解析Java中Set集合的工作原理及其实现机制,涵盖HashSet、LinkedHashSet和TreeSet三大实现类。从Set接口的特性出发,对比List理解去重机制,并详解哈希表原理、hashCode与equals方法的作用。进一步剖析HashSet的底层HashMap实现、LinkedHashSet的双向链表维护顺序特性,以及TreeSet基于红黑树的排序功能。文章还包含性能对比、自定义对象去重、集合运算实战和线程安全方案,帮助读者全面掌握Set的应用与选择策略。
1311 23
|
11月前
|
安全 Java 开发者
Java集合框架:详解Deque接口的栈操作方法全集
理解和掌握这些方法对于实现像浏览器后退功能这样的栈操作来说至关重要,它们能够帮助开发者编写既高效又稳定的应用程序。此外,在多线程环境中想保证线程安全,可以考虑使用ConcurrentLinkedDeque,它是Deque的线程安全版本,尽管它并未直接实现栈操作的方法,但是Deque的接口方法可以相对应地使用。
529 12
|
11月前
|
存储 安全 Java
Java集合框架(一):List接口及其实现类剖析
本文深入解析Java中List集合的实现原理,涵盖ArrayList的动态数组机制、LinkedList的链表结构、Vector与Stack的线程安全性及其不推荐使用的原因,对比了不同实现的性能与适用场景,帮助开发者根据实际需求选择合适的List实现。
1221 0
|
11月前
|
Java API 网络架构
java调用api接口自动判断节假日信息
java调用api接口自动判断节假日信息
3787 0
|
Java
Java接口和抽象类
Java接口和抽象类
293 0
|
设计模式 搜索推荐 Java
java接口和抽象类的区别,以及使用选择
java接口和抽象类的区别,以及使用选择
307 0
|
设计模式 Java
【惊天揭秘】Java编程绝技大曝光:接口、抽象类、静态类与非静态类的神秘面纱终被揭开!
【8月更文挑战第22天】Java支持面向对象编程,通过接口、抽象类、静态类(如枚举与工具类)及普通类实现设计原则。接口定义行为规范,允许多重继承;抽象类含未实现的抽象方法,需子类完成;静态类常为工具类,提供静态方法;普通类则实例化对象。恰当运用这些结构能提升程序质量。
254 2