前面几篇关于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实现数据加密问题
# 的是
# 所需
# 中去
# 客户端
# 数据库中
# 都是
# 是一个
# 我是
# 是在
# 第一个
# 帐号
# 这两个
# 第二个
# 涉及到
# 增加到
# 有错
# 中途
# 在这里
# 好了
# 我说
相关文章:
建站之星好吗?新手能否轻松上手建站?
制作营销网站公司,淘特是干什么用的?
定制建站方案优化指南:企业官网开发与建站费用解析
建站之星后台密码遗忘?如何快速找回?
如何用花生壳三步快速搭建专属网站?
如何用AWS免费套餐快速搭建高效网站?
如何快速上传自定义模板至建站之星?
广德云建站网站建设方案与建站流程优化指南
高防服务器如何保障网站安全无虞?
广州商城建站系统开发成本与周期如何控制?
高防服务器租用首荐平台,企业级优惠套餐快速部署
c++怎么实现高并发下的无锁队列_c++ std::atomic原子变量与CAS操作【详解】
寿县云建站:智能SEO优化与多行业模板快速上线指南
公司网站建设制作费用,想建设一个属于自己的企业网站,该如何去做?
高端建站三要素:定制模板、企业官网与响应式设计优化
韩国网站服务器搭建指南:VPS选购、域名解析与DNS配置推荐
如何通过老薛主机一键快速建站?
手机网站制作与建设方案,手机网站如何建设?
ppt制作免费网站有哪些,ppt模板免费下载网站?
如何高效配置香港服务器实现快速建站?
如何在Golang中引入测试模块_Golang测试包导入与使用实践
如何高效完成自助建站业务培训?
如何在宝塔面板创建新站点?
公司门户网站制作流程,华为官网怎么做?
测试制作网站有哪些,测试性取向的权威测试或者网站?
重庆网站制作公司哪家好,重庆中考招生办官方网站?
如何通过PHP快速构建高效问答网站功能?
简单实现Android验证码
如何高效生成建站之星成品网站源码?
已有域名和空间如何快速搭建网站?
上海网站制作网页,上海本地的生活网站有哪些?最好包括生活的各个方面的?
北京制作网站的公司排名,北京三快科技有限公司是做什么?北京三快科技?
公司网站制作费用多少,为公司建立一个网站需要哪些费用?
网页制作模板网站推荐,网页设计海报之类的素材哪里好?
中山网站制作网页,中山新生登记系统登记流程?
小视频制作网站有哪些,有什么看国内小视频的网站,求推荐?
如何高效利用亚马逊云主机搭建企业网站?
网站制作服务平台,有什么网站可以发布本地服务信息?
如何基于云服务器快速搭建个人网站?
,怎么在广州志愿者网站注册?
网站视频怎么制作,哪个网站可以免费收看好莱坞经典大片?
公司网站设计制作厂家,怎么创建自己的一个网站?
微信h5制作网站有哪些,免费微信H5页面制作工具?
Java解压缩zip - 解压缩多个文件或文件夹实例
建站主机是否属于云主机类型?
如何在阿里云服务器自主搭建网站?
如何正确选择百度移动适配建站域名?
新网站制作渠道有哪些,跪求一个无线渠道比较强的小说网站,我要发表小说?
Android自定义控件实现温度旋转按钮效果
制作企业网站建设方案,怎样建设一个公司网站?
*请认真填写需求信息,我们会在24小时内与您取得联系。