为了确保与您的 DID Space 的每次交互的安全性和完整性,所有 API 请求都受到强大的加密签名机制的保护。此过程保证了请求的真实性——即由声明的身份发送——并且在传输过程中未被篡改。
虽然 @blocklet/did-space-js SDK 在您使用 SpaceClient 时会自动处理此过程,但了解其工作原理是构建安全应用程序和解决潜在问题的关键。此过程涉及两个主要部分:在客户端对请求进行签名,以及在服务端对其进行验证。
签名过程(客户端)
在任何命令发送到 DID Space API 之前,SDK 会执行一系列步骤来创建加密签名。这确保了服务器可以验证请求的来源和完整性。

以下是这些步骤的分解说明:
- 创建摘要:SDK 首先为请求负载创建一个唯一且一致的指纹。它获取请求的 URL、HTTP 方法和数据,然后将它们序列化为一个稳定的 JSON 字符串。该字符串随后使用 SHA3-256 进行哈希计算。此摘要可确保即使请求中只有一个字符的更改,也会导致一个完全不同的签名。
- 创建 JWT:组装一个 JSON Web Token (JWT)。该令牌的负载包括上一步创建的摘要、签发者的 DID(来自钱包)以及一个过期时间戳(通常为一小时),以防止重放攻击。
- 签名 JWT:然后使用所提供钱包对象中的
secretKey对整个 JWT 进行加密签名。此签名证明该请求是由该钱包的所有者发起的。 - 附加 HTTP 标头:最后,SDK 使用以下标头将签名及相关信息附加到发出的 HTTP 请求中:
x-app-did:应用程序钱包的 DID。x-app-pk:对请求进行签名的钱包所对应的公钥。x-app-token:前面步骤中创建的已签名 JWT。x-app-delegation(可选):用于委托授权的令牌,下文将对此进行解释。
验证过程(服务端)
当 DID Space API 服务器收到一个请求时,它会在处理该请求之前执行反向过程,以验证其真实性和完整性。
以下是服务器的验证步骤:
提取标头
服务器从传入的请求中读取
x-app-did、x-app-pk和x-app-token标头。验证身份
服务器确认所提供的
x-app-did与x-app-pk相对应。这确保了公钥是给定 DID 的有效密钥。验证令牌签名
服务器使用
x-app-pk(公钥)来验证x-app-token的签名。成功的验证证明该令牌是由相应私钥的持有者签名的。验证负载完整性
服务器使用与客户端完全相同的过程,独立地从请求的 URL、方法和数据中重新计算 SHA3-256 摘要。然后,它将这个新计算出的摘要与在已验证的 JWT 负载中找到的
digest进行比较。如果两者匹配,服务器就可以确定请求内容自签名以来未被更改。
如果所有这些检查都通过,服务器就认为该请求有效,并继续执行它。
委托授权
该安全模型的一个强大功能是委托。这允许一个主钱包(例如,用户的钱包)授予另一个钱包(例如,服务或应用程序)临时的、特定的权限,以代表其行事。
这是通过使用 x-app-delegation 标头来实现的,该标头包含另一个 JWT。这个委托令牌由用户签名,并指定了以下内容:
from:用户的 DID(委托方)。to:应用程序的 DID(受托方)。permissions:被授予的权限数组,在此上下文中必须包含DIDSpaceAgent。
当服务器验证带有委托标头的请求时,它会确认应用程序(受托方)被授权代表用户(委托方)行事。然后,该请求将以用户的权限进行处理。
核心函数
虽然在使用 SpaceClient 时您不会直接调用它们,但来自 @arcblock/jwt 和 @ocap/mcrypto 包的以下函数构成了此安全模型的基础。
signRequest
此函数由客户端内部使用,用于组装签名和标头。
signRequest Signature
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
async function verifyRequest({
url,
method,
data,
headers,
}: {
url: string;
method: Method;
data: any;
headers: Headers;
}): Promise<string>; // 返回经过身份验证的应用程序 DID理解此请求签名和验证流程有助于您深入了解保护 DID Space 中数据的强大安全措施。现在您已经了解了核心安全模型,可以探索如何在实际场景中应用这些概念。