android接口加密

   最近公司写的android接口需要加密,防止被恶意攻击。

1 大多数接口加密都是携带证书,大家可以参考这位大兄弟的  http://my.oschina.net/jjface/blog/339144

2 这种携带证书比较麻烦,而且代码比较多,比较繁琐一般同学都搞不定,所以就想了个简单的办法,传两个参数,一个是string类型的另一种是MD5加密的密文,在服务端写个拦截器/或者过滤器去拦截他,然后做自己相应的逻辑处理,把string类型的字段拿过来加上其他一些东西,用MD5加密和传过来的密文做相应的比较。

3 下面就是重点了,最开始的时候我想到的使用拦截器对url进行拦截,然后做处理,但是我们的服务端不只是对android提供服务接口,还有一些内部的请求,可有时我们的接口是rest风格的,使用resteasy写的,他的请求方式和springmvc又不太一样,

  @Component
  @Path("services")
  @Produces({ "application/json"})
  @Consumes({ "application/json" })

这种风格的,但是spring的请求是这种风格的

@Controller

  @RequestMapping(value = "/../..")

拦截器配置

 <mvc:interceptors>
        <mvc:interceptor>
            <mvc:mapping path="/services/**"/>
            <bean class="*.MyInterceptor"></bean>
        </mvc:interceptor>
    </mvc:interceptors>但是这样配置com.zk.interceptors.MyInterceptor 实现了 HandlerInterceptor接口,可以拦截@RequestMapping注解的类和方法这样无法拦截,最后想的办法是
      <mvc:interceptors>
            <bean class="*.MyInterceptor"></bean>
           </mvc:interceptors>这样把所有的url进行拦截,然后在拦截器自己手动过滤掉不需要拦截的url,对拦截的进行处理,但是最后一想这样是对所有url进行拦截,肯定对系统的效率有所影响,

4然后想到的是利用切面,自己写个切面,配置切入点,利用切面的 @Before("execution(* *.*(..))") 通知进行处理。配置切面。具体可以看一些这个http://www.cnblogs.com/friends-wf/p/3832876.html

5最后完美主义的人不能容忍这样的事,感觉切面不是很完美,最后想到去拦截器拦截url,过滤器也可以做到这样的是,可以先看一下两者的区别http://www.blogjava.net/hello-yun/archive/2011/11/21/364469.html

在写过滤器的时候,需要获取request的参数,get请求servletRequest.getParameter(""),直接这样写就可以获取到,但是最麻烦的是post请求因为post请求有一些数据会写入到流中,你需要去流中获取数据,

