本人开发的开发者技术变现资源聚集地,大家支持下,下面是网址

https://www.baiydu.com

前面几篇关于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生成的是一个唯一值。生成方式很简单。下面是代码

  1. public static String getUUID()
  2. {
  3. return UUID.randomUUID().toString();
  4.  
  5. }

下面是java md5 32位加密方法

  1. public static String md5Encrypt(String groupParamertStr) throws UnsupportedEncodingException {
  2.  
  3. MessageDigest messageDigest = null;
  4. try {
  5. messageDigest = MessageDigest.getInstance("MD5");
  6. messageDigest.reset();
  7. messageDigest.update(groupParamertStr.getBytes("UTF-8"));
  8. } catch (NoSuchAlgorithmException e) {
  9. System.out.println("NoSuchAlgorithmException caught!");
  10. System.exit(-1);
  11. } catch (UnsupportedEncodingException e) {
  12. e.printStackTrace();
  13. }
  14. byte[] byteArray = messageDigest.digest();
  15. StringBuffer md5StrBuff = new StringBuffer();
  16. for (int i = 0; i < byteArray.length; i++) {
  17. if (Integer.toHexString(0xFF & byteArray[i]).length() == 1)
  18. md5StrBuff.append("0").append(Integer.toHexString(0xFF & byteArray[i]));
  19. else
  20. md5StrBuff.append(Integer.toHexString(0xFF & byteArray[i]));
  21. }
  22. return md5StrBuff.toString();
  23.  
  24. }

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

  1. //下面这个方法三个参数 第一个是用户token 第二个是加密所需要的参数,等会我们通过用户token查询出 加密token之后,我们需要将它拼接到servlet加密所需json字符串中去,第三个就是从客户端传来的 加密结果字符串 这里方法返回0表示 用户加密后的结果没有问题,否则就有错
  2. public static int postTokenVerify(String token, JSONObject requestJsonObject,
  3. String encryptStrValue) {
  4. int returnValue=0;
  5. String[] mysqlParameter=new String[]{token};
  6. //下面就是通过用户token查询 用户的加密token
  7. ResultSet returnData=MySqlHepler.executeQuery("select * from infosheet where idToken=?", mysqlParameter);
  8. JSONObject returnObject=null;
  9. try {
  10. returnObject = ResultToJsonTool.resultSetToJsonObject(returnData);
  11. } catch (SQLException e1) {
  12. // TODO Auto-generated catch block
  13. e1.printStackTrace();
  14. } catch (JSONException e1) {
  15. // TODO Auto-generated catch block
  16. e1.printStackTrace();
  17. }
  18.  
  19. String byEncryptStrValue="";
  20. try {
  21. if (returnObject.getString("encryptToken").length()>2) {//说明用户的idToken存在,
  22. // return returnValueString;
  23.  
  24. //{"idToken":"123456","id":"34","pwd":"23","encryptToken":"2345678","account":"hang"}
  25. /*下面的代码是在匹配JAVAMD5加密字符串,
    因为用户加密时,增加了加密token到加密字符串中去,但是请求时又不能传递这个加密token,所以我们servlet加密时需要通过用户token去查询用户的加密toke, 查询出来了,我们就需要拼接到,请求参数json后面,这样servlet加密的字符串就与用户加密的字符串一致了。下面就是查询出加密token后拼接到请求参数后面的方法,
    */
  26. byEncryptStrValue=requestJsonObject.toString().substring(0, requestJsonObject.toString().length()-1);
  27.  
  28. JSONObject encryptTokenJsonObject=new JSONObject();
  29. encryptTokenJsonObject.put("encryptToken",returnObject.getString("encryptToken"));
  30.  
  31. String value1=encryptTokenJsonObject.toString().substring(1, encryptTokenJsonObject.toString().length());
  32.  
  33. byEncryptStrValue=byEncryptStrValue+","+value1;
  34.  
  35. //
  36. }
  37. else {
  38. returnValue=1;//idtoken错 误
  39.  
  40. }
  41. } catch (JSONException e1) {
  42. // TODO Auto-generated catch block
  43. e1.printStackTrace();
  44. }
  45.  
  46. try {
  47. //下面方法就是使用拼接正确的字符串 在servlet上进行加密的方法调用,返回一个结果后,对比用户传递的加密结果
  48. String javaMd5Result=EncryptSafa.md5Encrypt(byEncryptStrValue);
  49.  
  50. if (javaMd5Result.equals(encryptStrValue)) {//加密串是正确的
  51.  
  52. }
  53. else
  54. {
  55.  
  56. returnValue= 2;//加密结果有错
  57. }
  58.  
  59. } catch (UnsupportedEncodingException e) {
  60. // TODO Auto-generated catch block
  61. e.printStackTrace();
  62. }
  63.  
  64. return returnValue;
  65. }

