SignUtil
最近接的新项目 加密比较多 我就记录下。
SignUtil是jnewsdk-mer-1.0.0.jar com.jnewsdk.util中的一个工具类。由于我没有百度到对应的信息。所以我只能看源码了。。百度不到,使我成长。
恩恩。。
我们先来看parseParam
public static Map parseParam(HttpServletRequest request)
{
Map map = new HashMap();
//request.getParameterNames()方法是将发送请求页面中form表单里所有具有name属性的表单对象获取(包括button).
// 返回一个Enumeration类型的枚举.
Enumeration paramsEnum = request.getParameterNames();
//boolean hasMoreElements( )
//测试此枚举是否包含更多的元素
while (paramsEnum.hasMoreElements())
{
// Object nextElement( )
//如果此枚举对象至少还有一个可提供的元素,则返回此枚举的下一个元素
String paramName = (String)paramsEnum.nextElement();
//根据Name得到Value
String paramValue = request.getParameter(paramName);
map.put(paramName, paramValue);
}
return map;
}
所以,这个方法其实就是把request请求变为key,value的格式。
public static Map parseResponse(String msg)
{
Map map = new HashMap();
int beginIndex = 0;
int endIndex = 0;
String key;
//for(;;) 这是一个死循环,用来等待中断
for (;;)
{
//判断"="第一次出现的值
endIndex = msg.indexOf("=", beginIndex);
key = null;
value = null;
//enindex小于0 那么就是"="不存在这个msg中,就返回null的map
//endindex等于0也是返回null的map
if (endIndex <= beginIndex) {
return map;
}
//截取0到“=”之前的值
key = msg.substring(beginIndex, endIndex); //得到“=”之后一位的下标值
beginIndex = endIndex + 1; if (beginIndex >= msg.length())
{
map.put(key, "");
return map;
}
//判断"="后面是“{”吗》
if (msg.charAt(beginIndex) == '{') {
//得到“}”的位置+1
endIndex = msg.indexOf("}", beginIndex) + 1;
} else {
endIndex = msg.indexOf("&", beginIndex);
}
if (endIndex < beginIndex) {
break;
}
value = msg.substring(beginIndex, endIndex);
map.put(key, value); beginIndex = endIndex + 1;
}
String value = msg.substring(beginIndex);
map.put(key, value); return map;
}
这个也是把响应变为Map
/**
* 得到url的参数
* @param map
* @param isSort 是否升序
* @param removeKey 需要除掉的参数集合
* @return
*/
public static String getURLParam(Map map, boolean isSort, Set removeKey)
{
StringBuffer param = new StringBuffer();
List msgList = new ArrayList();
//判断Map中是否有值
for (Iterator it = map.keySet().iterator(); it.hasNext();)
{
//得到Map中的键
String key = (String)it.next();
//得到MAP中的值
String value = (String)map.get(key);
//如果需要去掉的Key是null 或者不包含
if ((removeKey == null) || (!removeKey.contains(key))) {
//就把 key=value存入List
msgList.add(key + "=" + StringUtils.toEmpty(value));
}
}
//是否进行升序
if (isSort) {
Collections.sort(msgList);
}
for (int i = 0; i < msgList.size(); i++)
{ //获取到List的值 并用&进行拼接
String msg = (String)msgList.get(i);
if (i > 0) {
param.append("&");
}
param.append(msg);
//也就是这样。。。
//key=value&key=value
//是不是觉得很熟悉 好像就是我们http传参就是这么做的。
}
return param.toString();
}
/**
* 封装了之前的getURLParam方法 。
* 区别就是这个排序一定是升序的
* @param map
* @param removeKey
* @return
*/
public static String getSignMsg(Map map, Set removeKey)
{
return getURLParam(map, true, removeKey);
}
/**
*
* @param signMethod 加密格式 例:MD5 或者 SHA1这样子。。。
* @param signedMsg 需要加密的信息
* @param key
* @param charSet 字符集 例 “UTF-8”
* @return
*/
public static String sign(String signMethod, String signedMsg, String key, String charSet)
{
try
{ //根据字符集获取拼接字节
byte[] data = (signedMsg + key).getBytes(charSet);
String[] algArray = { "MD5", "SHA1", "SHA256", "SHA512" };
String algorithm = null;
for (int i = 0; i < algArray.length; i++) {
//判断传进来的signMethod是否和algArray中定义的一样
//注:equalsIgnoreCase 比较的是两个字符和长度是否一样
//一样就返回true
if (algArray[i].equalsIgnoreCase(signMethod))
{
algorithm = algArray[i];
break;
}
}
if (StringUtils.isEmpty(algorithm))
{
LogFactory.getLog().error(SignUtil.class, "签名方法错误signMethod=[" + signMethod + "]");
return null;
}
//注 :这里就已经给他加密了 Base64位数
return new String(Base64.encode(new MessageDigest(algorithm).sign(data)));
}
catch (Exception e)
{
LogFactory.getLog().error(SignUtil.class, e);
}
return null;
}
接下我补一下 Base64.encode(new MessageDigest(algorithm).sign(data)
我知道 为什么叫做Base64加密 也就是基于64的加密
我在源码上看到了
private static char[] alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".toCharArray();
恩 ,接下来 是
Base64.encode 这个方法。
public static char[] encode(byte[] data)
{
char[] out = new char[(data.length + 2) / 3 * 4];
int i = 0;
for (int index = 0; i < data.length; index += 4)
{
boolean quad = false;
boolean trip = false;
int val = 0xFF & data[i];
val <<= 8;
if (i + 1 < data.length)
{
val |= 0xFF & data[(i + 1)];
trip = true;
}
val <<= 8;
if (i + 2 < data.length)
{
val |= 0xFF & data[(i + 2)];
quad = true;
}
out[(index + 3)] = alphabet[64];
val >>= 6;
out[(index + 2)] = alphabet[64];
val >>= 6;
out[(index + 1)] = alphabet[(val & 0x3F)];
val >>= 6;
out[index] = alphabet[(val & 0x3F)];
i += 3;
}
return out;
}
有没有看到的大佬 帮我解释下 上面的这段代码 我对于 位运算 一直处于懵逼状态。所以我就只能贴我自己测试的结果了 。
以下是我测试的结果
package com.example.demo; import java.io.UnsupportedEncodingException;
import java.util.Enumeration;
import java.util.Vector; public class EnumerationTest {
private static char[] alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".toCharArray();
public static void main(String args[]){ String name ="123456";
byte[] b_utf8 =new byte[265];
try {
b_utf8 = name.getBytes("UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
System.out.println("UTF-8=======>>"+ EnumerationTest.encode(b_utf8)); ;
char[] test=EnumerationTest.encode(b_utf8);
for (int i=0;i<test.length;i++){
System.out.print(test[i]);
}
}
public static char[] encode(byte[] data)
{
char[] out = new char[(data.length + 2) / 3 * 4];
int i = 0;
for (int index = 0; i < data.length; index += 4)
{
boolean quad = false;
boolean trip = false;
int val = 0xFF & data[i];
val <<= 8;
if (i + 1 < data.length)
{
val |= 0xFF & data[(i + 1)];
trip = true;
}
val <<= 8;
if (i + 2 < data.length)
{
val |= 0xFF & data[(i + 2)];
quad = true;
}
out[(index + 3)] = alphabet[64];
val >>= 6;
out[(index + 2)] = alphabet[64];
val >>= 6;
out[(index + 1)] = alphabet[(val & 0x3F)];
val >>= 6;
out[index] = alphabet[(val & 0x3F)];
i += 3;
}
return out;
}
}
结果是:
所以我得出结论 这是进行加密的。
这是signUtil中最后的一个方法了 。。
/**
*
*
* @param signMethod
* @param signedMsg
* @param mac
* @param key
* @param charSet
* @return
*/
public static boolean verifySign(String signMethod, String signedMsg, String mac, String key, String charSet)
{
try
{
if ((StringUtils.isEmpty(mac)) || (StringUtils.isEmpty(signedMsg))) {
return false;
}
return mac.equalsIgnoreCase(sign(signMethod, signedMsg, key, charSet));
}
catch (Exception e)
{
LogFactory.getLog().error(SignUtil.class, e);
}
return false;
}
哎 历时两天 我终于看完了 大致也知道了每个方法是做什么的。这是我第一次自己尝试阅读源码。之前都是看大佬的博客。
加油!!!!希望不对的 大家指出来 我们一起进步呀!!!
SignUtil的更多相关文章
- Java微信公众平台接口封装源码分享
前言: 这篇博客是在三月初动手项目的时候准备写的,但是为了完成项目只好拖延时间写这篇博客,顺便也可以在项目中应用我自己总结的的一些经验.今天看来,这些方法的应用还是可以的,至少实现了我之前的 ...
- 微信调用照相拍照等 js 接口的权限配置 和 照片上传和下载实现
直接上代码: 1. 前端调试代码: <html> <head> <meta http-equiv="Content-Type" content=&qu ...
- 微信测试服务器验证sha1加密法,工具类
1 package org.fc.Util; import java.security.MessageDigest; import java.security.NoSuchAlgorithmExcep ...
- 微信公众平台自动回复wechatlib.jar的生成及wechatlib解析
微信公众平台出来有一段时日了,官方提供的自动回复的接口调用大致是这么些类型(text/image/location/link),每个项目都如此拷贝代码,在笔者看来比较麻烦,今天乘着点闲暇的时间特意将这 ...
- JAVA实现 springMVC方式的微信接入、实现消息自动回复
前段时间小忙了一阵,微信公众号的开发,从零开始看文档,踩了不少坑,也算是熬过来了,最近考虑做一些总结,方便以后再开发的时候回顾,也给正在做相关项目的同学做个参考. 思路 微信接入:用户消息和开发者需要 ...
- SSH框架构建微信公众帐号服务器小技巧
SSH框架构建微信公众帐号服务器小技巧 熟悉struts2和servlet的同学应该清楚,struts2的方法多样性弥补了servlet单一的doGet 和doPost方法.如果自己的公众账号服务器是 ...
- 第四篇 :微信公众平台开发实战Java版之完成消息接受与相应以及消息的处理
温馨提示: 这篇文章是依赖前几篇的文章的. 第一篇:微信公众平台开发实战之了解微信公众平台基础知识以及资料准备 第二篇 :微信公众平台开发实战之开启开发者模式,接入微信公众平台开发 第三篇 :微信公众 ...
- 第二篇 :微信公众平台开发实战Java版之开启开发者模式,接入微信公众平台开发
第一部分:微信公众号对接的基本介绍 一.填写服务器配置信息的介绍 登录微信公众平台官网后,进入到公众平台后台管理页面. 选择 公众号基本设置->基本配置 ,点击“修改配置”按钮,填写服务器地址( ...
- (转)微信公众平台开发之基于百度 BAE3.0 的开发环境搭建(采用 Baidu Eclipse)
原文传送门(http://blog.csdn.net/bingtianxuelong/article/details/17843111) 版本说明: V1: 2014-2-13 ...
随机推荐
- Access数据类型和.NET数据类型映射
下表列出了 Microsoft Access 和这些数据类型与 Microsoft.NET Framework 数据类型与 OleDbType 枚举的方式中使用的最常见的数据类型. 访问类型名称 数据 ...
- UNIX网络编程——分析一帧基于UDP的TFTP协议帧
下图是UDP的段格式: 相比TCP段格式,UDP要简单得多,也没啥好说的,需要注意的是UDP数据长度指payload加上首部的长度. 下面分析一帧基于UDP的TFTP协议帧: 以太网首部 0000: ...
- 《java入门第一季》之HashSet小案例:获取10个1至20的随机数,要求随机数不能重复
这是基于HashSet集合的唯一性. /* * 编写一个程序,获取10个1至20的随机数,要求随机数不能重复. * * 分析: * A:创建随机数对象 * B:创建一个HashSet集合 ...
- JAVA之旅(十)——异常的概述,Try-Catch,异常声明Throws,多异常处理,自定义异常,Throw和Throws的区别
JAVA之旅(十)--异常的概述,Try-Catch,异常声明Throws,多异常处理,自定义异常,Throw和Throws的区别 不知不觉,JAVA之旅这个系列已经更新到第十篇了,感觉如梦如幻,时间 ...
- java的制作"时间账本"
一直以来我都感觉自己的时间过得好荒废啊,貌似只是打开了一个网页链接的时间,一个下午便过去了:仿佛就是看了看空间,刷了刷微信,一天就过去了.哈,当然这是夸张的说法.但是我仔细地算了一下,大概我们每个人每 ...
- Java异常处理示例
翻译人员: 铁锚 翻译日期: 2013年11月22日 原文链接: Java Exception Handling Example 本文中有两个示例, 第一个演示了所有调用其他方法的地方,都必须处理被调 ...
- (四十八)Quartz2D引擎进阶
图形上下文栈: 应用,修改过上下文后,下一次画会在这个基础上进行,如果清空状态,需要上下文栈. 可以先把原来的上下文保存起来,然后恢复: - (void)drawRect:(CGRect)rect { ...
- Asp.Net中使用JQueryEasyUI--善良公社项目
jQuery UI 是以 jQuery 为基础的开源 JavaScript 网页用户界面代码库.包含底层用户交互.动画.特效和可更换主题的可视控件.我们可以直接用它来构建具有很好交互性的web应用程序 ...
- javascript语法之String对象
学习String类就是学习它的一些方法,主要用到方法全部罗列出来.如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transition ...
- 【Python】Talk Python To Me Podcast播客
这是Python相关的一个播客,通过播客的形式给大家讲述python那点事,相关的链接都会列出来,有一些是由文本内容的,如果听不太懂就看看英文原文.不fanqiang的情况下,网页打开没有问题,但是播 ...