1. 程式人生 > >java實現SHA1簽名加密

java實現SHA1簽名加密


   公司需要開發一個對外介面API,需要用到SHA1安全雜湊演算法,具體需求如下:

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