链接地址的签名生成过程
签名的作用
校验url中对外暴露的参数传输过程中是否被篡改。生成url的时候,通过对其中的[全部或部分]参数+私钥进行MD5加密处理生成一个签名,将生成的签名一起放入url中,这样一个带有签名的url生成了。在需要校验url的时候,取出加密是所用的参数,将这些参数+私钥再次生成一个签名,对比签名是否一致,一致即url没有被篡改。【能实现的根本原因就是有一个他人获取不到的私钥】。
签名的生成
1.url地址:http://[ip]:[port]/method?pid=1233&uid=9344&price=99 2.参数列表:pid=1233&uid=9344&price=99&time_stamp=1532333455 3.加入key[自己生成的私钥]: pid=1233&uid=9344&price=99&time_stamp=1532333455&key=DEE334FGEER4 4.参数排序:sort(pid=1233&uid=9344&price=99&key=DEE334FGEER4&time_stamp=1532333455); 5.MD5加密[使用盐值更安全]:sign = md5(pid=1233&uid=9344&price=99&key=DEE334FGEER4&time_stamp=15323334554);
简单代码实现
public static void main(String[] args) {
HashMap<String,String> paramMap = new HashMap<>(8);
paramMap.put("pid","1233");
paramMap.put("uid","9344");
paramMap.put("price","99");
paramMap.put("time_stamp","1532333455");
paramMap.put("key","DEE334FGEER4");
String sign = SignUtil.getSignContent(paramMap);
System.out.println(SignUtil.getMD5Str(sign));
}
public class SignUtil {
public static String getSignContent(Map<String, String> sortedParams) {
StringBuffer content = new StringBuffer();
ArrayList keys = new ArrayList(sortedParams.keySet());
Collections.sort(keys);
int index = 0;
for(int i = 0; i < keys.size(); ++i) {
String key = (String)keys.get(i);
String value = sortedParams.get(key);
if(StringUtils.isNotBlank(key)) {
content.append("&" + key + "=" + value);
}
}
return content.substring(1);
}
public static String getMD5Str(String str) {
MessageDigest messageDigest;
try {
messageDigest = MessageDigest.getInstance("MD5");
messageDigest.reset();
messageDigest.update(str.getBytes("UTF-8"));
byte[] byteArray = messageDigest.digest();
StringBuffer md5StrBuff = new StringBuffer();
for (int i = 0; i < byteArray.length; i++) {
if (Integer.toHexString(0xFF & byteArray[i]).length() == 1)
md5StrBuff.append("0").append(Integer.toHexString(0xFF & byteArray[i]));
else
md5StrBuff.append(Integer.toHexString(0xFF & byteArray[i]));
}
return md5StrBuff.toString().toUpperCase();
} catch (NoSuchAlgorithmException e) {
// logger.error("NoSuchAlgorithmException caught!",e);
// System.exit(-1);
} catch (UnsupportedEncodingException e) {
// logger.error("UnsupportedEncodingException",e);
}
return null;
}
}