検索
ホームページバックエンド開発PHPチュートリアルPHP は Tencent Cloud COS インターフェースに必要なリクエスト署名の関連コンテンツを生成します

この記事では、PHP を使用して COS インターフェイスを作成するために必要なリクエスト署名を主に紹介し、アルゴリズムが正しいかどうかを検証するために公式ドキュメントに示されている例と比較します。

COS とリクエスト署名とは

COS は Tencent Cloud Object Storage の略称であり、リクエスト署名はサードパーティがオンデマンドで提供する必要がある特定のアルゴリズムによって作成されます。 COS 関連インターフェイスの呼び出し。現在のサードパーティ ID を一意に識別し、両方の通信当事者の ID を提供する一連の文字列情報。

#目標

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 のキーと値のペア形式です。キーは固定値

  • キーのペアは合計 7 つあります =value

  • sha1 もパラメータですが、正式リリースの時点では sha1 のみがサポートされているため、直接割り当てることができます

  • SignedHeaderList、SignedParameterList、および Signature の値をアルゴリズムを通じて生成する必要があります

Key-Value の詳細な説明については、ペアについては、公式ドキュメントを参照してください。

1 つずつ説明

署名をリクエストするには、合計 7 つの値が必要です。以下で 1 つずつ説明し、それぞれを説明します。

q-sign-algorithm

署名アルゴリズム、公式 現在サポートされているのは sha1 のみです。値を直接指定してください。

q-ak

ユーザーの SecretId であるアカウント ID は、コンソールで取得できます。 Cloud API Key ページ

q-sign-time

現在の署名の有効な開始時刻と終了時刻、Unix タイムスタンプ形式、英語の半角セミコロンで区切られた形式、1480932292;1481012298 など

q-key-time

q-sign-time valueと同じ

q-header-list

個人的な理解ですが、HTTPリクエストで構成されていますヘッダーを取得し、リクエストヘッダーの全部または一部を取得し、リクエストをkey:valueの形式に変更します。項目のキー部分を取り出し、小文字に変換し、複数のキーを辞書に従ってソートし、文字で接続します。 ; 最終的に文字列を形成します

たとえば、元のリクエスト ヘッダーには次の 2 つがあります:

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

Content -Type:image/jpeg

#key は Host と Content-Type です。操作後、
##q-url-param-list

が出力されます。

個人的な理解では、HTTP リクエスト パラメータで構成され、リクエスト パラメータのすべてまたは一部を取得し、リクエスト パラメータのキー部分を key=value の形式で取り出し、それを小文字に変換します。 複数のキーがソートされます。辞書、文字 ; で接続され、最終的に文字列に形成されます

たとえば、元の HTTP リクエストは次のとおりです:

GET /?prefix=abc&max-keys=20

key は prefix と max-keys です。リクエストに put や post などのパラメータがない場合は、max-keys;prefix が出力されます。 q-signature

HTTP コンテンツに基づいて署名を計算します。アルゴリズムは COS によって提供されます。必要に応じて値を指定するだけです。

公式の例と参照結果

開始する前にロジックを記述するには、公式のサンプルを参照してください。また、計算結果を自分で開発したロジックと比較するために、

HTTP の元のリクエストとしても理解できます。署名を計算する前、または署名が必要ない場合の HTTP リクエスト:

PUT /testfile2 HTTP/1.1

ホスト:bucket1-1254000000.cos.ap-beijing.myqcloud.com

x -cos-content-sha1: 7b502c3a1f48c8609ae212cdfb639dee39673f5e

x-cos-storage -class: standard

Hello world


署名の計算後に取得する必要がある HTTP リクエスト:

PUT /testfile2 HTTP/1.1
ホスト:bucket1-1254000000.cos.ap-beijing.myqcloud.com
x-cos-content-sha1: 7b502c3a1f48c8609ae212cdfb639dee39673f5e
x-cos-storage -class: standard
Authorization: q-sign-algorithm=sha1&q-ak=AKIDQjz3ltompVjBni5LitkWHFlFpwkn9U5q&> q-sign-time=1417773892;1417853898&q-key-time=1417773892;1417853898&q-header-list =host;x -cos-コンテンツ-sha1;x-cos-storage-class&q-url-param-list=&q-signature=14e6ebd7955b0c6da532151bf97045e2c5a64e10