/**
* 获取request流中的数据
* @param request
* @return
* @throws Exception
*/
public String getDate(HttpServletRequest request) throws Exception{
StringBuilder sb = new StringBuilder();
InputStream inputStream = null;
BufferedReader reader = null;
try {
inputStream = request.getInputStream();
reader = new BufferedReader(new InputStreamReader(inputStream, Charset.forName("UTF-8")));
String line = "";
while ((line = reader.readLine()) != null) {
sb.append(line);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (inputStream != null) {
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (reader != null) {
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return sb.toString();
}

这样数据也可以获取到了,做到这我以为可以了,但是一测数据得到了,但是在执行不下去,因为你在filter获取到流中的数据,流中数据只能读取一次,

你读完了,业务处理中读取不到,你需要回写流中的数据。

package com.imxiaomai.cb.wms.web.filter;

import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.charset.Charset;

import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;

/**
* User: liqiang
*/
public class BodyReaderHttpServletRequestWrapper extends HttpServletRequestWrapper {

private final byte[] body;

public BodyReaderHttpServletRequestWrapper(HttpServletRequest request,String data) throws IOException {
super(request);
body = data.getBytes(Charset.forName("UTF-8"));
}

@Override
public BufferedReader getReader() throws IOException {
return new BufferedReader(new InputStreamReader(getInputStream()));
}

@Override
public ServletInputStream getInputStream() throws IOException {

final ByteArrayInputStream bais = new ByteArrayInputStream(body);

return new ServletInputStream() {

@Override
public int read() throws IOException {
return bais.read();
}

public boolean isFinished() {
return false;
}

public boolean isReady() {
return false;
}
};
}
}

具体的可以看一下这个http://my.oschina.net/vernon/blog/363693

时间: 2024-10-16 22:13:00

android接口加密的相关文章

Android接口安全 - RSA+AES混合加密方案

转载请注明出处: http://blog.csdn.net/aa464971/article/details/51034462 本文以Androidclient加密提交数据到Java服务端后进行解密为样例. 生成RSA公钥和密钥的方法请參考: http://blog.csdn.net/aa464971/article/details/51035200 Android端的加密思路须要4步: 1.生成AES密钥: 2.使用RSA公钥加密刚刚生成的AES密钥: 3.再使用第1步生成的AES密钥,通过A

Android 安全加密

Android 安全加密 引言 对称加密.非对称加密.消息摘要.数字签名等知识都是为了理解数字证书工作原理而作为一个预备知识.数字证书是密码学里的终极武器,是人类几千年历史总结的智慧的结晶,只有在明白了数字证书工作原理后,才能理解Https 协议的安全通讯机制.最终才能在SSL 开发过程中得心应手. 另外,对称加密和消息摘要这两个知识点是可以单独拿来使用的. 数字证书使用到了以上学习的所有知识 对称加密与非对称加密结合使用实现了秘钥交换,之后通信双方使用该秘钥进行对称加密通信. 消息摘要与非对称

Android安全加密:数字签名和数字证书

Android安全加密专题文章索引 Android安全加密:对称加密 Android安全加密:非对称加密 Android安全加密:消息摘要Message Digest Android安全加密:数字签名和数字证书 Android安全加密:Https编程 以上学习所有内容,对称加密.非对称加密.消息摘要.数字签名等知识都是为了理解数字证书工作原理而作为一个预备知识.数字证书是密码学里的终极武器,是人类几千年历史总结的智慧的结晶,只有在明白了数字证书工作原理后,才能理解Https 协议的安全通讯机制.

C#/IOS/Android通用加密解密方法

原文:C#/IOS/Android通用加密解密方法 公司在做移动端ios/android,服务器提供接口使用的.net,用到加密解密这一块,也在网上找了一些方法,有些是.net加密了android解密不了,或者反之.下面的是三个平台都可以加密解密的方法.加密解密中用到的key="1234578";在调取方法时传值即可. C#代码 #region 跨平台加解密(c#) /// <summary> /// 对字符串进行DES加密 /// </summary> ///

Android 接口回调机制详解

在使用接口回调的时候发现了一个经常犯的错误,就是回调函数里面的实现有可能是用多线程或者是异步任务去做的,这就会导致我们期望函数回调完毕去返回一个主函数的结果,实际发现是行不通的,因为如果回调是多线程的话你是无法和主函数同步的,也就是返回的数据是错误的,这是非常隐秘的一个错误.那有什么好的方法去实现数据的线性传递呢?先介绍下回调机制原理. 回调函数 回调函数就是一个通过函数指针调用的函数.如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用为调用它所指向的函数时,我们就说这是回调函数

Android 接口回调实例

Android接口回调方法处处涉及到,比如常用的Button点击事件就是一个接口回调,可见掌握熟练使用接口回调方法的重要性. 接口回调的简单解释就是:比如我这个类实现了一个接口里的方法doSomething,然后注册到你这里,然后我就去做别的事情去了, 你在某个触发的时机回头来调用我doSomething的方法. 接口回调一般有两种写法,实现形式不一样,但是具体的内部的实现逻辑是一样. 直接给出代码: 方法一: package com.callbackdemo; import android.g

Android 数据库加密

一 一个简短的引论   SQLite是一个轻量的.跨平台的.开源的数据库引擎.它的读写效率.资源消耗总量.延迟时间和总体简单性上具有的优越性,使其成为移动平台数据库的最佳解决方式(如Android.iOS). Android系统内置了SQLite数据库.而且提供了一整套的API用于对数据库进行增删改查操作.具体就不具体说明了. 然而.Android平台自带的SQLite有一个致命的缺陷:不支持加密.这就导致存储在SQLite中的数据能够被不论什么人用不论什么文本编辑器查看到.假设是普通的数据还好

【转】Android SQLite加密

原文地址:http://blog.csdn.net/feifei454498130/article/details/8843402 最近因为一些项目的安全性需要将数据库加密,一开始想到的就是先将数据库通过AES加密,然后运行时再解密,另一种是将数据库里的内容加密. 很快这两种方案都是不理想的,第一种加密方式形同虚设,第二种,如果加密的字段是要查找数据就变得麻烦. 所以第三种方案就是在内存里解密,在网上查到SQLITE是支持加密的, 所以就根据网上的指导一步步地将SQLITE编译成支持加密的. 那

http接口加密《一》:移动应用中,通过在客户端对访问的url进行加密处理来保护服务器上的数据

来源:http://meiyitianabc.blog.163.com/blog/static/10502212720131056273619/ 我认为,保护服务器端的数据,有这么几个关键点: 不能对使用体验产生影响,这就排除掉了诸如每次接口调用都要求用户输入验证码这样的做法 接口调用的网络交互需要无规律可循,比如article/1 –> article/1000 这样的接口就太容易被其他人爬走了 要严格意义上阻击爬虫,需要每一次网络请求都是不可重放的,这样才能避免其他人通过监听网络交互并重放来