SHA1 安全加密算法 (微信分享获取签名时使用)
2017-01-13 11:03
495 查看
public class ScottTest {
public static void main(String [] args){
Map<String,Object> maps = new HashMap<String,Object>();
maps.put("jsapi_ticket", "sM4AOVdWfPE4DxkXGEs8VMCPGGVi4C3VM0P37wVUCFvkVAy_90u5h9nbSlYy3-Sl-HhTdfl2fzFy1AOcHKP7qg");
maps.put("noncestr", "Wm3WZYTPz0wzccnW");
maps.put("timestamp", "1414587457");
maps.put("url", "http://mp.weixin.qq.com?params=value");
try {
String str = SHA1(maps);
System.out.println(str);
} catch (DigestException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* SHA1 安全加密算法
* @param maps 参数key-value map集合
* @return
* @throws DigestException
*/
public static String SHA1(Map<String,Object> maps) throws DigestException {
//获取信息摘要 - 参数字典排序后字符串
String decrypt = getOrderByLexicographic(maps);
try {
//指定sha1算法
MessageDigest digest = MessageDigest.getInstance("SHA-1");
digest.update(decrypt.getBytes());
//获取字节数组
byte messageDigest[] = digest.digest();
// Create Hex String
StringBuffer hexString = new StringBuffer();
// 字节数组转换为 十六进制 数
for (int i = 0; i < messageDigest.length; i++) {
String shaHex = Integer.toHexString(messageDigest[i] & 0xFF);
if (shaHex.length() < 2) {
hexString.append(0);
}
hexString.append(shaHex);
}
return hexString.toString().toUpperCase();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
throw new DigestException("签名错误!");
}
}
/**
* 获取参数的字典排序
* @param maps 参数key-value map集合
* @return String 排序后的字符串
*/
private static String getOrderByLexicographic(Map<String,Object> maps){
System.out.println(splitParams(lexicographicOrder(getParamsName(maps)),maps));
//jsapi_ticket=sM4AOVdWfPE4DxkXGEs8VMCPGGVi4C3VM0P37wVUCFvkVAy_90u5h9nbSlYy3-Sl-HhTdfl2fzFy1AOcHKP7qg&noncestr=Wm3WZYTPz0wzccnW×tamp=1414587457&url=http://mp.weixin.qq.com?params=value
//jsapi_ticket=sM4AOVdWfPE4DxkXGEs8VMCPGGVi4C3VM0P37wVUCFvkVAy_90u5h9nbSlYy3-Sl-HhTdfl2fzFy1AOcHKP7qg&noncestr=Wm3WZYTPz0wzccnW×tamp=1414587457&url=http://mp.weixin.qq.com?params=value
return splitParams(lexicographicOrder(getParamsName(maps)),maps);
}
/**
* 获取参数名称 key
* @param maps 参数key-value map集合
* @return
*/
private static List<String> getParamsName(Map<String,Object> maps){
List<String> paramNames = new ArrayList<String>();
for(Map.Entry<String,Object> entry : maps.entrySet()){
paramNames.add(entry.getKey());
}
return paramNames;
}
/**
* 参数名称按字典排序
* @param paramNames 参数名称List集合
* @return 排序后的参数名称List集合
*/
private static List<String> lexicographicOrder(List<String> paramNames){
Collections.sort(paramNames);
return paramNames;
}
/**
* 拼接排序好的参数名称和参数值
* @param paramNames 排序后的参数名称集合
* @param maps 参数key-value map集合
* @return String 拼接后的字符串
*/
private static String splitParams(List<String> paramNames,Map<String,Object> maps){
StringBuilder paramStr = new StringBuilder();
for(String paramName : paramNames){
paramStr.append(paramName);
for(Map.Entry<String,Object> entry : maps.entrySet()){
if(paramName.equals(entry.getKey())){
paramStr.append("="+String.valueOf(entry.getValue())+"&");
}
}
}
paramStr.deleteCharAt(paramStr.length()-1);
return paramStr.toString();
}
}
public static void main(String [] args){
Map<String,Object> maps = new HashMap<String,Object>();
maps.put("jsapi_ticket", "sM4AOVdWfPE4DxkXGEs8VMCPGGVi4C3VM0P37wVUCFvkVAy_90u5h9nbSlYy3-Sl-HhTdfl2fzFy1AOcHKP7qg");
maps.put("noncestr", "Wm3WZYTPz0wzccnW");
maps.put("timestamp", "1414587457");
maps.put("url", "http://mp.weixin.qq.com?params=value");
try {
String str = SHA1(maps);
System.out.println(str);
} catch (DigestException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* SHA1 安全加密算法
* @param maps 参数key-value map集合
* @return
* @throws DigestException
*/
public static String SHA1(Map<String,Object> maps) throws DigestException {
//获取信息摘要 - 参数字典排序后字符串
String decrypt = getOrderByLexicographic(maps);
try {
//指定sha1算法
MessageDigest digest = MessageDigest.getInstance("SHA-1");
digest.update(decrypt.getBytes());
//获取字节数组
byte messageDigest[] = digest.digest();
// Create Hex String
StringBuffer hexString = new StringBuffer();
// 字节数组转换为 十六进制 数
for (int i = 0; i < messageDigest.length; i++) {
String shaHex = Integer.toHexString(messageDigest[i] & 0xFF);
if (shaHex.length() < 2) {
hexString.append(0);
}
hexString.append(shaHex);
}
return hexString.toString().toUpperCase();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
throw new DigestException("签名错误!");
}
}
/**
* 获取参数的字典排序
* @param maps 参数key-value map集合
* @return String 排序后的字符串
*/
private static String getOrderByLexicographic(Map<String,Object> maps){
System.out.println(splitParams(lexicographicOrder(getParamsName(maps)),maps));
//jsapi_ticket=sM4AOVdWfPE4DxkXGEs8VMCPGGVi4C3VM0P37wVUCFvkVAy_90u5h9nbSlYy3-Sl-HhTdfl2fzFy1AOcHKP7qg&noncestr=Wm3WZYTPz0wzccnW×tamp=1414587457&url=http://mp.weixin.qq.com?params=value
//jsapi_ticket=sM4AOVdWfPE4DxkXGEs8VMCPGGVi4C3VM0P37wVUCFvkVAy_90u5h9nbSlYy3-Sl-HhTdfl2fzFy1AOcHKP7qg&noncestr=Wm3WZYTPz0wzccnW×tamp=1414587457&url=http://mp.weixin.qq.com?params=value
return splitParams(lexicographicOrder(getParamsName(maps)),maps);
}
/**
* 获取参数名称 key
* @param maps 参数key-value map集合
* @return
*/
private static List<String> getParamsName(Map<String,Object> maps){
List<String> paramNames = new ArrayList<String>();
for(Map.Entry<String,Object> entry : maps.entrySet()){
paramNames.add(entry.getKey());
}
return paramNames;
}
/**
* 参数名称按字典排序
* @param paramNames 参数名称List集合
* @return 排序后的参数名称List集合
*/
private static List<String> lexicographicOrder(List<String> paramNames){
Collections.sort(paramNames);
return paramNames;
}
/**
* 拼接排序好的参数名称和参数值
* @param paramNames 排序后的参数名称集合
* @param maps 参数key-value map集合
* @return String 拼接后的字符串
*/
private static String splitParams(List<String> paramNames,Map<String,Object> maps){
StringBuilder paramStr = new StringBuilder();
for(String paramName : paramNames){
paramStr.append(paramName);
for(Map.Entry<String,Object> entry : maps.entrySet()){
if(paramName.equals(entry.getKey())){
paramStr.append("="+String.valueOf(entry.getValue())+"&");
}
}
}
paramStr.deleteCharAt(paramStr.length()-1);
return paramStr.toString();
}
}
相关文章推荐
- 微信开发之使用java获取签名signature(贴源码,附工程)
- ionic开发——微信分享准备工作之签名和包名的获取方法
- 微信开发之使用java获取签名signature(贴源码,附工程)
- 使用javascript获取wx.config内部字段解决微信分享
- ASP.NET MVC使用中转站方式获取code实现微信登录,分享功能
- 微信开发之使用java获取签名signature(贴源码,附工程)
- 转:微信开发之使用java获取签名signature(贴源码,附工程)
- 微信链接分享后无法正确获取签名
- PHP+TP框架实现获取微信JS-SDK使用权限签名算法需要的jsapi_ticket,并全局缓存
- 微信自定义分享获取签名
- 微信开发之使用java获取签名signature(贴源码,附工程)
- 微信开发之使用java获取签名signature
- ionic开发——微信分享准备工作之签名和包名的获取方法
- 邮件安全之使用PGP软件对邮件信息进行加密和签名(转载)
- 不使用官方SDK,实现微信分享(发送到朋友,发送到朋友圈)
- 获取android应用签名证书(打包APK用到的那个文件)的SHA1,MD5,SHA256值
- linux系统使用python获取cpu信息脚本分享
- Android 微信分享Api使用详解
- 免费分享全球知名安全软件AVG 使用一年
- iOS应用程序安全(18)-使用Introspy检测自定义签名