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)
上一篇 2025年7月31日 下午4:22
下一篇 2025年7月31日 下午5:01


相关推荐

  • LinkedHashMap和HashMap的区别

    LinkedHashMap和HashMap的区别HashMapHashM 是一个散列表 它存储的内容是键值对 key value 映射 HashMap 继承于 AbstractMap 实现了 Map Cloneable java io Serializable 接口 HashMap 的实现不是同步的 这意味着它不是线程安全的 它的 key value 都可以为 null 其中 HashMap 最多只允许一条记录的键为 Null 允许多条记录的值为 Null

    2026年3月26日
    2
  • 直和和直积_什么是直积举个例子

    直和和直积_什么是直积举个例子今天又在文章中看到直和和直积的概念,顺手baidu了一下,粘贴下来,其实以前矩阵论有讲过的。。。还是到用的时候印象最深。![在这里插入图片描述](https://img-blog.csdnimg.cn/20200609171605249.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80ODA5NDczMg==,size_…

    2025年6月14日
    6
  • Orchard编写网上商店模块2

    Orchard编写网上商店模块2其他操作按照 http www ideliverable com blog page 3 博客中步骤操作就可以下面说说需要注意的几点 widget 的创建在 Models 下添加一个继承自 ContentPart 的空类 创建一个包含 Display 的 Driver Placement info 添加 Place Migration cs 中定义内容类型 WithPart 新创建的类

    2026年3月16日
    2
  • interrupt interrupted_interrupt的用法

    interrupt interrupted_interrupt的用法(一).关于interrupt()    interrupt()并不直接中断线程,而是设定一个中断标识,然后由程序进行中断检查,确定是否中断。    1.sleep()&interrupt()    线程A正在使用sleep()暂停着:Thread.sleep(100000);    如果要取消他的等待状态,可以在正在执行的线程里(比如这里是B)调用a.interr

    2025年7月16日
    4
  • Supplier JAVA_Java 8 Supplier 使用

    Supplier JAVA_Java 8 Supplier 使用Java8Supplie 使用在 Java8 Supplier 是一个函数接口 它没有参数 返回了一个 T 查了下字典 supplier 被翻译成 供应商 那么它到底供应了啥呢 从代码上看 就是供应了一个任意对象 T 呗 下面我们去看看几个 DEMO 吧 思考 写 JDK 代码的大神们 为什么取名叫 Supplier 为啥不叫 Vendor 或者 Provider 呢 我想了很久 packagejava u

    2026年3月18日
    2
  • 轻松实现在web页面中直接播放rtsp视频流「建议收藏」

    轻松实现在web页面中直接播放rtsp视频流「建议收藏」帮你轻松实现在页面中直接播放rtsp视频流使用准备ffmpeg运行rtsp2web前端代码课外知识写在前面我之前研究在web中直接播放rtsp视频流时,写过一篇文章:【前端】rtsp与rtmp视频流的播放方法。阅读这篇文章对你的学习有很大帮助。在文章中我有过详细的分析和解读,给出了结论:要想在web中实时播放rtsp视频流:借助后端转码推流将是必要的操作。实现我用node.js实现了转码推流的功能,并将其打包成rtsp2web发布到了npm上。……

    2022年10月10日
    4

发表回复

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

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