前面都是封装好的被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页面处理的代码,整个流程就是为了验证用户请求在传递的途中是否被修改过。

  1. //昨天在这里遇到个问题,就是当我请求参数中带中文时,servlet获取之后是乱码的,之后用了下面这种方式好了.
  2. String requestJsonStr=new String(request.getParameter("parameter").getBytes("ISO8859-1"),"UTF-8");
  3.  
  4. //提交参数
  5. JSONObject objectParameter=null;
  6. //idToken
  7. JSONObject requestParmeter=null;
  8. //idToken
  9. String idToken="";
  10. //客户端加密字符串
  11. String md5Str="";
  12. try {
  13. //获取总的JSON字符串,这里其实是我们从URL只传递的那个paramter一个参数
  14. objectParameter=new JSONObject(requestJsonStr);
  15. //提交参数,json的一个key值,请求参数内部的paramter,其实这个参数里面放的是业务中所需参数,比如你登录 帐号 密码 这类型的
  16. requestParmeter=new JSONObject(objectParameter.getString("parameter"));
  17. //idToken 这个是用户token,他就是用户的唯一标识,我们是需要通过他来查询数据库中对应的 加密token的
  18. idToken=requestParmeter.getString("idToken");
  19. //客户端加密字符串
  20. md5Str=objectParameter.getString("md5Str");
  21. } catch (JSONException e1) {
  22. // TODO Auto-generated catch block
  23. e1.printStackTrace();
  24. }
  25.  
  26. //MD5加密后生成的字符串
  27.  
  28. //下一步是验证token是否正确
  29. int tokenVerifyResult=EncryptSafa.postTokenVerify(idToken, requestParmeter, md5Str);
  30. if (tokenVerifyResult==0) {
  31.  
  32. out.println("token加密方式正确");
  33.  
  34. }
  35.  
  36. else {
  37. out.println("加密token或加密方式错误");
  38. return;
  39.  
  40. }

 