Hello world

結論: アルゴリズムが承認後にアルゴリズムを取得できるかどうか文字列 string は正しいです

準備作業

(公式に提供されている)ユーザー情報とHTTP情報を見てみましょう:

  • ##SecretId: AKIDQjz3ltompVjBni5LitkWHFlFpwkn9U5q

  • SecretKey: BQYIM75p8x0iWVFSIgqEKwFprpRSVHlz

  • 署名の有効開始時刻: 1417773892

  • 署名の有効終了時刻: 1417853898

  • HTTP 元のリクエスト ヘッダー: 前のセクションの例によれば、HTTP 元のリクエストに次の 3 つのコンテンツがあることを取得するのは難しくありません: Host、x-cos-content-sha1および x-cos-storage-class

  • HTTP リクエスト パラメーター: これは PUT リクエストですか? パラメーター

署名の計算

すべてのパラメータを準備します。リクエスト署名ルールを導入すると、次の表に示すような結果を得るのは難しくありません。


Key (キー) Value(値)備考##q-sign-algorithmq-akq-sign-time q-key-timeq-header-listq-url-param-listq-signature

しかし、Q 署名はどこから来たのでしょうか?

先ほど述べたように、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;
}

テスト用に、このメソッドには必要以上のパラメータが指定されている必要があります。最初の 6 つのパラメータは次のとおりです。ユーザーに直接値を割り当てて、次の文字列を取得します:

$authorization = "q-sign-algorithm=sha1&q-ak=$secretId&q-sign-time=$qSignTime&q-key-time =$qKeyTime...

$header_list この値は q-header-list ルールに準拠する必要があるため、ロジックは上記のとおりです。確立されたリクエスト項目からキーを抽出して、整然とした形式の文字列を形成します。コードは次のとおりです。

