php中使用hash_hmac函数实现HMAC-SHA1签名算法的来龙去脉
前言
最近工作中頻繁和其他部門甚至公司進行接口上的對接,不免接觸到林林總總的簽名驗權算法。其中屬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等等算法。函數介紹如下:
另外:如果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签名算法的来龙去脉的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Nginx模块学习之————access
- 下一篇: Range回源和视频拖拽播放