前言
最近工作中频繁和其他部门甚至公司进行接口上的对接,不免接触到林林总总的签名验权算法。其中属HMAC-SHA1签名算法最多,刚开始接触的时候我也觉得有一点懵,慢慢搞清楚了原理,所以在这里跟大家如何理解这种签名算法中涉及到的各种各样的东西。

扫盲:
首先做个简单的扫盲
1、md5(md家族)
Message Digest Algorithm 缩写为MD,消息摘要算法,一种被广泛使用的密码散列函数。
2、sha1(sha家族)
secure hash algorithm 缩写为SHA,密码散列函数。能计算出一个数字消息所对应到的,长度固定的字符串(又称消息摘要)的算法,其实也就是我们常说的加密串长度固定。
上述这些算法(md,sha)之所以称作安全算法基于以下两点:
(1)由消息摘要反推原输入消息,从计算理论上来说是很困难的。说白了就是不可逆。
(2)想要找到两组不同的消息对应到相同的消息摘要,从计算理论上来说是很困难的。任何对输入消息的变动,都会很高概率导致其产生的消息摘要迥异。说白了,就是加密串碰撞度较低,并且内容有微调,秘钥串生成差异化也很大。
3、hamc
HMAC:散列消息身份验证码 Hashed Message Authentication Code 。它不是散列函数,而是采用了将MD5或SHA1散列函数与共享机密秘钥(与公钥/秘钥对不同)一起使用的消息身份验证机制。消息与秘钥组合并运行散列函数(md5或sha1),然后运行结果与秘钥组合并再次运行散列函数。
目前hmac主要应用在身份验证中,在用户登录传递密码的过程中可以利用,签名来防止密码明文传递。
可参看该文:http://blog.csdn.net/yasi_xi/article/details/19968449
讲到这里大家应该就能明白了,HMAC-SHA1简要来说,就是采用sha1算法,与HMAC机制相结合,制造出更加难以破解的加密串。
hash_hmac
在php中hash_hmac函数就能将HMAC和一部分哈希加密算法相结合起来实现HMAC-SHA1  HMAC-SHA256 HMAC-MD5等等算法。函数介绍如下:

string hash_hmac(string $algo, string $data, string $key, bool $raw_output = false)
algo:要使用的哈希算法名称,可以是上述提到的md5,sha1等
data:要进行哈希运算的消息,也就是需要加密的明文。
key:使用HMAC生成信息摘要是所使用的密钥。
raw_output:该参数为可选参数,默认为false,如果设为true,则返回原始二进制数据表示的信息摘要,否则返回16进制小写字符串格式表示的信息摘要(注意是16进制数,而非简单的字母加数字)。

另外:如果algo参数指定的不是受支持的算法,将返回false。
应用:
一般来讲,目前最流行的接口签名方式,是采用hash_hamc('sha1')方法;
1、将 Accesskey(公钥)和Secretkey(私钥)简称ak,sk,告知客户端(或接口调用者)
2、按照接口提供方的要求,提取出需要加密的消息串。比如uri;
3、通过hash_hamc('sha1',uri,Secretkey);得到签名;
3'、一般而言接口提供方,都会要求对加密串进行base64urlencode,防止签名串被特殊字符分割,导致验证无法通过。
4、将签名注入http协议头中;$headerArr[] = 'accessToken:'.$akey.":".$ret;
5、发送请求即可。

以下是完整的php demo代码:

$akey = "66a66666da6666666d66aa6a6aa6a6a66a666aa6";
$url = "http://api.xxx.com/web/api/xxx/xxx?u=".$u;
$uri = "/web/api/xxx/xxx?u=".$u."\n";
$SecretKey = '999999999999999999999999999999aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa';
$str  = hash_hmac("sha1", $uri, $SecretKey);
$signature = base64UrlEncode($hex);
$headerArr = array();
$headerArr[] = 'accessToken:'.$akey.":".$ret;
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headerArr);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_BINARYTRANSFER, true);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
$return = curl_exec($ch);
curl_close($ch);function base64UrlEncode($str)
{$find = array('+', '/');$replace = array('-', '_');return str_replace($find, $replace, base64_encode($str));
}

总结:
HMAC-SHA1是我在工作中接触到的最流行的一种加密算法,这里讲了如何一步步去理解这种加密算法,以及如何正确的使用hash_hmac函数来得到正确的加密串。
--------------------- 
作者:dengjiexian 
来源:CSDN 
原文:https://blog.csdn.net/dengjiexian123/article/details/53313913 
版权声明:本文为博主原创文章,转载请附上博文链接!

