java servlet手机app访问接口(一)数据加密传输验证_java

前面几篇关于servlet的随笔,算是梳理了servlet的简单使用流程,接下去的文章将主要围绕手机APP访问接口这块出发续写,md5加密传输--->短信验证--->手机推送--->分享--->百度云图---->支付....第三方的业务 ...由于我是新手我也是一边学一边写,不足地方希望谅解。

今天这篇文章主要涉及到 javaservlet传输数据的加密,客户端请求参数的组合,并且会附带上我中途遇到的所有问题以及解决方法。 

由于手机访问接口是公布出来的,所以不管用什么语言编写接口,我们就应该做相应的安全措施,否则人家知道你的URL之后,截获客户端的请求,然后修改提交参数,这样损失就大了。用servlet写接口用得最多的也应该是对传输数据进行一个加密,如果是webservice .net的wcf这些这样的技术来编写,还会涉及到证书的匹配.... 

一、请求数据参数的加密与实现思路。

     加密这里我使用的md5 32位的加密,32位是一个不可逆的加密,这样即使被黑客截获了,也是没办法将我们加密后的MD5值,解密成我们加密时组合的字符串的。  当然这个不是绝对的,好像前几年已经有计算机方面的专家破译了MD5的加密方式,但我觉得那技术首先可能不会随意公布出来,然后即使公布了也不是一般人能明白的,否则      你随便问一个程序员 MD5加密你还在用吗,那肯定回答是 没有了。     

1、首先我说下我请求参数的组合思路,因为这里涉及到了MD5加密,所以我们必须在用户使用APP登录帐号之后,反馈给用户两个token,第一个token是表示用户身份的唯一值,这个token是需要增加到请求接口参数中的(这个参数是否参与加密,是你自己定不影响,我这里是参与了的),因为servlet需要通过它来查询用户的加密所需token, 第二个token是用来加密md5的值,这个token是不能增加到请求接口参数中去的,而且这两个token我们都必须保存到数据库中,因为用户请求接口之后,serlvet需要获取参数中的用户token然后去数据库中查询 md5加密所需token,然后servlet再将查询来的加密token增加到用户传递来的字符串中去,再次进行一个md5加密,加密后对比用户传递的md5加密后的值,是否与servlet加密后的值一样,如果不一样,那么原因就可能有两个,servlet这边加密字符串组合错误,用户传输数据中途被截修改过。这两个token我都是使用的java uuid生成的,应为uuid生成的是一个唯一值。生成方式很简单。下面是代码

 public static String getUUID()
 {
 return UUID.randomUUID().toString(); 

 } 

下面是java md5 32位加密方法

public static String md5Encrypt(String groupParamertStr) throws UnsupportedEncodingException {

   MessageDigest messageDigest = null;
   try {
    messageDigest = MessageDigest.getInstance("MD5");
    messageDigest.reset();
    messageDigest.update(groupParamertStr.getBytes("UTF-8"));
   } catch (NoSuchAlgorithmException e) {
    System.out.println("NoSuchAlgorithmException caught!");
    System.exit(-1);
   } catch (UnsupportedEncodingException e) {
    e.printStackTrace();
   }
   byte[] byteArray = messageDigest.digest();
   StringBuffer md5StrBuff = new StringBuffer();
   for (int i = 0; i < byteArray.length; i++) {
    if (Integer.toHexString(0xFF & byteArray[i]).length() == 1)
     md5StrBuff.append("0").append(Integer.toHexString(0xFF & byteArray[i]));
    else
     md5StrBuff.append(Integer.toHexString(0xFF & byteArray[i]));
   }
   return md5StrBuff.toString(); 

 }

下面是servlet这边获取参数进行加密后,使用加密结果与用户请求传递的加密结果进行一个对比。如果一样说明请求没问题,否则请求参数值有可能被修改过

