package com.nationalelectric.greenH5.identityAuth.util; import com.nationalelectric.greenH5.identityAuth.util.devon.Assertion; import com.nationalelectric.greenH5.identityAuth.util.devon.secure.Md5Utils; import javax.servlet.http.HttpServletRequest; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; import java.util.Enumeration; import java.util.HashMap; import java.util.Map; import java.util.TreeMap; /** * HMAC: upperCase(hash(urlEncode(query + "&appKey=MyAppKey", "UTF-8"))) * * @author ZhengDaHong@fzfx * @since 2018/1/31 17:02 * @see javax.crypto.Mac Don't use Java standard algorithmn, because of not in favor of cross-platform */ // TODO: 2018/4/3 Add 'timestamp' factor to expiration validation //public abstract class SignatureUtils { public class SignatureUtils2 { private static final String ENCODING = "UTF-8"; static final String PARAMETER_SIGNATURE = "signature"; static final String PARAMETER_SIGNATURE_TYPE = "signatureType"; private static final String[] NON_SIGNATURE_FACTORS = { PARAMETER_SIGNATURE }; public static String aaa(){ return "aaa"; } /** * Convenience method for {@link #buildSignature(TreeMap, String, SignatureType)} to accepting any {@code Map}s * @since 2018/04/19 11:42 */ public static String buildSignature2(Map orderingMap, String appKey, String signatureType) throws Exception { System.out.println("10000000000000000"); TreeMap orderingMapToUse; System.out.println("123333334354ty53uterhfgsd"); if(orderingMap instanceof TreeMap){ System.out.println(";lkjhgfdsadfghgf"); orderingMapToUse = (TreeMap) orderingMap; } else{ System.out.println("auisldasdkasfsjk"); orderingMapToUse = new TreeMap(orderingMap); } // return buildSignature3(orderingMapToUse, appKey, signatureType); return buildSignature4(orderingMapToUse, appKey, signatureType); // return aaa(); } public static String buildSignature4(TreeMap orderingMap, String appKey, String signatureType) { StringBuilder stringToSign = new StringBuilder(orderingMap.size() * 10); boolean first = true; outer: for (Map.Entry entry : orderingMap.entrySet()) { for (String nonSignatureFactor : NON_SIGNATURE_FACTORS) { if(nonSignatureFactor.equals(entry.getKey())){ continue outer; } } if(!first){ stringToSign.append('&'); }else{ first = false; } stringToSign.append(entry.getKey()).append('=').append(entry.getValue()); } stringToSign.append("&appKey=").append(appKey); try { // 通过URL-encoding得到ASCII字符(兼容),因此不惧在任何时候的getBytes() return Md5Utils.md5WithUpperCase(URLEncoder.encode(stringToSign.toString(), ENCODING)); } catch (Exception impossible) { return null; } } public static String buildSignature3(TreeMap orderingMap, String appKey, String signatureType) { StringBuilder stringToSign = new StringBuilder(orderingMap.size() * 10); boolean first = true; outer: for (Map.Entry entry : orderingMap.entrySet()) { for (String nonSignatureFactor : NON_SIGNATURE_FACTORS) { if(nonSignatureFactor.equals(entry.getKey())){ continue outer; } } if(!first){ stringToSign.append('&'); }else{ first = false; } stringToSign.append(entry.getKey()).append('=').append(entry.getValue()); } stringToSign.append("&appKey=").append(appKey); switch (signatureType){ case "MD5":{ try { // 通过URL-encoding得到ASCII字符(兼容),因此不惧在任何时候的getBytes() return Md5Utils.md5WithUpperCase(URLEncoder.encode(stringToSign.toString(), ENCODING)); } catch (UnsupportedEncodingException impossible) { } } default: return null; } } }