hmac 签名_em球衣签名

hmac 签名_em球衣签名在提供第三方接口的时候,我们需要确认:1.消息未被其他人篡改(签名和验证签名)2.从消息中确认第三方的身份(appid)因为hash是不可逆的,所以签名的过程是不可逆的;HMACSHA1是从SHA1哈希函数构造的一种键控哈希算法,被用作HMAC(基于哈希的消息验证代码)。此HMAC进程将密钥与消息数据混合,使用哈希函数对混合结果进行哈希计算,将所得哈希值与该密钥混…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全家桶1年46,售后保障稳定

在提供第三方接口的时候,我们需要确认:

1.消息未被其他人篡改(签名和验证签名)

2.从消息中确认第三方的身份(appid)

因为hash是不可逆的,所以签名的过程是不可逆的;

HMACSHA1 是从 SHA1 哈希函数构造的一种键控哈希算法,被用作 HMAC(基于哈希的消息验证代码)。 此 HMAC 进程将密钥与消息数据混合,使用哈希函数对混合结果进行哈希计算,将所得哈希值与该密钥混合,然后再次应用哈希函数。 输出的哈希值长度为 160 位。

在发送方和接收方共享机密密钥的前提下,HMAC 可用于确定通过不安全信道发送的消息是否已被篡改。 发送方计算原始数据的哈希值,并将原始数据和哈希值放在一个消息中同时传送。 接收方重新计算所接收消息的哈希值,并检查计算所得的 HMAC 是否与传送的 HMAC 匹配。

因为更改消息和重新生成正确的哈希值需要密钥,所以对数据或哈希值的任何更改都会导致不匹配。 因此,如果原始的哈希值与计算得出的哈希值相匹配,则消息通过身份验证。

SHA-1(安全哈希算法,也称为 SHS、安全哈希标准)是由美国政府发布的一种加密哈希算法。 它将从任意长度的字符串生成 28位长的字符串。

签名采用HmacSHA1算法 + Base64,编码采用:UTF-8参考代码如下:

String sign = sign(accessSecret + "&", stringToSign.toString());

 

public static String sign(String accessSecret, String stringToSign) throws Exception {

javax.crypto.Mac mac = javax.crypto.Mac.getInstance("HmacSHA1");

mac.init(new javax.crypto.spec.SecretKeySpec(accessSecret.getBytes("UTF-8"), "HmacSHA1"));

byte[] signData = mac.doFinal(stringToSign.getBytes("UTF-8"));

return new sun.misc.BASE64Encoder().encode(signData);

}

 

附加完整的Java签名Demo代码(摘自阿里短信验证):

其中随机字符串的作用是:主要保证签名不可预测;

public class SignDemo {

 

public static void main(String[] args) throws Exception {

String accessKeyId = "testId";

String accessSecret = "testSecret";

 

java.text.SimpleDateFormat df = new java.text.SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");

df.setTimeZone(new java.util.SimpleTimeZone(0, "GMT"));// 这里一定要设置GMT时区

 

java.util.Map<String, String> paras = new java.util.HashMap<String, String>();

// 1. 系统参数

paras.put("SignatureMethod", "HMAC-SHA1");

paras.put("SignatureNonce", java.util.UUID.randomUUID().toString());

paras.put("AccessKeyId", accessKeyId);

paras.put("SignatureVersion", "1.0");

paras.put("Timestamp", df.format(new java.util.Date()));

paras.put("Format", "XML");

 

// 2. 业务API参数

paras.put("Action", "SendSms");

paras.put("Version", "2017-05-25");

paras.put("RegionId", "cn-hangzhou");

paras.put("PhoneNumbers", "15300000001");

paras.put("SignName", "阿里云短信测试专用");

paras.put("TemplateParam", "{\"customer\":\"test\"}");

paras.put("TemplateCode", "SMS_71390007");

paras.put("OutId", "123");

 

// 3. 去除签名关键字Key

if (paras.containsKey("Signature"))

paras.remove("Signature");

 

// 4. 参数KEY排序

java.util.TreeMap<String, String> sortParas = new java.util.TreeMap<String, String>();

sortParas.putAll(paras);

 

// 5. 构造待签名的字符串

java.util.Iterator<String> it = sortParas.keySet().iterator();

StringBuilder sortQueryStringTmp = new StringBuilder();

while (it.hasNext()) {

String key = it.next();

sortQueryStringTmp.append("&").append(specialUrlEncode(key)).append("=").append(specialUrlEncode(paras.get(key)));

}

String sortedQueryString = sortQueryStringTmp.substring(1);// 去除第一个多余的&符号

 

StringBuilder stringToSign = new StringBuilder();

stringToSign.append("GET").append("&");

stringToSign.append(specialUrlEncode("/")).append("&");

stringToSign.append(specialUrlEncode(sortedQueryString));

 

String sign = sign(accessSecret + "&", stringToSign.toString());

// 6. 签名最后也要做特殊URL编码

String signature = specialUrlEncode(sign);

 

System.out.println(paras.get("SignatureNonce"));

System.out.println("\r\n=========\r\n");

System.out.println(paras.get("Timestamp"));

System.out.println("\r\n=========\r\n");

System.out.println(sortedQueryString);

System.out.println("\r\n=========\r\n");

System.out.println(stringToSign.toString());

System.out.println("\r\n=========\r\n");

System.out.println(sign);

System.out.println("\r\n=========\r\n");

System.out.println(signature);

System.out.println("\r\n=========\r\n");

// 最终打印出合法GET请求的URL

System.out.println("http://dysmsapi.aliyuncs.com/?Signature=" + signature + sortQueryStringTmp);

}

 

public static String specialUrlEncode(String value) throws Exception {

return java.net.URLEncoder.encode(value, "UTF-8").replace("+", "%20").replace("*", "%2A").replace("%7E", "~");

}

 

public static String sign(String accessSecret, String stringToSign) throws Exception {

javax.crypto.Mac mac = javax.crypto.Mac.getInstance("HmacSHA1");

mac.init(new javax.crypto.spec.SecretKeySpec(accessSecret.getBytes("UTF-8"), "HmacSHA1"));

byte[] signData = mac.doFinal(stringToSign.getBytes("UTF-8"));

return new sun.misc.BASE64Encoder().encode(signData);

}

 

}

