Java语言结合android和ios的三端非对称接口加密讲解
小标 2018-11-05 来源 : 阅读 1394 评论 0

摘要:本文主要向大家介绍了Java语言结合android和ios的三端非对称接口加密讲解,通过具体的内容向大家展示,希望对大家学习JAVA语言有所帮助。

本文主要向大家介绍了Java语言结合android和ios的三端非对称接口加密讲解,通过具体的内容向大家展示,希望对大家学习JAVA语言有所帮助。


 

算法:有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频道!


本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 1
看完这篇文章有何感觉?已经有1人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程