簡體   English   中英

PHP RESTful API 安全性

[英]PHP RESTful API Security

我目前正在用 PHP 構建一個 RESTful API,它將用於支持 Web 和移動應用程序。 因此,API 應被視為公開的。 但是,我想在用戶從移動設備或 Web 向 API 發出請求時對其進行身份驗證。

當用戶注冊該服務時,我會生成一個唯一的 API 密鑰和秘密,該密鑰和秘密存儲在數據庫中的用戶記錄中。 理想情況下,我希望使用 JavaScript 或 PHP僅使用 API 密鑰發出請求。

我想過建立一個握手系統進行認證,流程如下:

  • 用戶使用其已知密鑰向 API 發出請求。
  • API 使用存儲在表中的令牌以及時間戳進行響應(以防止重放攻擊)
  • 然后客戶端使用令牌發出實際請求,API 將檢查令牌的有效性。 如果哈希匹配,並且時間戳有效,則 API 提供有效響應,否則提供令牌已過期的信息。

我正在考慮使用 HMAC 來生成令牌,如下所示:

$token = hash_hmac('sha256', $user->apiKey.microtime(), $user->apiSecret);

然后$token將存儲在數據庫中,並且對於每個請求都應該是唯一的。 反過來,可以使用以下 jQuery 代碼發出請求:

$.getJSON('/api/user/get/1', { 'key': '123rrwfnufsd7f72' }).done(function(data) { 
    // data will now contain a token, so we use it to make another AJAX request:
    if( data.token )
    {
        $.getJSON('/api/user/get/1', { 'token': data.token }).done(function(user) {  
             // do something with user or handle bad token
        });
    }
});

我的問題是這是否足以防止蠻力和重放攻擊?

我只是為此創建了一個小庫。 如果需要,您可以以分鍾為單位指定時間漂移,甚至可以使用自定義鹽。 (見https://github.com/gboddin/psk-validator/

該庫允許您使用基於時間的鹽來驗證來自客戶端的簽名消息。

安裝

composer require gboddin/psk-validator

用法

客戶

$sharedsecret = '43223ff65b6ce17072cda5729b20daceec611d1f39e76040d347ceeca51d2a47';
$data = json_encode(['suff','otherstuff',['machin' => 'bidule']]);

/**
 * Client :
 * Invoke the validator with the pre-shared key and an algo  (sha256 by default) and
 * define an allowed time drift in minutes ( 2 by default ).
 */
$sigValidation = new \Gbo\PSKValidator($sharedsecret, 'sha256');
/**
 * Signs a bunch of data and get the signature.
 * The second optional parameters allows for a user provided salt instead
 * of the default time based salt. It must be agreed on between client and server.
 */
$signature =  $sigValidation->sign($data, null);

服務器

/**
 * Server :
 * The optional third parameter allows to define a maximum time drift  in minutes ( default 2 minutes )
 */

$signature =  $httpRequest->getHeader('x-signature');
$sharedsecret = '43223ff65b6ce17072cda5729b20daceec611d1f39e76040d347ceeca51d2a47';
$sigValidation = new \PSKValidator($sharedsecret, 'sha256', 2);
$data = $httpRequest->getBody();

/**
 * Server :
 * The third optional parameters allows for a user provided salt instead
 * of the default time based salt. It must be agreed on between client and server.
 */

$signatureIsValid = $sigValidation->verify($data, $signature, null);

var_dump(
    $data,
    $signature,
    $sigValidation->getTimeBasedSignatures($data),
    $signatureIsValid
);

服務器輸出

string(41) "["suff","otherstuff",{"machin":"bidule"}]"
string(64) "d85a2d6873e034cb3ab8c490cb82139d8dabae6c08581cca0a2e7497ead287a4"
array(5) {
  [0]=>
  string(64) "d85a2d6873e034cb3ab8c490cb82139d8dabae6c08581cca0a2e7497ead287a4"
  [1]=>
  string(64) "dc150239c61fe272b7ca44ad0918d159a84e5bc1661db48bad04a81bc7f4c742"
  [2]=>
  string(64) "e1822fc6cc7bbf1184b29efaaaceac6d598fb406b4f8cf9b3717b3d0c533c19f"
  [3]=>
  string(64) "d85a2d6873e034cb3ab8c490cb82139d8dabae6c08581cca0a2e7497ead287a4"
  [4]=>
  string(64) "d85a2d6873e034cb3ab8c490cb82139d8dabae6c08581cca0a2e7497ead287a4"
}
bool(true)

(抱歉自我宣傳:))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM