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 删除。