方法
1.接口签名
public class SignUtils {
/**
* 生成时间戳
* */
public static String getTimestamp() {
long timestampLong =System.currentTimeMillis();
String timestampStr = String.valueOf(timestampLong);
return timestampStr;
}
/**
* 生成随机字符串
* @param length 长度
*
* */
public static String getNonceStr(int length){
String str="zxcvbnmlkjhgfdsaqwertyuiopQWERTYUIOPASDFGHJKLZXCVBNM1234567890";
Random random=new Random();
StringBuffer randomStr=new StringBuffer();
for(int i=0; i<length; ++i){
int number=random.nextInt(62);
randomStr.append(str.charAt(number));
}
return randomStr.toString();
}
/**
* 接口的签名生成方法
* @param params 参数
* @param privateKey 秘钥
* */
public static String createSign(Map<String, String> params, String privateKey){
StringBuilder sb = new StringBuilder();
// 将参数以参数名的字典升序排序
Map<String, String> sortParams = new TreeMap<String, String>(params);
for (Map.Entry<String, String> entry : sortParams.entrySet()) {
String key = entry.getKey();
String value = entry.getValue().trim();
if (!StringUtils.isEmpty(value)){
sb.append("&").append(key).append("=").append(value);
}
}
String stringA = sb.toString().replaceFirst("&","");
String stringSignTemp = stringA + "&"+"appsecret="+privateKey;
//将签名使用MD5加密并全部字母变为大写
//String signValue = Md5Utils.hash(stringSignTemp);
String signValue = Md5Utils.hash(stringSignTemp).toUpperCase();
return signValue;
}
}
/**
* Md5加密方法
*/
public class Md5Utils{
private static final Logger log = LoggerFactory.getLogger(Md5Utils.class);
private static byte[] md5(String s)
{
MessageDigest algorithm;
try
{
algorithm = MessageDigest.getInstance("MD5");
algorithm.reset();
algorithm.update(s.getBytes("UTF-8"));
byte[] messageDigest = algorithm.digest();
return messageDigest;
}
catch (Exception e)
{
log.error("MD5 Error...", e);
}
return null;
}
private static final String toHex(byte hash[])
{
if (hash == null)
{
return null;
}
StringBuffer buf = new StringBuffer(hash.length * 2);
int i;
for (i = 0; i < hash.length; i++)
{
if ((hash[i] & 0xff) < 0x10)
{
buf.append("0");
}
buf.append(Long.toString(hash[i] & 0xff, 16));
}
return buf.toString();
}
public static String hash(String s)
{
try
{
return new String(toHex(md5(s)).getBytes(StandardCharsets.UTF_8), StandardCharsets.UTF_8);
}
catch (Exception e)
{
log.error("not supported charset...{}", e);
return s;
}
}
}
总结
1.将所有的参数拼接,并按照字典正序排序。
2.使用md5 进行加密处理。
3.秘钥可通过配置自定义配置获取,进行复用。
4.使用时间戳是为了防止重复提交。
5.使用随机数是为了验证参数不被篡改。
6.MD5的工具类是若依项目的,希望对你有用哦!!!
版权声明:本文为weixin_40050628原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。