import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import org.apache.log4j.Logger;
/**
* @描述: SHA1 摘要算法实现类
* @版权: Copyright (c) 2017
* @公司:
* @作者: nieli
* @版本: 1.0
* @创建日期: 2017年10月11日
* @创建时间: 下午4:41:11
*/
public class SHA1
{
private static Logger logger = Logger.getLogger(SHA1.class);
//SHA1标准byte入参
public String getSHA1(byte[] source, boolean isUpperCase)
{
try
{
if ( source.length == 0 )
throw new Exception("接收到的byte为空,返回null");
//指定sha1算法
java.security.MessageDigest digest = java.security.MessageDigest.getInstance("SHA-1");
digest.update(source);
//获取字节数组
byte tmp[] = digest.digest();
StringBuffer hexString = new StringBuffer();
// 字节数组转换为 十六进制 数
for (int i = 0; i < tmp.length; i++)
{
String shaHex = Integer.toHexString(tmp[i] & 0xFF);
if ( shaHex.length() < 2 )
{
hexString.append(0);
}
hexString.append(shaHex);
}
if ( isUpperCase )
return hexString.toString().toUpperCase();
else
return hexString.toString().toLowerCase();
}
catch (Exception e)
{
logger.error("获取sha出错,返回null", e);
return null;
}
}
/**
* @描述: String字符串SHA1加密
* @作者: nl
* @时间: 2017年10月11日 下午4:37:03
* @param inStr
* @return upper String
*/
public String getSHA1ofStr(String inStr)
{
return getSHA1(inStr.getBytes(), true);
}
/**
* @描述: String字符串SHA1加密,自定义大小写结果
* @作者: nieli
* @时间: 2017年10月11日 下午4:37:03
* @param inStr
* @param isUpperCase
* @return String
*/
public String getSHA1ofStr(String inStr, boolean isUpperCase)
{
return getSHA1(inStr.getBytes(), isUpperCase);
}
/**
* @描述: Map对象SHA1加密(格式:"str=1&str2=2...";key升序,返回结果小写)
* @作者: nieli
* @时间: 2017年10月11日 下午4:35:12
* @param inMap
* @return lower String
*/
public String getSHA1ofMap(Map<String, Object> inMap)
{
return getSHA1ofStr(MapToString(makeMapSort(inMap, true)), false);
}
/**
* @描述: Map对象SHA1加密(格式:"str=1&str2=2...";自定义字典序;自定义大小写返回)
* @作者: nieli
* @时间: 2017年10月11日 下午4:34:25
* @param inMap 加密map对象
* @param isAsc true:升序|false:降序
* @param isUpper true:大写|false:小写
* @return String
*/
public String getSHA1ofMap(Map<String, Object> inMap, boolean isAsc, boolean isUpper)
{
return getSHA1ofStr(MapToString(makeMapSort(inMap, isAsc)), isUpper);
}
/**
* Map.key按字典序排序
* @param maps
* @param isAsc true:升序,false:降序
* @return maps after sort
*/
private Map<String, Object> makeMapSort(Map<String, Object> maps, final boolean isAsc)
{
logger.debug("SHA1加密Map排序前:" + maps.toString());
List<Map.Entry<String, Object>> keys = new ArrayList<Map.Entry<String, Object>>(maps.entrySet());
// 对所有传入参数按照字段名的 ASCII 码从小到大排序(字典序)
Collections.sort(keys, new Comparator<Map.Entry<String, Object>>()
{
public int compare(Map.Entry<String, Object> o1, Map.Entry<String, Object> o2)
{
//升序
if ( isAsc )
return (o1.getKey()).toString().compareTo(o2.getKey());
//降序
else
return (o2.getKey()).toString().compareTo(o1.getKey());
}
});
maps = new LinkedHashMap<String, Object>();
for (Entry<String, Object> entry : keys)
maps.put(entry.getKey(), entry.getValue());
logger.debug("SHA1加密Map排序后:" + maps.toString());
return maps;
}
/**
* @描述: Map转自定义String
* @作者: nieli
* @时间: 2017年10月11日 下午3:48:51
* @param maps
* @return String mapStr
*/
private String MapToString(Map<String, Object> maps)
{
StringBuilder paramStr = new StringBuilder();
for (Entry<String, Object> entry : maps.entrySet())
{
if ( maps.get(entry.getKey()) != null )
{
paramStr.append("&" + entry.getKey());
if ( entry.getValue() != null )
paramStr.append("=" + String.valueOf(entry.getValue()));
}
}
//返回截断第一位&符号
String mapStr = paramStr.toString().substring(1);
logger.debug("SHA1加密Map转换String结果为:" + mapStr);
return mapStr;
}
}
SHA1摘要算法
最新推荐文章于 2021-02-12 13:28:38 发布