搜尋
首頁後端開發php教程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需要透過演算法產生
  • 鍵值對的具體描述參見官方文件。
逐一擊破

請求簽名一共需要7個值,下面一一講解,各個擊破

q-sign-algorithm

簽名演算法,官方目前僅支援sha1,因此直接給值即可

q-ak

帳戶ID,即使用者的SecretId,可以在控制台 雲API金鑰 頁面取得

q-sign-time

目前簽章的有效起止時間,Unix時間戳記格式,英文半角分號 ; 分割,格式如 1480932292;1481012298

q-key-time

#與q-sign-time 值相同

q-header-list

個人理解,由HTTP請求頭組成,取全部或部分請求頭,將 key:value 形式的請求項目的key 部分取出,轉換小寫,多個key 按字典排序,以字元 ; 連接,最終組成字串

如原始請求頭有兩個:

Host: bucket1-1254000000.cos.ap-beijing.myqcloud.com

Content-Type:image/jpeg


key 就是Host 和Content-Type,運算後輸出 content-type;

##q-url-param-list

個人瞭解,由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.1

Host: bucket1-1254000000.cos.ap-beijing.myqcloud.com

x-cos-content-sha1: 7b502c3a1f48c8609cosae#212136099613609cos -class: standard

Hello world


計算簽章後應該得到的HTTP請求:

PUT /testfile2 HTTP/1.1
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=14e6ebd7955b0c6da532151bf97045e2c5a64e10

Hello world

結論:算法如果能得到Authorization 後的那一字串字串即為正確

準備工作

來看一下(官方提供的)使用者資訊以及HTTP資訊:

  • SecretId:AKIDQjz3ltompVjBni5LitkWHFlFpwkn9U5q

  • SecretKey:BQYIM75p8x0iWVFSIgqEKwFprpRSVHlz

  • 簽名有效起始時間:1417773892

  • 簽名有效時間:1417773892

  • 簽名有效時間: 1417853898

  • HTTP原始請求頭:根據上一節範例不難得到HTTP原始請求有三個內容Host、x-cos-content-sha1 和x-cos-storage-class

HTTP請求參數:是PUT 請求,沒有?參數

計算簽章

##將準備工作中的各項參數帶入請求簽章規則,不難就可以得到結果,如下表:

##值(value)備註q-sign-algorithmsha1目前僅支援sha1 簽章演算法q-akAKIDQjz3ltompVjBni5LitkWHFlFpwkn9U5q#SecretId 欄位##1417773892;14178538981417773892;1417853898 #q-header-listhost;x-cos-content-sha1;x-cos-storage-classq-url-param-listHTTP 參數清單為空q-signature
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

HTTP 頭部key 的字典順序排序清單
###14e6ebd7955b0c6da532151bf97045e2c5a64e10######透過程式計算所得#############

