全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

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

前面几篇关于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手机app访问接口  # 手机app数据加密传输验证  # java数据加密传输验证  # java实现微信小程序加密数据解密算法  # Java实现的文本字符串操作工具类实例【数据替换  # 加密解密操作】  # java 数据的加密与解密普遍实例代码  # 浅析java实现数据加密问题  # 的是  # 所需  # 中去  # 客户端  # 数据库中  # 都是  # 是一个  # 我是  # 是在  # 第一个  # 帐号  # 这两个  # 第二个  # 涉及到  # 增加到  # 有错  # 中途  # 在这里  # 好了  # 我说 


相关文章: 网站制作企业,网站的banner和导航栏是指什么?  专业公司网站制作公司,用什么语言做企业网站比较好?  湖州网站制作公司有哪些,浙江中蓝新能源公司官网?  如何撰写建站申请书?关键要点有哪些?  大连网站设计制作招聘信息,大连投诉网站有哪些?  建站之星伪静态规则如何正确配置?  图册素材网站设计制作软件,图册的导出方式有几种?  电商平台网站制作流程,电商网站如何制作?  大同网页,大同瑞慈医院官网?  视频网站制作教程,怎么样制作优酷网的小视频?  建站之星后台管理系统如何操作?  如何在Windows服务器上快速搭建网站?  潍坊网站制作公司有哪些,潍坊哪家招聘网站好?  建站之星如何一键生成手机站?  浙江网站制作公司有哪些,浙江栢塑信息技术有限公司定制网站做的怎么样?  C++中的Pimpl idiom是什么,有什么好处?(隐藏实现)  最好的网站制作公司,网购哪个网站口碑最好,推荐几个?谢谢?  如何选择网络建站服务器?高效建站必看指南  建站之星如何助力企业快速打造五合一网站?  建站主机服务器选购指南:轻量应用与VPS配置解析  如何做网站制作流程,*游戏网站怎么搭建?  如何在阿里云虚拟服务器快速搭建网站?  Python路径拼接规范_跨平台处理说明【指导】  如何通过免费商城建站系统源码自定义网站主题与功能?  企业微网站怎么做,公司网站和公众号有什么区别?  制作公司内部网站有哪些,内网如何建网站?  香港服务器网站测试全流程:性能评估、SEO加载与移动适配优化  婚礼视频制作网站,学习*后期制作的网站有哪些?  网站建设制作需要多少钱费用,自己做一个网站要多少钱,模板一般多少钱?  如何快速辨别茅台真假?关键步骤解析  简历在线制作网站免费,免费下载个人简历的网站是哪些?  招商网站制作流程,网站招商广告语?  如何快速生成橙子建站落地页链接?  如何通过西部数码建站助手快速创建专业网站?  建站之星IIS配置教程:代码生成技巧与站点搭建指南  如何访问已购建站主机并解决登录问题?  如何快速查询网站的真实建站时间?  定制建站模板如何实现SEO优化与智能系统配置?18字教程  如何用手机制作网站和网页,手机移动端的网站能制作成中英双语的吗?  如何快速生成凡客建站的专业级图册?  制作网站哪家好,cc、.co、.cm哪个域名更适合做网站?  杭州银行网站设计制作流程,杭州银行怎么开通认证方式?  深入理解Android中的xmlns:tools属性  建站之星如何通过成品分离优化网站效率?  C++如何将C风格字符串(char*)转换为std::string?(代码示例)  盐城做公司网站,江苏电子版退休证办理流程?  如何在Tomcat中配置并部署网站项目?  如何在阿里云香港服务器快速搭建网站?  如何在阿里云ECS服务器部署织梦CMS网站?  制作表格网站有哪些,线上表格怎么弄? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。