PHP產生騰訊雲COS介面所需的請求簽名的相關內容
這篇文章主要介紹了使用PHP 創建COS 接口所需要的請求簽名,與官方文檔給出的示例做比較,驗證算法的正確性,需要的朋友可以參考下
COS與請求簽章是什麼
COS 是騰訊雲物件儲存的縮寫及簡稱,請求簽章是第三方在呼叫COS相關介面時需要按需提供的、經過特定演算法建立而成的一組字串訊息,將唯一的標識當前第三方身份,提供通訊雙方的身份識別,只有有效的簽名COS才會提供服務
##目標
#使用PHP 建立COS 介面所需的請求簽名,與官方文件給出的範例做比較,驗證演算法的正確性認識請求簽章##先來看一條官方文件給出的請求簽名的樣子
q-sign-algorithm=sha1&q-ak=[SecretID]&q-sign-time=[SignTime]&q-key-time=[KeyTime ]&q-header-list=[SignedHeaderList]&q-url-param-list=[SignedParameterList]&q-signature=[Signature]#是一串字串##請求簽名特徵總結
- key=value的鍵值對格式,key為固定值
- 總共有7對key =value
- sha1也是參數,但截止到官方發文只支援sha1,因此可以直接賦值
- SignedHeaderList、SignedParameterList、Signature三個value需要透過演算法產生
- 鍵值對的具體描述參見官方文件。
Host: bucket1-1254000000.cos.ap-beijing.myqcloud.com
Content-Type:image/jpeg##q-url-param-list
key 就是Host 和Content-Type,運算後輸出 content-type;
個人瞭解,由HTTP請求參數組成,取全部或部分請求參數,將 key=value 形式的請求參數的key 部分取出,轉換小寫,多個key 依字典排序,以字元 ; 連接,最終組成字串
如原始HTTP請求為:
GET /?prefix=abc&max-keys=20
key 是prefix 和max-keys,經過運算後輸出 max-keys;prefix,如果請求沒有參數例如put、post,此處即為空q-signature
根據HTTP內容計算簽名,演算法由COS提供,只需按要求給值
官方範例及參考結果
在開始編寫邏輯之前,先看一下官方範例給出的參考值,以及經過計算後的結果,以便和自己開發的邏輯進行結果比對
HTTP原始請求,也可以理解為計算簽名前或不需要簽名時的HTTP請求:
PUT /testfile2 HTTP/1.1Host: bucket1-1254000000.cos.ap-beijing.myqcloud.com
x-cos-content-sha1: 7b502c3a1f48c8609cosae#212136099613609cos -class: standardHello world
計算簽章後應該得到的HTTP請求:結論:算法如果能得到Authorization 後的那一字串字串即為正確準備工作來看一下(官方提供的)使用者資訊以及HTTP資訊:PUT /testfile2 HTTP/1.1
Hello world
Host: bucket1-1254000000.cos.ap-beijing.myqcloud.com
x-cos-content-sha1: 7b502c3a1f48c8609cosae#212136099613609cos -class: standard
Authorization: q-sign-algorithm=sha1&q-ak=AKIDQjz3ltompVjBni5LitkWHFlFpwkn9U5q&> q-sign-time=1417773892;1417853898827853898273892;1417853898838738298989382020982-200098382-20982-200982-2098209838200982-200983029000989300 =host;x-cos-content -sha1;x-cos-storage-class&q-url-param-list=&q-signature=14e6ebd7955b0c6da532151bf97045e2c5a64e10HTTP請求參數:是PUT 請求,沒有?參數 計算簽章
- SecretId:AKIDQjz3ltompVjBni5LitkWHFlFpwkn9U5q
- SecretKey:BQYIM75p8x0iWVFSIgqEKwFprpRSVHlz
- 簽名有效起始時間:1417773892
- 簽名有效時間:1417773892
- 簽名有效時間: 1417853898
- HTTP原始請求頭:根據上一節範例不難得到HTTP原始請求有三個內容Host、x-cos-content-sha1 和x-cos-storage-class
##將準備工作中的各項參數帶入請求簽章規則,不難就可以得到結果,如下表:
###14e6ebd7955b0c6da532151bf97045e2c5a64e10######透過程式計算所得#############
##值(value) 備註 q-sign-algorithm sha1 目前僅支援sha1 簽章演算法 q-ak AKIDQjz3ltompVjBni5LitkWHFlFpwkn9U5q ##1417773892;1417853898#SecretId 欄位 1417773892;1417853898 2014/12/5 18:04:52 到2014/12/6 16:18:18 q- key-time 2014/12/5 18:04:52 到2014/12/6 16:18:18 #q-header-list q-url-param-listhost;x-cos-content-sha1;x-cos-storage-class
HTTP 頭部key 的字典順序排序清單q-signature HTTP 參數清單為空 但 q-signature 怎麼來的?
剛才說到,q-signature 也需要特定演算法計算得來,以下就說明如何計算
計算請求簽章
##先看程式碼:為了測試,該方法參數應該是多過需要了,前六個參數是已經給出的,是來自用戶的,因此直接賦值即可得到下邊字串:/** * 计算签名 * secretId、secretKey 为必需参数,qSignStart、qSignEnd为调试需要,测试通过后应取消,改为方法内自动创建 */ function get_authorization( $secretId, $secretKey, $qSignStart, $qSignEnd, $fileUri, $headers ){ /* * 计算COS签名 * 2018-05-17 * author:cinlap <cash216@163> * ref:https://cloud.tencent.com/document/product/436/7778 */ $qSignTime = "$qSignStart;$qSignEnd"; //unix_timestamp;unix_timestamp $qKeyTime = $qSignTime; $header_list = get_q_header_list($headers); //如果 Uri 中带有 ?的请求参数,该处应为数组排序后的字符串组合 $url_param_list = ''; //compute signature $httpMethod = 'put'; $httpUri = $fileUri; //与 q-url-param-list 相同 $httpParameters = $url_param_list; //将自定义请求头分解为 & 连接的字符串 $headerString = get_http_header_string( $headers ); // 计算签名中的 signature 部分 $signTime = $qSignTime; $signKey = hash_hmac('sha1', $signTime, $secretKey); $httpString = "$httpMethod\n$httpUri\n$httpParameters\n$headerString\n"; $sha1edHttpString = sha1($httpString); $stringToSign = "sha1\n$signTime\n$sha1edHttpString\n"; $signature = hash_hmac('sha1', $stringToSign, $signKey); //组合结果 $authorization = "q-sign-algorithm=sha1&q-ak=$secretId&q-sign-time=$qSignTime&q-key-time=$qKeyTime&q-header-list=$header_list&q-url-param-list=$url_param_list&q-signature=$signature"; return $authorization; }登入後複製$authorization = "q-sign-algorithm=sha1&q-ak=$secretId&q-sign-time=$qSignTime&q-key-time=$qKeyTime...$header_list 這個值要符合q-header-list
規則因此需要計算,邏輯是上文已經描述,是從既定的請求項中抽出key 組成有序字串,程式碼如下:
$url-param-list 上面講過,這個值是HTTP請求參數,對於PUT 方法沒有? 參數,自然值為空,所以程式碼中「偷懶」直接給了空字串。/** * 按COS要求对header_list内容进行转换 * 提取所有key * 字典排序 * key转换为小写 * 多对key=value之间用连接符连接 * */ function get_q_header_list($headers){ if(!is_array($headers)){ return false; } try{ $tmpArray = array(); foreach( $headers as $key=>$value){ array_push($tmpArray, strtolower($key)); } sort($tmpArray); return implode(';', $tmpArray); } catch(Exception $error){ return false; } }登入後複製Signature 的計算和需要小心的地方##官方已經給出了完整的演算法,PHP 甚至還有寫好的程式碼,應該是很幸福了(但!由於看官方文件看的頭暈還是踩了坑,隨後一起說明),先看一下signature 的「格式」:
SignKey = HMAC-SHA1(SecretKey,"[q-key-time]")HttpString = [HttpMethod]\n[HttpURI]\n[HttpParameters]\n[HttpHeaders]\n$signTime = $qSignTime;# StringToSign = [q-sign-algorithm]\n[q-sign-time]\nSHA1-HASH(HttpString)\n
再來看看Signature 的完整演算法:
Signature = HMAC-SHA1(SignKey,StringToSign)$signKey = hash_hmac('sha1', $signTime, $secretKey);$ signKey:HMAC-SHA1 演算法直接計算即可$httpString = "$httpMethod \n$httpUri\n$httpParameters\n$headerString\n";
$signTime:很簡單,起止時間組成的字串,從上文拿來直接用
$sha1edHttpString = sha1($httpString);
$stringToSign = "sha1\n$signTime\n$sha1edHttpString\n";
$signature = hash_hmac('sha1', $stringToSign, $signKey);
$httpString:四個部分組成需要分開說
1、$httpMethod:HTTP請求方法,小寫,例如put、get# 2、$httpUri:HTTP請求的URI部分,從「/」虛擬根開始,如/testfile 說明在儲存桶根目錄下建立一個叫testfile 的文件,/image/face1.jpg 說明在根目錄/image目錄下建立一個叫face1.jpg 的文件,至於是不是圖片文件,不管
3、$httpParameters:這是第一個需要小心的地方。由HTTP原始請求參數組成,即請求 URI 中 ? 後面的部分,本例調用的是 PUT Object 接口,因此為空。如果不為空,需要把請求參數每一項的key 和value 均轉換小寫,多對key=value 按字典排序並以& 相連接
4、$headerString:這是第二個需要小心的地方,由HTTP 原始請求頭組成,根據請求頭,選擇全部或部分請求頭,把每項的key都轉換為小寫,把value都進行URLEncode轉換,每項格式都改為key=value,然後按照key進行字典排序,最後把它們用連接符號& 組成字串。這是我整理的邏輯,程式碼如下:/** * 按COS要求从数组中获取 Signature 中 [HttpString] 内容 * 标准格式 key=value&key=value&... * 数组元素按键字典排序 * * key转换为小写 * value进行UrlEncode转换 * 转换为key=value格式 * 多对key=value之间用连接符连接 * */ function get_http_header_string($headers){ if(!is_array($headers)){ return false; } try{ $tmpArray = array(); foreach($headers as $key => $value){ $tmpKey = strtolower($key); $tmpArray[$tmpKey] = urlencode($value); } ksort($tmpArray); $headerArray = array(); foreach( $tmpArray as $key => $value){ array_push($headerArray, "$key=$value"); } return implode('&', $headerArray); } catch(Exception $error){ return false; } }登入後複製為什麼要小心?
HTTP原始請求頭和請求參數用在了四個地方,分別是請求簽名裡的q-header-list 和Signature 裡的HttpHeaders——兩者都用到了HTTP原始請求頭;請求簽名裡的q-url-param-list 和Signature 裡的HttpParameters-兩者都用到了HTTP請求參數。一定要確保HTTP請求頭和請求參數所選用的數量和物件一致
相同:產生q-header-list 的HTTP請求頭數和成員要和產生HttpHeaders 的相同,產生q-url-param-list 的HTTP請求參數數量和成員要和產生HttpParameters 的相同
輸出結果和校驗- 不同:q-header-list 和q-url-param-list 只取key 部分,HttpHeaders 和HttpParameters 取key 和value 部分
至此,請求簽章中7個值都有了,有的是來自用戶訊息,有的需要計算,需要計算的上面也給出了所有的計算方法和為什麼如此計算的個人理解。最後只需要按照官方要求輸出即可。看一下
以上是PHP產生騰訊雲COS介面所需的請求簽名的相關內容的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

