encryptionKey 聲明是一項強大的功能,它允許您的應用程式向使用者的錢包請求一個秘密的加密金鑰。這個金鑰是根據錢包的主密鑰和您提供的 salt 確定性地派生出來的。它使應用程式能夠加密使用者特定的資料,而無需處理使用者的主私鑰,從而增強了安全性和隱私性。
運作方式
這個過程直接且安全:
應用程式發起:
您的應用程式請求一個
encryptionKey聲明,並提供一個獨特的salt字串。錢包派生金鑰:
使用者的錢包收到請求。它使用一個安全的金鑰派生函數(具體為
SHA3(Buffer.concat(keyPair.sk, salt), 3))將其主密鑰與提供的salt結合起來。使用者批准:
錢包會提示使用者批准該請求,並解釋應用程式想要產生一個加密金鑰。
金鑰返回:
經使用者批准後,派生的金鑰將作為 DID Connect 回應的一部分發送回您的應用程式。
這種方法確保了即使兩個不同的應用程式使用相同的 salt 請求金鑰,派生出的金鑰也會不同,因為它們與每個使用者獨特的主密鑰綁定。
參數
encryptionKey 聲明物件接受以下參數:
| Parameter | Type | Required | Description |
|---|---|---|---|
type | String | Yes | 必須設定為 'encryptionKey'。 |
description | String | No | 向使用者顯示在錢包中的訊息,用以解釋金鑰的用途。預設為「請提供 encryptionKey 以繼續」。 |
salt | String | Yes | 由您的應用程式提供的一個獨特字串。這是金鑰派生過程中的關鍵組成部分。使用不同的 salt 將會產生不同的金鑰。 |
delegation | String | No | 一個可選的 JWT 權杖,用於證明委派關係,允許一個 agent 代表另一個 DID 請求金鑰。 |
meta | Any | No | 一個用於保存您想與聲明關聯的任何自訂元資料的物件。預設為 {}。 |
請求加密金鑰
以下是如何在您的應用程式中請求 encryptionKey 聲明的範例。您通常會在啟動 DID Connect 會話時在聲明物件中定義它。
DID Connect Claims
const claims = {
encryptionKey: {
description: '產生一個金鑰來加密您的應用程式設定',
salt: 'a-unique-and-persistent-salt-for-this-user-and-context',
},
};
// 這個 claims 物件將會被傳遞給您的 WalletAuthenticator 實例
const { authInfo } = await authenticator.sign({
claims,
// ... 其他上下文參數
});在上面的範例中,應用程式請求一個金鑰,為使用者提供了一條描述性訊息和一個獨特的 salt。
錢包回應
使用者批准請求後,您的應用程式的回呼端點將會收到錢包的回應。一旦驗證通過,回應負載中的 claims 陣列將包含派生的加密金鑰。
Wallet Response Payload
{
"userDid": "z1...",
"userPk": "...",
"claims": [
{
"type": "encryptionKey",
"salt": "a-unique-and-persistent-salt-for-this-user-and-context",
"delegation": "",
"key": "...derived_encryption_key..."
}
],
"challenge": "...",
"timestamp": 1678886400
}您的應用程式隨後可以從回應中提取 key,並將其用於加密和解密任務。
使用案例
此聲明非常適用於需要保護由您的應用程式儲存的使用者資料的場景:
- 加密使用者偏好設定: 安全地將使用者設定或個人資料資訊儲存在您的資料庫中。
- 保護應用程式資料: 加密特定於使用者在您應用程式中會話或活動的資料。
- 端到端加密: 建立一個共享密鑰以創建加密的通訊通道。
透過利用 encryptionKey 聲明,您可以建構更安全、更注重隱私的應用程式。要更深入地了解如何處理聲明,請前往 WalletAuthenticator API 參考。