跳到主要內容

請求簽章

為確保與您的 DID Space 每次互動的安全性和完整性,所有 API 請求都受到一個強大的密碼學簽章機制的保護。此過程保證了請求是真實的——由聲稱的身份發送——並且在傳輸過程中未被篡改。

雖然當您使用 SpaceClient 時,@blocklet/did-space-js SDK 會自動處理此過程,但了解其運作原理是建立安全應用程式和排除潛在問題的關鍵。此過程包含兩個主要部分:在客戶端簽署請求,以及在伺服器端驗證請求。

簽章流程 (客戶端)

在任何指令傳送到 DID Space API 之前,SDK 會執行一系列步驟來建立一個密碼學簽章。這確保了伺服器可以驗證請求的來源和完整性。

Request Signing

以下是這些步驟的詳細說明:

  1. 建立摘要:SDK 首先會為請求負載建立一個獨特且一致的特徵碼。它會取用請求的 URL、HTTP 方法和資料,然後將它們序列化為一個穩定的 JSON 字串。接著使用 SHA3-256 對此字串進行雜湊運算。此摘要確保了即使請求中只有一個字元的變動,也會產生一個完全不同的簽章。
  2. 建立 JWT:接著會組裝一個 JSON Web Token (JWT)。此權杖的負載包含上一步建立的摘要、發行者的 DID (來自錢包),以及一個到期時間戳 (通常為一小時),以防止重放攻擊。
  3. 簽署 JWT:然後使用所提供錢包物件中的 secretKey 對整個 JWT 進行密碼學簽署。此簽章證明了請求是由該錢包的所有者發起的。
  4. 附加 HTTP 標頭:最後,SDK 會使用以下標頭將簽章和相關資訊附加到傳出的 HTTP 請求中:
  • x-app-did:應用程式錢包的 DID。
  • x-app-pk:對應於簽署請求的錢包的公鑰。
  • x-app-token:前述步驟中建立的已簽署 JWT。
  • x-app-delegation (選用):用於委派授權的權杖,詳見下文說明。

驗證流程 (伺服器端)

當 DID Space API 伺服器收到一個請求時,它會執行相反的流程來驗證其真實性和完整性,然後再進行處理。

以下是伺服器的驗證步驟:

  1. 提取標頭

    伺服器從傳入的請求中讀取 x-app-didx-app-pkx-app-token 標頭。

  2. 驗證身份

    它確認所提供的 x-app-did 對應於 x-app-pk。這確保了公鑰是給定 DID 的有效金鑰。

  3. 驗證權杖簽章

    伺服器使用 x-app-pk (公鑰) 來驗證 x-app-token 的簽章。成功的驗證證明了該權杖是由相應私鑰的持有者簽署的。

  4. 驗證負載完整性

    伺服器使用與客戶端完全相同的過程,從請求的 URL、方法和資料中獨立地重新計算 SHA3-256 摘要。然後,它將這個新計算出的摘要與已驗證的 JWT 負載中的 digest 進行比較。如果兩者相符,伺服器便可確定請求內容自簽署以來未被更改。

如果所有這些檢查都通過,伺服器會將請求視為有效並繼續執行它。

委派授權

此安全模型的一個強大功能是委派。這允許一個主要錢包 (例如,使用者的錢包) 授予臨時、特定的權限給另一個錢包 (例如,一個服務或應用程式),讓其代表其行動。

這是透過 x-app-delegation 標頭來實現的,該標頭包含另一個 JWT。這個委派權杖由使用者簽署,並指定:

  • from:使用者的 DID (委派人)。
  • to:應用程式的 DID (受委派者)。
  • permissions:被授予的權限陣列,在此情境下必須包含 DIDSpaceAgent

當伺服器驗證一個帶有委派標頭的請求時,它會確認該應用程式 (受委派者) 被授權代表該使用者 (委派人) 行動。然後,該請求會以使用者的權限進行處理。

核心函式

雖然當您使用 SpaceClient 時不會直接呼叫它們,但以下來自 @arcblock/jwt@ocap/mcrypto 套件的函式構成了此安全模型的基礎。

signRequest

此函式由客戶端在內部使用,以組裝簽章和標頭。

signRequest Signature

typescript
async function signRequest({
  url,
  method,
  data,
  headers,
  wallet,
  delegation,
}: {
  url: string;
  method: Method;
  data: any;
  headers: { [key: string]: string };
  wallet?: WalletObject;
  delegation?: string;
}): Promise<{ url: string; method: Method; data: any; headers: Headers }>;

verifyRequest

此函式代表伺服器用來驗證傳入請求的邏輯。

verifyRequest Signature

typescript
async function verifyRequest({
  url,
  method,
  data,
  headers,
}: {
  url: string;
  method: Method;
  data: any;
  headers: Headers;
}): Promise<string>; // 返回已驗證的應用程式 DID

了解此請求簽章與驗證流程,有助於深入理解保護您在 DID Space 中資料的強大安全措施。既然您已了解核心安全模型,就可以探索如何在實際場景中應用這些概念。