本人创业做的一款androidApp, 下载量已经有2000多万,各种当前热门的网络手机奖励红包全部集成,另外还有热门电影和淘宝高额优惠券!很适合各类型的用户。

 

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

  1. java servlet手机app访问接口(二)短信验证

    今天找了几个短信平台,其实最想使用的一个是sharesdk,使用它上面http api短信功能,不仅价格低,而且最少可以充值100RMB,但是审核过于严格,对应APP还必须集成他们的短信功能,而且要上 ...

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

    这篇关于高德地图的随笔内容会多一点, 一.业务说明     对应APP业务中的成员有两类,一是服务人员,二是被服务人员,  主要实现功能, 对APP中的服务人员位置进行时时定位, 然后通过被服务人员登 ...

  3. java servlet手机app访问接口(四)推送

    一. 服务端DEMO下载及运行. 登录友盟后,浏览器直接输入下面这个URL,直接进入文档开发和DEMO下载页面:http://dev.umeng.com/push/ios/integration(下面 ...

  4. java实现利用httpclient访问接口

    HTTP协议时Internet上使用的很多也很重要的一个协议,越来越多的java应用程序需要通过HTTP协议来访问网络资源. HTTPClient提供的主要功能: 1.实现了所有HTTP的方法(GET ...

  5. Java 调用 Hbase API 访问接口实现方案

    HBase是一个分布式的.面向列的开源数据库,该技术来源于 Fay Chang 所撰写的Google论文“Bigtable:一个结构化数据的分布式存储系统”.就像Bigtable利用了Google文件 ...

  6. 【http抓包】记录一次抓手机app的接口

    抓手机的接口地址,好用的工具很多,想 windows下的 Fiddler 和mac下的Charles 1. fiddler的设置教程是 http://jingyan.baidu.com/article ...

  7. java Servlet接口及应用

    基本类和接口 一.javax.servlet.Servlet接口 servlet抽象集是javax.servlet.Servlet接口,它规定了必须由Servlet类实现由servlet引擎识别和管理 ...

  8. java Servlet接口及应用(转)

    基本类和接口 一.javax.servlet.Servlet接口 servlet抽象集是javax.servlet.Servlet接口,它规定了必须由Servlet类实现由servlet引擎识别和管理 ...

  9. Java EE javax.servlet中的ServletContext接口

    ServletContext接口 public interface ServletContext (https://docs.oracle.com/javaee/7/api/javax/servlet ...

随机推荐

  1. Atitit 电子商务订单号码算法(java c# php js 微信

    Atitit 电子商务订单号码算法(java c# php js  微信 1.1. Js版本的居然钱三爷里面没有..只好自己实现了. 1.2. 订单号标准化...长度16位 1.3. 订单号的结构 前 ...

  2. iOS开发——网络使用技术OC篇&网络爬虫-使用正则表达式抓取网络数据

    网络爬虫-使用正则表达式抓取网络数据 关于网络数据抓取不仅仅在iOS开发中有,其他开发中也有,也叫网络爬虫,大致分为两种方式实现 1:正则表达 2:利用其他语言的工具包:java/Python 先来看 ...

  3. AngularJS快速入门01-基础

    记得第一次听说AngularJS这项很赞的Web的前端技术,那时还是2014年,年中时我们我的一个大牛兄弟当时去面试时,被问到了是否熟悉该技术,当时他了解和使用的技术比较多.我们询问他面试情况时,他给 ...

  4. CSS实现点击事件及实践

    实现原理利用:target,把a标签自身的href以及id设置成一样的. 案例1:实现元素的切换 HTML: <div id="box"> <a href=&qu ...

  5. CSS中如何实现未知尺寸图片垂直居中

    在曾经的 淘宝UED 招聘 中有这样一道题目: “使用纯CSS实现未知尺寸的图片(但高宽都小于200px)在200px的正方形容器中水平和垂直居中.” 当然出题并不是随意,而是有其现实的原因,垂直居中 ...

  6. 依赖注入(DI)与服务容器(IoC)

    参考文章:http://www.yuansir-web.com/2014/03/20/%E7%90%86%E8%A7%A3php-%E4%BE%9D%E8%B5%96%E6%B3%A8%E5%85%A ...

  7. java基础复习 - 自动装箱

    Integer a = 127; // 将整形127装箱对象 Integer b = 127; // 同上 System.out.print( a==b ); // true System.out.p ...

  8. jsp网站服务器配置

    Jsp网站部署环境配置 首先解释一下,.jsp网站与.html网站有着很大的不同,html是一种静态网站开发脚本语言,jsp则是在html的基础上专门为开发动态网站设计的语言.所以jsp网站没办法直接 ...

  9. python类定义与c#的一些区别

    c#中可以定义一个空类,但是python中定义空类需要加pass class EmptyClass(object): pass python的lei是多继承   python子类继承了基类,如果子类也 ...

  10. c#params ref out

    params params 关键字可以指定在参数数目可变处采用参数的方法参数. 在方法声明中的 params 关键字之后不允许任何其他参数,并且在方法声明中只允许一个 params 关键字. 示例: ...