跳到主要内容

安全与资源

安全和资源管理对于创建可信赖且可互操作的 Blocklet至关重要。blocklet.yml 规范为此提供了两个关键字段:signatures 用于确保元数据的完整性和真实性,resource 用于定义和捆绑共享资产,以便与其他 Blocklet 组合。

安全和资源管理对于创建可信赖且可互操作的 Blocklet至关重要。blocklet.yml 规范为此提供了两个关键字段:signatures 用于确保元数据的完整性和真实性,resource 用于定义和捆绑共享资产,以便与其他 Blocklet 组合。

本节介绍了这些字段的规范,并介绍了由 @blocklet/meta 提供的用于处理它们的使用工具函数。

签名

signatures 字段包含一个数字签名数组,为 Blocklet 的元数据创建一个可验证的信任链。此机制可防止未经授权的修改,并确认发布者(如开发者和 Blocklet Store)的身份。链中的每个签名都会对核心元数据以及任何后续签名进行加密签名,确保整个修改历史都是防篡改的。

多重签名流程

发布过程中的典型多重签名工作流包括:开发者对初始元数据进行签名,然后由 Blocklet Store 验证该签名,添加分发信息,并附加自己的签名。

Security & Resources

规范

signatures 字段是一个签名对象数组。每个对象具有以下结构:

blocklet.yml

yaml
signatures:
  - type: 'ED25519'
    name: 'dev'
    signer: 'z8qa...'
    pk: 'z28n...'
    created: '2023-10-27T10:00:00.000Z'
    sig: 'z24e...'
    excludes: []
  - type: 'ED25519'
    name: 'store'
    signer: 'z8qR...'
    pk: 'z29c...'
    created: '2023-10-27T10:05:00.000Z'
    sig: 'z25a...'
    appended:
      - 'dist'
      - 'stats'
  • type string (required) — 用于签名的加密算法(例如,'ED25519')。
  • name string (required) — 签名的角色的可读名称(例如,'dev'、'store')。
  • signer string (required) — 创建签名的实体的 DID。
  • pk string (required) — 与签名者 DID 对应的公钥。
  • created string (required) — 创建签名时的 ISO 8601 时间戳。
  • sig string (required) — base58 编码的签名字符串。
  • excludes string[] — 一个顶级字段名称数组,用于在签名之前从元数据中排除。
  • appended string[] — 一个顶级字段名称数组,由该签名者添加到元数据中。下一个签名者将使用此信息来正确验证上一个签名。
  • delegatee string — 如果签名是通过委托进行的,则为受托人的 DID。
  • delegateePk string — 受托人的公钥。
  • delegation string — 授权 delegatee 代表 signer 签名的委托令牌 (JWT)。

资源管理

resource 字段允许 Blocklet 声明其可以导出的共享数据类型,并捆绑来自其他 Blocklet 的资源。这是实现一个可组合、可互操作的生态系统的基础,在该生态系统中,Blocklet 可以无缝共享数据和功能。

规范

blocklet.yml

yaml
resource:
  exportApi: '/api/resources'
  types:
    - type: 'posts'
      description: 'A collection of blog posts.'
    - type: 'images'
      description: 'A gallery of images.'
  bundles:
    - did: 'z2qa...'
      type: 'user-profiles'
      public: true
  • resource object — 包含用于定义可导出类型和捆绑资源的属性。
    • exportApi string — 一个 API 端点的路径,其他 Blocklet 可以调用该端点以获取导出的资源。
    • types object[] — 此 Blocklet 可以导出的资源类型数组。最多限制为 10 种类型。
      • type string (required) — 资源类型的唯一标识符(例如,'posts'、'products')。
      • description string — 资源类型的可读描述。
    • bundles object[] — 从其他 Blocklet 导入的资源包数组。
      • did string (required) — 要包含的资源包的 DID。
      • type string (required) — 从源捆绑的特定资源类型。
      • public boolean — 如果为 true,表示捆绑的资源是公开可访问的。

相关 API 工具

@blocklet/meta 库提供了一套函数来处理 Blocklet 元数据和通信的安全方面。有关完整详细信息,请参阅 安全工具 API 参考。

验证元数据签名

verifyMultiSig 函数是确保 blocklet.yml 文件完整性的主要工具。它处理 signatures 数组,验证链中的每个签名,以确认元数据未被篡改,并由声明的实体签名。

verifyMultiSig Example

javascript
import verifyMultiSig from '@blocklet/meta/lib/verify-multi-sig';
import { TBlockletMeta } from '@blocklet/meta/lib/types';

async function checkMetadata(meta: TBlockletMeta) {
  const isValid = await verifyMultiSig(meta);
  if (isValid) {
    console.log('Blocklet 元数据是真实且未被篡改的。');
  } else {
    console.error('警告:Blocklet 元数据验证失败!');
  }
}

签名和验证 API 响应

为了保护 Blocklet 之间或 Blocklet 与客户端之间的通信安全,您可以使用 signResponse 和 verifyResponse 函数。这些辅助函数使用钱包对象对任何可 JSON 序列化的数据进行加密签名和验证,确保数据的完整性和发送者的真实性。

signResponse Example

javascript
import { signResponse, verifyResponse } from '@blocklet/meta/lib/security';
import { fromRandom } from '@ocap/wallet';

async function secureCommunicate() {
  const wallet = fromRandom(); // 你的 Blocklet 的钱包
  const data = { message: 'hello world', timestamp: Date.now() };

  // 签名
  const signedData = signResponse(data, wallet);
  console.log('签名后的数据:', signedData);

  // 验证
  const isVerified = await verifyResponse(signedData, wallet);
  console.log('验证结果:', isVerified); // true
}