熱門話題

JWT是一種基於JSON的開放標準,用於在各方之間安全地傳輸信息,主要用於身份驗證和信息交換。 1.JWT由Header、Payload和Signature三部分組成。 2.JWT的工作原理包括生成JWT、驗證JWT和解析Payload三個步驟。 3.在PHP中使用JWT進行身份驗證時,可以生成和驗證JWT,並在高級用法中包含用戶角色和權限信息。 4.常見錯誤包括簽名驗證失敗、令牌過期和Payload過大,調試技巧包括使用調試工具和日誌記錄。 5.性能優化和最佳實踐包括使用合適的簽名算法、合理設置有效期、

靜態綁定(static::)在PHP中實現晚期靜態綁定(LSB),允許在靜態上下文中引用調用類而非定義類。 1)解析過程在運行時進行,2)在繼承關係中向上查找調用類,3)可能帶來性能開銷。

PHP的魔法方法有哪些? PHP的魔法方法包括:1.\_\_construct,用於初始化對象;2.\_\_destruct,用於清理資源;3.\_\_call,處理不存在的方法調用;4.\_\_get,實現動態屬性訪問;5.\_\_set,實現動態屬性設置。這些方法在特定情況下自動調用,提升代碼的靈活性和效率。

在PHP8 中,match表達式是一種新的控制結構,用於根據表達式的值返回不同的結果。 1)它類似於switch語句,但返回值而非執行語句塊。 2)match表達式使用嚴格比較(===),提升了安全性。 3)它避免了switch語句中可能的break遺漏問題,增強了代碼的簡潔性和可讀性。

