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 ...
随机推荐
- Think in java备忘录
1..new在内部类中的使用 .new可以用使用外部类对象创建一个内部类,对象 DotNew.java package com.gxf.innerclass; public class DotNew ...
- 使用个推的时候出现Installation error: INSTALL_FAILED_DUPLICATE_PERMISSION
使用个推的时候出现 Installation error: INSTALL_FAILED_DUPLICATE_PERMISSION perm=getui.permissio... 解决办法: 先将手机 ...
- 【Merge Two Sorted Lists】cpp
题目: Merge two sorted linked lists and return it as a new list. The new list should be made by splici ...
- backgroundworker的使用问题
这几天做项目懒了就用backgroundworker这个控件,觉得它比多线程方便一些,然后这个线程里面在开线程,然后惨剧就发生了:当我打开一个主窗口后,在打开一个子窗口,子窗口里有个backgroun ...
- PP生产订单的BADI增强 WORKORDER_UPDATE
METHOD if_ex_workorder_update~before_update. *---------------------->增强1 开始* "当生产订单类型为PP01时, ...
- 在ubuntu上搭建reviewboard
review board 2.0.5 ubuntu ubuntu-12.04.1-desktop-amd64 基本上基于这个教程:http://alephnullplex.appspot.com/bl ...
- Nginx问题总汇
http://blog.csdn.net/llnara/article/details/8691049 关键字: open var run nginx pid failed 产生原因:添加模块,重编译 ...
- Linq中Select查询参数提取公共方法
class Program { static void Main(string[] args) { var listTest1 = new List<Test1> { "}, & ...
- CSS3中box-shadow的用法介绍
一般我们通过box-shadow来设置盒阴影,但是有些属性我们一般没有用到,这篇文章将对box-shadow属性进行逐个分析.语法 CSS Code复制内容到剪贴板 E {box-shadow:ins ...
- C++ Template之技巧性基础知识
1.对于T是自定义类型的,如果存在子类型则需要在模版内部加上typename 示例代码: template<typename T> class Myclass { typename T:: ...