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


相关推荐

  • 【转】UIAutomation

    UIAutomation  UIAutomation是微软从WindowsVista开始推出的一套全新UI自动化测试技术,简称UIA。在最新的WindowsSDK中,UIA和MSAA等其它支持UI自动化技术的组件放在一起发布,叫做WindowsAutomationAPI。  和前面的介绍相比,我倾向于认为UIA是一项自动化测试“技术”,而MSAA和Win32API只是实现自动化…

    2022年4月5日
    279
  • idea初使用之配置使用maven仓库

    idea初使用之配置使用maven仓库

    2022年2月21日
    47
  • 测试用例要素_用例是什么

    测试用例要素_用例是什么测试用例分层每个测试用例都有1个或多个测试步骤(List[step]),每个测试步骤对应一个API请求或其他用例的引用。从上图分析,我们可以看到testsuite中包含了3个测试用例,testca

    2022年7月31日
    7
  • 奇怪的现象:touchesBegan: 与UITapGestureRecognizer手势没有人响应 以及set方法的妙用

    奇怪的现象:touchesBegan: 与UITapGestureRecognizer手势没有人响应 以及set方法的妙用本打算实现一个点击按钮弹出一个landKindView然后点击屏幕其他部分时移除这个VIew,没想到的是,出了诸多不可思议的问题。在给这个控制器的View添加手势时,然后居然拦截不到,touchesbegin方法,然后又试了下添加tapGesture,依旧是没有反应。然后我试着在touchesBegin方法中 实现[supertouchesBegins….];依旧是没有任

    2022年7月25日
    10
  • 登录令牌 Token 介绍

    登录令牌 Token 介绍

    2021年11月3日
    54
  • [渝粤教育] 徐州工业职业技术学院 橡胶原材料 参考 资料「建议收藏」

    [渝粤教育] 徐州工业职业技术学院 橡胶原材料 参考 资料「建议收藏」教育-橡胶原材料-章节资料考试资料-徐州工业职业技术学院【】课程认知随堂测验1、【多选题】下列制品可采用橡胶材料制作的是。A、轮胎B、鞋子底C、输送带D、婴儿奶嘴参考资料【】2、【多选题】硫化体系主要包括。A、硫化剂B、促进剂C、活性剂D、防焦剂参考资料【】3、【判断题】橡胶是一种材料,它在大的形变下能迅速而有力恢复其形变,能够被改性(硫化)。A、正确B、错误参考资料【】4、【判断题】生胶是一种高弹性高聚物材料,是制造橡胶制品的基础材料,一

    2022年10月2日
    3

发表回复

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

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