java實現SHA1簽名加密
阿新 • • 發佈:2019-01-01
公司需要開發一個對外介面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(); }