Altius,一家加密初創公司,近日宣布完成1100萬美元融資,由FoundersFund和PanteraCapital領投。令人矚目的是,Altius在融資消息公佈前僅發布過一條推文,這為其增添了神秘感。究竟是什麼吸引了PanteraCapital等頂級風投機構?答案在於Altius對區塊鏈執行層的創新性重塑。 Altius並非一個傳統的單一公鏈項目,它致力於構建一個模塊化的、即插即用的執行層解決方案——AltiusStack。該解決方案能夠與任何採用虛擬機(VM)機制的公鏈無縫集成

NFT市场回暖迹象!Mocaverse地板价飙升,24小时涨幅高达79%根据OpenSea数据显示,知名NFT项目Mocaverse地板价近期突破2.9ETH,目前价格为2.96ETH(约合11860美元),24小时涨幅惊人,达到79%,最高甚至触及3.49ETH。这一显著增长引发市场广泛关注,NFT市场是否将重现牛市盛况?Mocaverse地板价走势图NFT板块领涨加密市场Coingecko数据显示,过去24小时内,加密市场整体上涨,而NFT板块以8.53%的涨幅位列榜首。部分项目表现尤为

語言多線程可以大大提升程序效率,C 語言中多線程的實現方式主要有四種:創建獨立進程:創建多個獨立運行的進程,每個進程擁有自己的內存空間。偽多線程:在一個進程中創建多個執行流,這些執行流共享同一內存空間,並交替執行。多線程庫:使用pthreads等多線程庫創建和管理線程,提供了豐富的線程操作函數。協程:一種輕量級的多線程實現,將任務劃分成小的子任務,輪流執行。

在macOS上將apscheduler定時任務配置為服務在macOS平台上,如果你想將apscheduler定時任務配置為一個服務,類似於ngin...
