对象能力CACAO

对象能力CACAO

Cearmic流支持CACAO,使得基本但强大的基于能力的授权系统得以存在。CACAO或“链不可知对象能力”是用于授权的可组合、可转移和可验证容器,并编码在IPLD中。有关完整的CACAO规范和更多示例,请参考CAIP-74:CACAO - 面向链不可知的能力对象

方法

基于对象能力的授权系统,CACAO是其中一种实现方式,它是在开放和分布式系统中表示授权的自然方法。对象能力需要很少的协调工作,只有关心特定能力的各方才会存储,并且可以进行自我验证。 相比之下,像访问控制列表(ACL)这样流行的授权模型通常依赖于维护准确、达成共识并及时更新权限列表的能力。当你可以依靠单个权威来源来维护列表时,ACL简单而足够;但在分布式环境中很快就变得困难。在许多未知参与者之间维护一个列表成为了一个艰难的共识问题,在大规模情况下通常非常昂贵,并需要大量前期和持续协调。

用法

CACAO 使一个账户能够授权另一个账户代表其在有限的数据上构建签名,或者在这种情况下写入 Ceramic 流。

使用区块链账号

当与“使用X登录”结合使用时,CACAO解锁了区块链账户授权Ceramic账户(DID)代表他们签署数据的能力。这种在Ceramic中经常使用的模式,大大增加了用户拥有的数据和公钥密码学的可用性。由于采用了基于区块链的系统,许多用户现在可以使用其钱包和区块链账户轻松地在基于Web的环境中签署数据。

授权会话

像 Ceramic 这样的数据中心系统通常比区块链系统具有更频繁的写入操作,因此在区块链钱包中签署每个 Ceramic 流事件可能是不切实际的。相反,通过使用 CACAO 和“使用 X 登录”功能,可以通过临时密钥和经过 CACAO 授权的 DID 来进行许多写入操作。允许用户使用基于区块链的账户和钱包仅签署一次,然后在授权时间(会话)内继续签署多个有效payloads。

在未来,我们预计能够模拟更复杂的环境和结构的授权,包括整个组织。

规范

核心ceramic协议中支持对象能力。流中的事件是使用DAGJWS(DAG-JOSE)格式化的签名有效载荷,如此处所述。这描述了如何通过首先构建具有CACAO的JWS来扩展它以构造有效的CACAO签名payload。然后可以将具有CACAO的JWS直接编码为DAG-JOSE。

使用CACAO的JWS

JWS CACAO支持包括向JWS受保护头添加cap参数并指定正确的kid参数字符串。以下是带有CACAO的示例受保护的JWS头:

{ 
  "alg": "EdDSA",
  "cap": "ipfs://bafyreidoaclgf2ptbvflwalfrr6d4iqehkzyidwbzaouprdbjjfb4yim6q"
  "kid": "did:key:z6MkrBdNdwUPnXDVD1DCxedzVVBpaGi8aSmoXFAeKNgtAer8#z6MkrBdNdwUPnXDVD1DCxedzVVBpaGi8aSmoXFAeKNgtAer8"
 }
 

其中alg - 标识用于保护JWS的加密算法cap - 映射到URI字符串,预期可解析为CACAO对象的IPLD CIDkid - 引用用于保护JWS的密钥。在此范围内,这应该是一个带有对DID验证方法中任何键的引用的DID。参数必须与CACAO对象的aud目标匹配,以使CACAO和相应签名一起有效。

由于cap目前不是IANA“JSON Web签名和加密头参数”注册表中的注册头参数名称,因此我们暂时将其视为“私有头参数名称”,并且CACAO为选择使用本规范的实现提供了附加含义。 这意味着在验证过程中忽略cap标头仍将通过kid定义的密钥生成有效的JWS负载。它只是没有按照CACAO中定义的任何其他含义。 cap标头参数也可以通过在JWS中使用crit(关键)标头参数作为扩展来添加支持,但几乎没有理由基于消费者不理解cap标头而使JWS无效,因为它仍然有效。

DagJWS with CACAO

构造根据前面部分描述的具有CACAO的JWS,按照DAG-JOSE规范和实现步骤,将给定的具有CACAO头部和有效负载的JWS构建成DagJWS。DagJWS与任何JWS非常相似,唯一的区别在于有效负载是一个base64url编码的IPLD CID,该CID引用了JSON对象有效负载。

{ 
  cid: "bagcqcera2mews3mbbzs...quxj4bes7fujkms4kxhvqem2a",
  value: {
    jws: { 
      link: CID("bafyreidkjgg6bi4juwx...lb2usana7jvnmtyjb4xbgwl6e"),
      payload: "AXESIGpJjeCjiaWv...LKw6pIDQfTVrJ4SHlwmsvx", 
      signatures: [
        {
          protected: "eyJhbGciOiJFZERTQSIsImNh...GU2djZEpLTmhYSDl4Rm9rdEFKaXlIQiJ9"
          signature: "6usTYvu5KN0LFTQsWE9U-tqx...h60EgfvjL_rlAW7_tnQUl84sQyogpkLAQ"
        }
      ]
    }
  }
}

验证以下算法描述了确定给定的具有CACAO的DagJWS是否有效所需的步骤:

  1. 按照DAG-JOSE规范将给定的DagJWS转换为JWS。

  2. 根据JWS规范,判断给定的JWS是否有效。验证给定签名与保护头中的 algkid 配对的有效性,以及给定负载的有效性。如果无效,则必须引发错误。

  3. 将投影的 JWS 标头中 cap 参数中给定的 URI 解析为 CACAO JSON 对象。遵循CAIP-74 CACAO规范来确定给定的CACAO是否有效。如果无效,则必须引发错误。

示例:以IPLD dag-jose编码块为例,字符串被缩写。

{ 
  cid: "bagcqcera2mews3mbbzs...quxj4bes7fujkms4kxhvqem2a",
  value: {
    jws: { 
      link: CID("bafyreidkjgg6bi4juwx...lb2usana7jvnmtyjb4xbgwl6e"),
      payload: "AXESIGpJjeCjiaWv...LKw6pIDQfTVrJ4SHlwmsvx", 
      signatures: [
        {
          protected: "eyJhbGciOiJFZERTQSIsImNh...GU2djZEpLTmhYSDl4Rm9rdEFKaXlIQiJ9"
          signature: "6usTYvu5KN0LFTQsWE9U-tqx...h60EgfvjL_rlAW7_tnQUl84sQyogpkLAQ"
        }
      ]
    }
  }
}

如果解码 block.value.jws.signatures[0].protected ,你会看到以下对象,即上述所描述的JWS受保护的头部:

{
  "alg": "EdDSA",
  "cap": "ipfs://bafyreidoaclgf...yidwbzaouprdbjjfb4yim6q",
  "kid": "did:key:z6Mkq2ZyjGV54ev...hXH9xFoktAJiyHB#z6Mkq2ZyjGV54ev...hXH9xFoktAJiyHB"
}

Last updated