`

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/209843.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 兼职程序员一般可以从什么平台接私活?(程序员不上班接私活可行吗)

    程序员除了在公司上班之外,有时候也需要接私活赚些外快补贴家用,那么国内有哪些渠道可以提供大量的职位呢?笔者从16年接私活以来,积累了一些靠谱的方法推荐给大家,以下是几个国内主流并且不同业务类型的平台,供大家筛选:1、BAT级程序员技术众包平台-猿急送 (https://www.yuanjisong.com/)【概况】这个是国内比较早做技术众包的平台,包括单个的开发型任务,比如PHP开发…

    2022年4月16日
    71
  • Xshell 7 提示 “要继续使用此程序,您必须应用最新的更新或使用新版本”

    Xshell 7 提示 “要继续使用此程序,您必须应用最新的更新或使用新版本”Xshell7忽然不能用,提示“”要继续使用此程序,您必须应用最新的更新或使用新版本“”解决办法:修改电脑的系统时间。右下角日期-右键“调整日期/时间(A)”-手动设置日期和时间-将日期调整到2017年即可。之前Xshell6和Xshell5也会包这样的错误,是因为xshell比较傻叉,需要你强制更新到最近版本否则就不能使用。也解决办法就是找到xshell的解决目录,用UE打开nslicense.dll文件:xshell6和xshell5解决的具体步骤步骤1:下载U…

    2022年7月15日
    101
  • requires php ~7.1 -> your PHP version (7.0.18) does not satisfy that requirement

    requires php ~7.1 -> your PHP version (7.0.18) does not satisfy that requirement

    2021年10月20日
    50
  • 群环域,理想商环,原根复习

    群环域,理想商环,原根复习包含了抽象代数里面的一些概念,最近看文章的时候一直反映不过来,理想是个啥来着,环和域的区别是啥来着。所以统筹整理一下。集合/(Set):一个集合GGG表示一组数据有限集合:G={a1,a2,…,an},∣G∣=nG=\{a_1,a_2,…,a_n\},|G|=nG={a1​,a2​,…,an​},∣G∣=n无穷集合:G={a1,a2,…},∣G∣=∞G=\{a_1,a_2,…\},|G|=\infinG={a1​,a2​,…},∣G∣=∞一个班级的所有学生半群/(Mo

    2022年6月18日
    36
  • 经典Servlet+JSP+JavaBean开发模式(MVC)原理与创建工程

    经典Servlet+JSP+JavaBean开发模式(MVC)原理与创建工程

    2021年7月18日
    63
  • B样条曲线(B-spline Curves)

    B样条曲线(B-spline Curves)关键字:NURBS,基函数,控制点,节点,另一个讲的很好的https://www.cnblogs.com/icmzn/p/5100761.html看了网上很多相关资料才得以下笔,资料太多,这里就不一一列举了,感谢各位大佬的资料本博客顺序不太好,看前面的东西可能需要提前看后面的东西。正在努力修炼,敬请谅解写了个B样条曲线计算的完成程序,包括绘图,https://download.c…

    2022年6月18日
    33

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号