/**
 * 按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 リクエスト パラメータです。当然、値は空なので、コードは「遅延」し、空の文字列を直接与えます。と注意点

公式がアルゴリズムやPHP、コードの書き方まで丁寧に解説してくれているので、大満足のはずです(でも! 公式ドキュメントを読んでめまいがしたので、後で説明します)、まず署名の「形式」を見てください:

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)


もう一度、署名の完全なアルゴリズムを見てみましょう:

$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: 4 つの部分は次のとおりです。別途記載してください


1、$httpMethod: HTTP リクエスト メソッド、小文字、例: put、get
2. $httpUri: 「/」仮想ルートから始まる HTTP リクエストの URI 部分。 /testfile はバケットのルートディレクトリに testfile というファイルを作成することを意味し、/image/face1.jpg はルートディレクトリ/image ディレクトリに testfile というファイルを作成することを意味します。が画像ファイルであるかどうかは関係ありません。 3, $httpParameters: ここが最初に注意すべき点です。 HTTP 本来のリクエストパラメータ、つまりリクエスト URI の ? 以降の部分で構成されています。この例では PUT Object インターフェイスを呼び出しているため、空になっています。空でない場合は、リクエスト パラメータの各項目のキーと値を小文字に変換する必要があります。key=value の複数のペアが辞書によってソートされ、$headerString: これが 2 番目です。注意点は、HTTP本来のリクエストヘッダーに応じて、リクエストヘッダーの全部または一部を選択し、各項目のキーを小文字に変換し、値をURLEncodeに変換し、それぞれの形式を変更します。 item を key=value に変換し、キーに従って並べ替えを行い、最後にコネクタ & を使用して文字列を形成します。これは私がコンパイルしたロジックです。コードは次のとおりです。

/**
 * 按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 元のリクエスト ヘッダーとリクエスト パラメーターは 4 つの場所で使用されます。つまり、リクエスト署名の q-header-list と署名の HttpHeaders です。どちらも HTTP 元のリクエスト ヘッダー、q-url-param を使用します。 -list in Signature と HttpParameters in Signature - どちらも HTTP リクエスト パラメーターを使用します。選択した HTTP リクエスト ヘッダーとリクエスト パラメーターの数がオブジェクト

と一致していることを必ず確認してください。q-header-list によって生成された HTTP リクエスト ヘッダーの数とメンバーは次のとおりです。 HttpHeaders の生成に使用されるものと同じである必要があります。q-url-param-list によって生成される HTTP リクエスト パラメーターの数とメンバーは、HttpParameters によって生成されるものと同じである必要があります。 q-header-list と q-url-param-list はキー部分のみを受け取り、HttpHeaders と HttpParameters はキー部分と値部分を受け取ります

  • 出力結果と検証

  • この時点で、リクエスト署名には 7 つの値があります。それらの一部はユーザー情報から取得され、一部は計算する必要があります。すべての計算方法とその理由を個人的に理解する必要があります。計算された値も上記に示されています。最後に、公式の要件に従って出力するだけです。見てください
sha1 現在サポートされている sha1 署名アルゴリズムのみ
AKIDQjz3ltompVjBni5LitkWHFlFpwkn9U5q SecretId フィールド
1417773892;1417853898 2014/12/5 18:04:52 ~ 2014/12/6 16:18:18
1417773892;1417853898 2014/12/5 18:04:52 ~ 2014/12/6 16: 18:18
host;x-cos-content-sha1;x-cos-storage-class 辞書順HTTP ヘッダー キーの並べ替えられたリスト

HTTP パラメーター リストが空です
14e6ebd7955b0c6da532151bf97045e2c5a64e10 コードによる計算

以上がPHP は Tencent Cloud COS インターフェースに必要なリクエスト署名の関連コンテンツを生成しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
アクション中のPHP:実際の例とアプリケーションアクション中のPHP:実際の例とアプリケーションApr 14, 2025 am 12:19 AM

PHPは、電子商取引、コンテンツ管理システム、API開発で広く使用されています。 1)eコマース:ショッピングカート機能と支払い処理に使用。 2)コンテンツ管理システム:動的コンテンツの生成とユーザー管理に使用されます。 3)API開発:RESTFUL API開発とAPIセキュリティに使用されます。パフォーマンスの最適化とベストプラクティスを通じて、PHPアプリケーションの効率と保守性が向上します。

PHP:インタラクティブなWebコンテンツを簡単に作成しますPHP:インタラクティブなWebコンテンツを簡単に作成しますApr 14, 2025 am 12:15 AM

PHPにより、インタラクティブなWebコンテンツを簡単に作成できます。 1)HTMLを埋め込んでコンテンツを動的に生成し、ユーザー入力またはデータベースデータに基づいてリアルタイムで表示します。 2)プロセスフォームの提出と動的出力を生成して、XSSを防ぐためにHTMLSPECIALCHARSを使用していることを確認します。 3)MySQLを使用してユーザー登録システムを作成し、Password_HashおよびPreprocessingステートメントを使用してセキュリティを強化します。これらの手法を習得すると、Web開発の効率が向上します。

PHPとPython:2つの一般的なプログラミング言語を比較しますPHPとPython:2つの一般的なプログラミング言語を比較します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は、初心者や経験豊富な開発者に適した、常に進化し、最適化しています。

PHPの現在のステータス:Web開発動向を見てくださいPHPの現在のステータス:Web開発動向を見てくださいApr 13, 2025 am 12:20 AM

PHPは、現代のWeb開発、特にコンテンツ管理とeコマースプラットフォームで依然として重要です。 1)PHPには、LaravelやSymfonyなどの豊富なエコシステムと強力なフレームワークサポートがあります。 2)パフォーマンスの最適化は、Opcacheとnginxを通じて達成できます。 3)PHP8.0は、パフォーマンスを改善するためにJITコンパイラを導入します。 4)クラウドネイティブアプリケーションは、DockerおよびKubernetesを介して展開され、柔軟性とスケーラビリティを向上させます。

PHP対その他の言語:比較PHP対その他の言語:比較Apr 13, 2025 am 12:19 AM

PHPは、特に迅速な開発や動的なコンテンツの処理に適していますが、データサイエンスとエンタープライズレベルのアプリケーションには良くありません。 Pythonと比較して、PHPはWeb開発においてより多くの利点がありますが、データサイエンスの分野ではPythonほど良くありません。 Javaと比較して、PHPはエンタープライズレベルのアプリケーションでより悪化しますが、Web開発により柔軟性があります。 JavaScriptと比較して、PHPはバックエンド開発により簡潔ですが、フロントエンド開発のJavaScriptほど良くありません。

PHP対Python:コア機能と機能PHP対Python:コア機能と機能Apr 13, 2025 am 12:16 AM

PHPとPythonにはそれぞれ独自の利点があり、さまざまなシナリオに適しています。 1.PHPはWeb開発に適しており、組み込みのWebサーバーとRich Functionライブラリを提供します。 2。Pythonは、簡潔な構文と強力な標準ライブラリを備えたデータサイエンスと機械学習に適しています。選択するときは、プロジェクトの要件に基づいて決定する必要があります。

PHP:Web開発の重要な言語PHP:Web開発の重要な言語Apr 13, 2025 am 12:08 AM

PHPは、サーバー側で広く使用されているスクリプト言語で、特にWeb開発に適しています。 1.PHPは、HTMLを埋め込み、HTTP要求と応答を処理し、さまざまなデータベースをサポートできます。 2.PHPは、ダイナミックWebコンテンツ、プロセスフォームデータ、アクセスデータベースなどを生成するために使用され、強力なコミュニティサポートとオープンソースリソースを備えています。 3。PHPは解釈された言語であり、実行プロセスには語彙分析、文法分析、編集、実行が含まれます。 4.PHPは、ユーザー登録システムなどの高度なアプリケーションについてMySQLと組み合わせることができます。 5。PHPをデバッグするときは、error_reporting()やvar_dump()などの関数を使用できます。 6. PHPコードを最適化して、キャッシュメカニズムを使用し、データベースクエリを最適化し、組み込み関数を使用します。 7

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

MantisBT

MantisBT

Mantis は、製品の欠陥追跡を支援するために設計された、導入が簡単な Web ベースの欠陥追跡ツールです。 PHP、MySQL、Web サーバーが必要です。デモおよびホスティング サービスをチェックしてください。

DVWA

DVWA

Damn Vulnerable Web App (DVWA) は、非常に脆弱な PHP/MySQL Web アプリケーションです。その主な目的は、セキュリティ専門家が法的環境でスキルとツールをテストするのに役立ち、Web 開発者が Web アプリケーションを保護するプロセスをより深く理解できるようにし、教師/生徒が教室環境で Web アプリケーションを教え/学習できるようにすることです。安全。 DVWA の目標は、シンプルでわかりやすいインターフェイスを通じて、さまざまな難易度で最も一般的な Web 脆弱性のいくつかを実践することです。このソフトウェアは、

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

このプロジェクトは osdn.net/projects/mingw に移行中です。引き続きそこでフォローしていただけます。 MinGW: GNU Compiler Collection (GCC) のネイティブ Windows ポートであり、ネイティブ Windows アプリケーションを構築するための自由に配布可能なインポート ライブラリとヘッダー ファイルであり、C99 機能をサポートする MSVC ランタイムの拡張機能が含まれています。すべての MinGW ソフトウェアは 64 ビット Windows プラットフォームで実行できます。

SecLists

SecLists

SecLists は、セキュリティ テスターの究極の相棒です。これは、セキュリティ評価中に頻繁に使用されるさまざまな種類のリストを 1 か所にまとめたものです。 SecLists は、セキュリティ テスターが必要とする可能性のあるすべてのリストを便利に提供することで、セキュリティ テストをより効率的かつ生産的にするのに役立ちます。リストの種類には、ユーザー名、パスワード、URL、ファジング ペイロード、機密データ パターン、Web シェルなどが含まれます。テスターはこのリポジトリを新しいテスト マシンにプルするだけで、必要なあらゆる種類のリストにアクセスできるようになります。