//下面这个方法三个参数 第一个是用户token 第二个是加密所需要的参数,等会我们通过用户token查询出 加密token之后,我们需要将它拼接到servlet加密所需json字符串中去,第三个就是从客户端传来的 加密结果字符串 这里方法返回0表示 用户加密后的结果没有问题,否则就有错
 public static int postTokenVerify(String token, JSONObject requestJsonObject,
   String encryptStrValue) {
  int returnValue=0;
  String[] mysqlParameter=new String[]{token};
  //下面就是通过用户token查询 用户的加密token
  ResultSet returnData=MySqlHepler.executeQuery("select * from infosheet where idToken=?", mysqlParameter);
  JSONObject returnObject=null;
  try {
   returnObject = ResultToJsonTool.resultSetToJsonObject(returnData);
  } catch (SQLException e1) {
   // TODO Auto-generated catch block
   e1.printStackTrace();
  } catch (JSONException e1) {
   // TODO Auto-generated catch block
   e1.printStackTrace();
  }

   String byEncryptStrValue="";
   try {
   if (returnObject.getString("encryptToken").length()>2) {//说明用户的idToken存在,
     // return returnValueString;

    //{"idToken":"123456","id":"34","pwd":"23","encryptToken":"2345678","account":"hang"}
    /*下面的代码是在匹配JAVAMD5加密字符串,
     因为用户加密时,增加了加密token到加密字符串中去,但是请求时又不能传递这个加密token,所以我们servlet加密时需要通过用户token去查询用户的加密toke, 查询出来了,我们就需要拼接到,请求参数json后面,这样servlet加密的字符串就与用户加密的字符串一致了。下面就是查询出加密token后拼接到请求参数后面的方法,
     */
    byEncryptStrValue=requestJsonObject.toString().substring(0, requestJsonObject.toString().length()-1);

     JSONObject encryptTokenJsonObject=new JSONObject();
     encryptTokenJsonObject.put("encryptToken",returnObject.getString("encryptToken"));

    String value1=encryptTokenJsonObject.toString().substring(1, encryptTokenJsonObject.toString().length());

    byEncryptStrValue=byEncryptStrValue+","+value1;

    //
    }
     else {
      returnValue=1;//idtoken错 误

    }
  } catch (JSONException e1) {
   // TODO Auto-generated catch block
   e1.printStackTrace();
  }

  try {
   //下面方法就是使用拼接正确的字符串 在servlet上进行加密的方法调用,返回一个结果后,对比用户传递的加密结果
   String javaMd5Result=EncryptSafa.md5Encrypt(byEncryptStrValue);

   if (javaMd5Result.equals(encryptStrValue)) {//加密串是正确的

   }
   else
   {

    returnValue= 2;//加密结果有错
   }

  } catch (UnsupportedEncodingException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }

   return returnValue;
 }

前面都是封装好的被servlet调用的方法,下面是servlet页调用的所有代码

1、请求的URL

这里我是传递的是一个字典转换json格式的参数,是一个键值对形式,请求参数只用了一个。 参数中的idToken就是用户token,值我是在数据库中随便增加的一个123456

没使用uuid,当然正式做肯定不会这样。

http://localhost:8080/JAVAServletTest/2.jsp?parameter={"parameter":"{\"idToken\":\"123456\",\"pwd\":\"汉字\",\"account\":\"hang\"}","md5Str":"672f4a8c6fb92103c01d4275e46df790"}

 下面是servlet页面处理的代码,整个流程就是为了验证用户请求在传递的途中是否被修改过。

 //昨天在这里遇到个问题,就是当我请求参数中带中文时,servlet获取之后是乱码的,之后用了下面这种方式好了.
   String requestJsonStr=new String(request.getParameter("parameter").getBytes("ISO8859-1"),"UTF-8");

   //提交参数
   JSONObject objectParameter=null;
  //idToken
   JSONObject requestParmeter=null;
  //idToken
   String idToken="";
  //客户端加密字符串
   String md5Str="";
   try {
    //获取总的JSON字符串,这里其实是我们从URL只传递的那个paramter一个参数
    objectParameter=new JSONObject(requestJsonStr);
    //提交参数,json的一个key值,请求参数内部的paramter,其实这个参数里面放的是业务中所需参数,比如你登录 帐号 密码 这类型的
    requestParmeter=new JSONObject(objectParameter.getString("parameter"));
     //idToken 这个是用户token,他就是用户的唯一标识,我们是需要通过他来查询数据库中对应的 加密token的
     idToken=requestParmeter.getString("idToken");
     //客户端加密字符串
     md5Str=objectParameter.getString("md5Str");
  } catch (JSONException e1) {
   // TODO Auto-generated catch block
   e1.printStackTrace();
  }

    //MD5加密后生成的字符串

    //下一步是验证token是否正确
   int tokenVerifyResult=EncryptSafa.postTokenVerify(idToken, requestParmeter, md5Str);
    if (tokenVerifyResult==0) {

     out.println("token加密方式正确");

      }

    else {
       out.println("加密token或加密方式错误");
       return;

     }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索java
servlet 传输视频流、jsp和servlet传输数据、servlet 加密、servlet接口、java调用servlet接口,以便于您获取更多的相关知识。

时间: 2024-10-02 07:26:54

java servlet手机app访问接口(一)数据加密传输验证_java的相关文章

java servlet手机app访问接口(三)高德地图云存储及检索_java

这篇关于高德地图的随笔内容会多一点, 一.业务说明 对应APP业务中的成员有两类,一是服务人员,二是被服务人员, 主要实现功能, 对APP中的服务人员位置进行时时定位, 然后通过被服务人员登录APP时提供的一个经纬度来计算服务人员与被服务人员之间的距离 单位m. 下面是整个详细流程,从创建高德对应应用(这里注册我就不说了)------最后完成此功能. 二.创建servlet对应的高德地图应用,创建自己的云图数据库表 注册帐号后登录点击右上角的控制台,会出现下面这个界面,我截图 这里当然是我已经注