但 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 = &#39;&#39;;

 //compute signature
 $httpMethod = &#39;put&#39;;
 $httpUri = $fileUri;

 //与 q-url-param-list 相同
 $httpParameters = $url_param_list;

 //将自定义请求头分解为 & 连接的字符串
 $headerString = get_http_header_string( $headers );

 // 计算签名中的 signature 部分
 $signTime = $qSignTime;
 $signKey = hash_hmac(&#39;sha1&#39;, $signTime, $secretKey);
 $httpString = "$httpMethod\n$httpUri\n$httpParameters\n$headerString\n";
 $sha1edHttpString = sha1($httpString);
 $stringToSign = "sha1\n$signTime\n$sha1edHttpString\n";
 $signature = hash_hmac(&#39;sha1&#39;, $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 組成有序字串,程式碼如下:

/**
 * 按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(&#39;;&#39;, $tmpArray);
 }
 catch(Exception $error){
  return false;
 }
}

$url-param-list 上面講過,這個值是HTTP請求參數,對於PUT 方法沒有? 參數,自然值為空,所以程式碼中「偷懶」直接給了空字串。

Signature 的計算和需要小心的地方##官方已經給出了完整的演算法,PHP 甚至還有寫好的程式碼,應該是很幸福了(但!由於看官方文件看的頭暈還是踩了坑,隨後一起說明),先看一下signature 的「格式」:

SignKey = HMAC-SHA1(SecretKey,"[q-key-time]")
HttpString = [HttpMethod]\n[HttpURI]\n[HttpParameters]\n[HttpHeaders]\n

# StringToSign = [q-sign-algorithm]\n[q-sign-time]\nSHA1-HASH(HttpString)\n
Signature = HMAC-SHA1(SignKey,StringToSign)

再來看看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);

$signTime:很簡單,起止時間組成的字串,從上文拿來直接用
$ signKey:HMAC-SHA1 演算法直接計算即可


$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(&#39;&&#39;, $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中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
PHP的目的:構建動態網站PHP的目的:構建動態網站Apr 15, 2025 am 12:18 AM

PHP用於構建動態網站,其核心功能包括:1.生成動態內容,通過與數據庫對接實時生成網頁;2.處理用戶交互和表單提交,驗證輸入並響應操作;3.管理會話和用戶認證,提供個性化體驗;4.優化性能和遵循最佳實踐,提升網站效率和安全性。

PHP:處理數據庫和服務器端邏輯PHP:處理數據庫和服務器端邏輯Apr 15, 2025 am 12:15 AM

PHP在數據庫操作和服務器端邏輯處理中使用MySQLi和PDO擴展進行數據庫交互,並通過會話管理等功能處理服務器端邏輯。 1)使用MySQLi或PDO連接數據庫,執行SQL查詢。 2)通過會話管理等功能處理HTTP請求和用戶狀態。 3)使用事務確保數據庫操作的原子性。 4)防止SQL注入,使用異常處理和關閉連接來調試。 5)通過索引和緩存優化性能,編寫可讀性高的代碼並進行錯誤處理。

您如何防止PHP中的SQL注入? (準備的陳述,PDO)您如何防止PHP中的SQL注入? (準備的陳述,PDO)Apr 15, 2025 am 12:15 AM

在PHP中使用預處理語句和PDO可以有效防範SQL注入攻擊。 1)使用PDO連接數據庫並設置錯誤模式。 2)通過prepare方法創建預處理語句,使用佔位符和execute方法傳遞數據。 3)處理查詢結果並確保代碼的安全性和性能。

PHP和Python:代碼示例和比較PHP和Python:代碼示例和比較Apr 15, 2025 am 12:07 AM

PHP和Python各有優劣,選擇取決於項目需求和個人偏好。 1.PHP適合快速開發和維護大型Web應用。 2.Python在數據科學和機器學習領域佔據主導地位。

PHP行動:現實世界中的示例和應用程序PHP行動:現實世界中的示例和應用程序Apr 14, 2025 am 12:19 AM

PHP在電子商務、內容管理系統和API開發中廣泛應用。 1)電子商務:用於購物車功能和支付處理。 2)內容管理系統:用於動態內容生成和用戶管理。 3)API開發:用於RESTfulAPI開發和API安全性。通過性能優化和最佳實踐,PHP應用的效率和可維護性得以提升。

PHP:輕鬆創建交互式Web內容PHP:輕鬆創建交互式Web內容Apr 14, 2025 am 12:15 AM

PHP可以輕鬆創建互動網頁內容。 1)通過嵌入HTML動態生成內容,根據用戶輸入或數據庫數據實時展示。 2)處理表單提交並生成動態輸出,確保使用htmlspecialchars防XSS。 3)結合MySQL創建用戶註冊系統,使用password_hash和預處理語句增強安全性。掌握這些技巧將提升Web開發效率。

PHP和Python:比較兩種流行的編程語言PHP和Python:比較兩種流行的編程語言Apr 14, 2025 am 12:13 AM

PHP和Python各有優勢,選擇依據項目需求。 1.PHP適合web開發,尤其快速開發和維護網站。 2.Python適用於數據科學、機器學習和人工智能,語法簡潔,適合初學者。

PHP的持久相關性:它還活著嗎?PHP的持久相關性:它還活著嗎?Apr 14, 2025 am 12:12 AM

PHP仍然具有活力,其在現代編程領域中依然佔據重要地位。 1)PHP的簡單易學和強大社區支持使其在Web開發中廣泛應用;2)其靈活性和穩定性使其在處理Web表單、數據庫操作和文件處理等方面表現出色;3)PHP不斷進化和優化,適用於初學者和經驗豐富的開發者。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
4 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
4 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
4 週前By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
1 個月前By尊渡假赌尊渡假赌尊渡假赌

熱工具

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

EditPlus 中文破解版

EditPlus 中文破解版

體積小,語法高亮,不支援程式碼提示功能

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

將Eclipse與SAP NetWeaver應用伺服器整合。