php中使用hash_hmac函数实现HMAC-SHA1签名算法的来龙去脉相关推荐

  1. PHP hash_hmac与python hmac sha1匹配

    因为不同语言,对应加密的规则有些许不同.然后这个问题在度娘上也搜不到一个正确的答案,特此记录一下. 1.首先双方基本算法需要一致,这里都以sha1为基本规则 2.python部分,如果是使用diges ...

  2. hash_hmac函数使用不当造成的安全问题

    2019独角兽企业重金招聘Python工程师标准>>> 近期有国外安全人员挖掘到api.wordpress.org的一个RCE漏洞,可以影响到远程更新的Wordpress网站.Wor ...

  3. C语言hmacsha1,在C中执行hmac sha1

    我正在尝试生成Hmac-sha1的一小段代码.我被要求使用用于SHA1计算的OpenSSL库自己编码hmac实现. 后"wiki'ing的算法,这里是我有什么below.I已经使用的输入与R ...

  4. php字符长度函数漏洞 ctf,CTF中常见php-MD5()函数漏洞

    CTF中常见php-MD5()函数漏洞 1.数字与字符串之间的比较 var_dump( 0 == "a" ); var_dump( "0" == "a ...

  5. Zcash中的hash函数

    1. 引言 Zcash中的hash函数主要有: BLAKE2 Hash Function Group Hash into Jubjub Pedersen Hash Function Mixing Pe ...

  6. OpenCV 相机校正过程中,calibrateCamera函数projectPoints函数的重投影误差的分析

    OpenCV 校正过程中,calibrateCamera函数的ret和重投影误差的分析 OpenCV对相机进行校正的过程中,校正返回值retval和重投影误差的计算公式表示和分析. OpenCV 校正 ...

  7. Iar环境c语言调用汇编函数,如何在IAR EWARM中通过内联汇编程序在另一个模块中调用C函数?...

    我在硬故障处理程序中有一些程序集.程序集基本上是为了传递当前堆栈指针作为参数(在R0中).它看起来像这样...如何在IAR EWARM中通过内联汇编程序在另一个模块中调用C函数? __asm(&quo ...

  8. C++11 :STL中的 iota ()函数

    该函数是C++11 才引入,之前版本没有此函数. iota 函数是一个计算机语言中的函数,用于产生连续的值.该函数得名自 APL 语言,其中用来产生从 1 开始的连续数值. 该函数位于头文件#incl ...

  9. Matlab中的lsqcurvefit函数的使用

    Matlab中的lsqcurvefit函数的使用 lsqcurvefit函数 调用示例 lsqcurvefit函数 非线性曲线拟合是已知输入向量xdata和输出向量ydata,并且知道输入与输出的函数 ...

最新文章

  1. 人工智能先锋人物杰夫·辛顿说:“深度学习将无所不能”
  2. 揭秘鸿蒙系统中的 JS 开发框架
  3. 比特币现金压力测试超越了24小时创造新纪录
  4. VMRC控制台的连接已断开..正在尝试重新连接
  5. 【NET CORE微服务一条龙应用】第三章 认证授权与动态权限配置
  6. 延长计算机屏幕显示时间,非充电状态下延长计算机使用时间的小诀窍!
  7. Web攻防之XSS,CSRF,SQL注入
  8. The authenticity of host '0.0.0.0 (0.0.0.0)' can't be established.
  9. 学习《PythonWeb开发实战(董伟明)》中文PDF+源代码
  10. 大数据平台设计哲学的重构
  11. [How to] ROOT, Backup Flash (MTKDroidTools, Spflashtool, CWM)
  12. 我们被大数据改变着的生活
  13. SCI论文的构思与常用结构
  14. Angular JS introduce
  15. react 数据可视化_使用d3创建数据可视化并在2020年做出React
  16. linux 磁盘整理命令,Ubuntu磁盘整理命令汇总
  17. 微信支付应用签名修改后多久可以生效?
  18. zcmu-1930帽子戏法
  19. Resource not found问题
  20. THz:短距离室内电信上的研究

热门文章

  1. 自己的JS 监听器。用于选择文字
  2. 谁能给我提供一个类似下面的网站模板,先谢了
  3. 中石油训练赛 - Flow Finder(树上模拟)
  4. CodeForces - 1359E Modular Stability(组合数学)
  5. HDU - 3804 Query on a tree(树链剖分+线段树+离线处理)
  6. Pandas条件筛选 | Python技能树征题
  7. 排序算法-08基数排序(python实现)
  8. c语言中table函数,Excel的TABLE函数是什么意思?
  9. 大数据 就业 缺口_大数据人才缺口大!乌兰察布从政策激励等方面吸引人才
  10. [luogu5142]区间方差