前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >java实现SHA1签名加密

java实现SHA1签名加密

作者头像
用户7741497
发布2022-08-09 15:32:24
3.5K0
发布2022-08-09 15:32:24
举报
文章被收录于专栏:hml_知识记录

Sign计算规则:

参数示例:

identityType:1Sign计算规则:

参数示例:

identityType:1

identityValue:440901197709194316

month:201601

1. 将参数与secret一起根据参数名进行字典排序,然后按照排序后顺序将参数名与参数值依次拼接成字符串

若secret:B6F74A83BACF97D5AC24AE6573A4C8AA703F98D9,则拼接的字符串为:

appKey2582535051identityType1identityValue440901197709194316month201601secretB6F74A83BACF97D5AC24AE6573A4C8AA703F98D9

2.对拼接字符串使用sha1算法得到长度40字符串,并转换为大写得到sign:

CEF10F6E922E976E462C18BF35E7CA3F23088B83

SHA1算法实现及详解,请参看博客http://blog.csdn.net/dingwood/article/details/7506620

现将需求实现代码写下:

public class Sha1 {

/**

* 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){

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()));

}

}

}

return paramStr.toString();

}

————————————————

版权声明:本文为CSDN博主「晴枫慕竹」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/u012105931/article/details/51088312

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系转载前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档