手机app接口开发-手机APP登录接口设计问题,不知道加密方式如何登录?

问题描述 手机APP登录接口设计问题,不知道加密方式如何登录? 不知道网站的密码的加密方式,知道密码,手机APP接口该怎么设计登录呢? 解决方案 用fiddler调试,看看密码是不是明文传过去的.如果不是,再用js调试工具看密码在客户端的加密方式是什么. 解决方案二: 设计基于HTML5的APP登录功能及安全调用接口的方式(原理篇)设计基于HTML5的APP登录功能及安全调用接口的方式(原理篇) 解决方案三: 知道密码,但不知道加密方式,这个就需要从 PC,即网页端分析了.只有分析出加密的算法,

Java Servlet中用户访问权限的问题

问题描述 我做了一个Servlet通过Jacob访问Excel与Word.在Tomcat中测试通过了,但是在Was中发布后测试失败.我在TaskManager观察到的现象如下:Tomcat访问Servlet的场合,是Administrator用户去调用的Excel.exeWas访问Servlet的场合,是User用户去调用的Excel.exeUser用户调用Excel.exe的时候,总是提示权限不足,无法保存的问题.各位高手,谁能告诉我,怎么在Web.config中配置权限,才能用Adminis

举例说明Java设计模式编程中ISP接口隔离原则的使用_java

Interface Segregation Principle,ISP接口隔离原则主张使用多个专门的接口比使用单一的总接口要好. 一个类对另外一个类的依赖性应当是建立在最小的接口上的. 一个接口代表一个角色,不应当将不同的角色都交给一个接口.没有关系的接口合并在一起,形成一个臃肿的大接口,这是对角色和接口的污染. "不应该强迫客户依赖于它们不用的方法.接口属于客户,不属于它所在的类层次结构."这个说得很明白了,再通俗点说,不要强迫客户使用它们不用的方法,如果强迫用户使用它们不使用的方法

通过Java来测试JSON和Protocol Buffer的传输文件大小_java

JSON相信大家都知道是什么东西,如果不知道,那可就真的OUT了,GOOGLE一下去.这里就不介绍啥的了. Protobuffer大家估计就很少听说了,但如果说到是GOOGLE搞的,相信大家都会有兴趣去试一下,毕竟GOOGLE出口,多属精品. Protobuffer是一个类似JSON的一个传输协议,其实也不能说是协议,只是一个数据传输的东西罢了. 那它跟JSON有什么区别呢? 跨语言,这是它的一个优点.它自带了一个编译器,protoc,只需要用它进行编译,可以编译成JAVA.python.C++

mybatis-手机app后台接口用java怎么写?

问题描述 手机app后台接口用java怎么写? 有没有demo可以提供的?听说用rest.rest不是有get.put吗?那样不是不安全吗? 解决方案 restful api之上你可以附加一些参数,比如appkey,secretid,sign等,伪造的程序因为对不上这些参数,所以不可以调用. 解决方案二: 可以使用网络协议 或者 对数据接口参数进行签名,后台验证签名通过才可操作 否则直接返回 解决方案三: 后台一般来说是基于网络协议的,如果你想和app进行交互的话可以通过htto请求来进行数据的

求教,要用java写个app的服务端,请问需要使用哪些技术或组件?

问题描述 求教,要用java写个app的服务端,请问需要使用哪些技术或组件? 好像需要用到xmpp,数据传递打算使用json,然后框架准备使用springmvc+mybties,但是我不清楚该怎么实现接收app传过来的数据,还有就是怎么将数据传递给app. 好像说进行接口交互,但是这个大概是怎么实现或运行的,有没有大神介绍下,有例子链接更好哈! 解决方案 这个我来告诉你,因为我现在就在用JAVA做手机APP的服务器. 首先你不要被什么框架啊这些给迷惑了,如果你连原理都不知道就去弄这些框架,会把你

Java servlet判断是否是移动设备

使用Java  servlet如何判断访问介质是否是移动设备呢? 移动设备指手机和pad Java代码   /**       * 判断手机的操作系统 IOS/android/windows phone/BlackBerry       *        * @param UA       * @return       */       public static ClientOsInfo getMobilOS(String UA) {           UA=UA.toUpperCase(

网易云信 java给手机写接口 curl是什么东西,跪求大神解决

问题描述 网易云信 java给手机写接口 curl是什么东西,跪求大神解决 用到的框架 spring springmvc mybatis 这是开发手册的地址http://dev.netease.im/docs?doc=server_sms 解决方案 curl是一个用来访问web和web service的库,和你用浏览器输入网址,提交参数,得到网页的原理是一样的.java中用自带的httpclient就可以了.