java传输json数据用md5加密过程
1.加密过程:客户端传输数据,包含两部分,一部分原始数据,一部分签名。签名就是对原始数据MD5加密后的字节序列。而原始数据就是普通的string字符串。
2.服务器端呢:将收到的原始数据,进行MD5加密后得到字节序列,将这个字节序列与传输过来的sign的value,进行对比。如果俩sign值一样,则数据没有被破坏。认证加密成功。
3.进行操作MD5,java sdk已经内置支持了,有java.security包,其中的MessageDiggest类。
客户端加密代码如下:
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
APPMain appMain = new APPMain();
URL url = new URL(urlString);
JSONObject returnJson;
try {
returnJson = appMain.getResponse(url);
System.out.println(JSONObject.toJSONString(returnJson));
} catch (NoSuchAlgorithmException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public JSONObject getResponse(URL url) throws IOException, NoSuchAlgorithmException {
//��������
httpURLConnection = (HttpURLConnection) url.openConnection();
httpURLConnection.setRequestMethod("POST");
httpURLConnection.setDoOutput(true);
httpURLConnection.setDoInput(true);
httpURLConnection.setUseCaches(false);
httpURLConnection.setRequestProperty("Content-type", "application/json");
httpURLConnection.connect();
//post��������
OutputStream outStrm = httpURLConnection.getOutputStream();
DataOutputStream objOutputStrm = new DataOutputStream(outStrm);
JSONObject obj = new JSONObject();
JSONObject commentJson = new JSONObject();
commentJson.put("phone", "13823135363");
obj.put("param", commentJson);
obj.put("ts", "abc");
obj.put("mn", "abc");
obj.put("imei", "abc");
obj.put("version", "abc");
obj.put("token", "abc");
StringBuilder sBuilder = new StringBuilder();
createBeforeEncryptString(sBuilder,"ts","abc","&");
createBeforeEncryptString(sBuilder,"mn","abc","&");
createBeforeEncryptString(sBuilder,"imei","abc","&");
createBeforeEncryptString(sBuilder,"version","abc","&");
createBeforeEncryptString(sBuilder,"token","abc","&");
createBeforeEncryptString(sBuilder,"param",commentJson.toJSONString(),"");
String encrapted = sBuilder.toString();
obj.put("sign", md5Encrypt(encrapted));
objOutputStrm.writeBytes(obj.toString());
objOutputStrm.flush();
objOutputStrm.close();
//input
BufferedReader reader = new BufferedReader(new InputStreamReader(httpURLConnection.getInputStream()));
String lines =reader.readLine();//��ȡ������
JSONObject inputJson=JSONObject.parseObject(lines);
reader.close();
System.out.println(md5Encrypt(encrapted));
return inputJson;
}
public String md5Encrypt(String content) {
try {
MessageDigest md = MessageDigest.getInstance("MD5");
md.update( content.getBytes() );
return getHashString( md );
} catch (NoSuchAlgorithmException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
public String getHashString( MessageDigest digest )
{
StringBuilder builder = new StringBuilder();
for ( byte b : digest.digest() )
{
builder.append( Integer.toHexString( (b >> 4) & 0xf ) );
builder.append( Integer.toHexString( b & 0xf ) );
}
return builder.toString();
}
public void createBeforeEncryptString(StringBuilder sb,String key,String value,String gap) {
sb.append(key).append("=").append(value).append(gap);
}
}
服务器端代码如下:
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
BodyReaderHttpServletRequestWrapper requestWrapper = null;
if (request instanceof HttpServletRequest) {
requestWrapper = new BodyReaderHttpServletRequestWrapper((HttpServletRequest) request);
} String body = requestWrapper.getBody(); if(!StringUtils.isEmpty(body)){
ParamIn param = JSONObject.parseObject(body, ParamIn.class);
StringBuilder _sb = new StringBuilder();
_sb.append("ts").append("=").append(param.getTs()).append("&");
_sb.append("mn").append("=").append(param.getMn()).append("&");
_sb.append("imei").append("=").append(param.getImei()).append("&");
_sb.append("version").append("=").append(param.getVersion()).append("&");
_sb.append("token").append("=").append(param.getToken()); if(!StringUtils.isEmpty(param.getParam())){
_sb.append("&").append("param").append("=").append(param.getParam());
} logger.info("to be encrypted: " + _sb.toString()); String md5Encrypted = HashEncoder.encode(HashAlgorithm.MD5, _sb.toString()); logger.info("encrypted: " + md5Encrypted);
if(!md5Encrypted.equalsIgnoreCase(param.getSign())){
logger.info("sign invalid");
this.response(response, JSONObject.toJSONString(new ResultObject(ResultCode.SIGN_INVALID)));
return;
}else{
logger.info("valid sign success");
} }else{
this.response(response, JSONObject.toJSONString(new ResultObject(ResultCode.NULL_PARAM)));
return;
} //签名验证成功
chain.doFilter(requestWrapper, response);
}
java传输json数据用md5加密过程的更多相关文章
- Java后台使用httpclient入门HttpPost请求(form表单提交,File文件上传和传输Json数据)
一.HttpClient 简介 HttpClient 是 Apache Jakarta Common 下的子项目,用来提供高效的.最新的.功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 ...
- 通过ajax和spring 后台传输json数据
在通过ajax从页面向后台传数据的时候,总是返回415(Unsupported media type)错误,后台无法获取数据.如下图所示: 在尝试解决这个问题的时候,我们首先要理解一下概念: @req ...
- Java 对字符串数据进行MD5/SHA1哈希散列运算
Java对字符串数据进行MD5/SHA1哈希散列运算 [java] view plain copy package cn.aibo.test; import java.security.Message ...
- Introduction to Structured Data json的2种形式 JAVA解析JSON数据 - JsonArray JsonObject
https://developers.google.com/search/docs/guides/intro-structured-data Structured data refers to kin ...
- js处理json数据,java处理json数据
一.js处理json数据 处理办法之一是把本机json数据或远程返回json数据用eval函数,使之变成DOM对象. 例如: var people = { "programmers" ...
- Java三行代码搞定MD5加密
Java三行代码搞定MD5加密 https://www.dexcoder.com/selfly/article/4026 public class MD5Test { public static vo ...
- Django之AJAX传输JSON数据
目录 Django之AJAX传输JSON数据 AJAX 中 JSON 数据传输: django响应JSON类型数据: django 响应 JSON 类型数据: Django之AJAX传输JSON数据 ...
- Java:HttpPost 传输Json数据过长使用HttpServletRequest解析
直接上代码 /** * 测试生成json数据 */ @Test public void synYxGoodsInfoTest() { try { String url = "http://1 ...
- Android 手机卫士--md5加密过程
在之前的文章中,我们将用户的密码使用SharedPreferences存储,我们打开/data/data/com.wuyudong.mobilesafe/shared_prefs文件夹下的 confi ...
随机推荐
- IOS- 网络图片缓存到沙盒中 ,离线取出。
一.缓存图片 //1.首先创建在沙盒中创建一个文件夹用于保存图片 NSFileManager *fileManager = [[NSFileManager alloc] init]; NSString ...
- Machine Learning 学习笔记 (4) —— 广义线性模型
本系列文章允许转载,转载请保留全文! [请先阅读][说明&总目录]http://www.cnblogs.com/tbcaaa8/p/4415055.html 1. 指数分布族简介 之前的文章分 ...
- pspo
一.项目计划总结: 周活动总结表 姓名: 日期:3.12.2015 日期 任务 听课 编写程序 阅读课本 准备考试 日总计 周日 周一 周二 周三 10:00- ...
- mysql 触发器的使用(备忘)
触发器创建语法四要素: 1.监视地点(table) 2.监视事件(insert/update/delete) 3.触发时间(after/before) 4.触发事件(insert/update/del ...
- android 开发 drawerlayout出现退不回去的情况
问题原因: id_framelayout2 写在 id_linearlayout2 的后面了: 注意记得写: android:layout_gravity="start" 正确: ...
- HDU 5638 拓扑排序+优先队列
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5638 题意: 给你一个DAG图,删除k条边,使得能个得到字典序尽可能小的拓扑排序 题解: 把拓扑排序 ...
- Linux进程栈和线程栈
参考资料: http://blog.csdn.net/xhhjin/article/details/7579145 总结: 1.进程的栈大小是在进程执行的时刻才能指定的,即不是在编译的时候决定 ...
- fbx 模型转换 export
最近在做自定义类型到fbx的转换 有关polygon的理解 vertex,normal,color等信息,是离散的放置的,对fbx里面的mesh加了控制点(vertex)信息之后, 需要再设置poly ...
- 浅谈c#枚举
结构中的成员可以赋值,枚举呢....是取值,只读的 以下情况可以考虑将类创建为结构:(1)如果一个类其中的字段非常少,所有字段占用的内存总量不超过8.16字节:(2)如果一个类中的字段都是值类型: 关 ...
- C#单链表(数据结构)
学习单链表的源码项目:http://files.cnblogs.com/xmfdsh/CSharp%E5%8D%95%E9%93%BE%E8%A1%A8.rar 链表是用一组任意的存储单元来存储线性表 ...