SHA1摘要算法

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;
    }
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值