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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 逻辑

    逻辑

    2022年1月13日
    38
  • 数据库的唯一索引_数据库唯一索引是什么

    数据库的唯一索引_数据库唯一索引是什么唯一索引是不允许表中任何两行具有相同索引值的索引。  当现有的数据中存在重复的键值时,大多数数据库不允许把新创建的唯一索引与表一起保存。数据库还可能防止添加将在表中创建重复键值的新数据。主键索引数据库表经常有一列或列组合,其值唯一标识表中的每一行。该列称为表的主键。在数据库关系图中为表定义主键将自动创建主键索引,主键索引是唯一索引的特定类型。该索引要求主键中的每个值都唯一。当在查询中使用主键

    2026年1月29日
    4
  • python 0xff_正在解压缩“0xff”与“\xff”[通俗易懂]

    python 0xff_正在解压缩“0xff”与“\xff”[通俗易懂]我试图用wave库从wave文件中读取二进制数据。数据以’\x0f\x06\x0a…’的形式读取和报告,我想把十六进制数转换成整数(你知道,以10为基数)。我把这些字符当作十六进制字符来处理,但我并没有把这些字符当作十六进制字符来处理。在importwaveimportstructpath=”C:\\directory\\file.wav”file=wave.open(path,’r’)dat…

    2022年6月19日
    32
  • 少儿编程网站有哪些(少儿编程哪家好)

    20个热门少儿编程网站【2019】转载之本文链接:https://blog.csdn.net/shebao3333/article/details/85317936少儿编程是新的文化潮流,它涵盖了儿童学习的方方面面:逻辑思维训练、系统化思考训练、问题解决能力训练、团队协作、创造性思维培养…你可以利用我们整理的这些得到广泛认可的少儿编程网站教孩子学会编程,例如code.org、tynker.c…

    2022年4月18日
    40
  • 图像尺度空间理论_16位灰度图像

    图像尺度空间理论_16位灰度图像《SIFT原理与源码分析》系列文章索引:http://blog.csdn.net/xiaowei_cqu/article/details/8069548尺度空间理论自然界中的物体随着观测尺度不同有不同的表现形态。例如我们形容建筑物用“米”,观测分子、原子等用“纳米”。更形象的例子比如Google地图,滑动鼠标轮可以改变观测地图的尺度,看到的地图绘制也不同;还有电影中的拉

    2022年10月9日
    4
  • 2019年5月25更新——“运动世界校园”软件破解

    一、软件工作原理软件和后台使用API进行交互,在早期版本中API没有鉴权导致可以通过伪造请求来完成跑步,但是后期API迭代了好几个版本,目前认为现在的请求需要间隔一个合理的时间差(跑步时间),而且需要计算一个token用来鉴权,避免了伪造请求。 跑步开始和跑步完成时,会记录时间、设备序列号、IMEI等敏感信息,上传服务器。此操作用来记录手机设备唯一性,用来检测频繁换手机,一台设备上登陆不同账…

    2022年4月7日
    200

发表回复

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

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