gpt4 book ai didi

hyperledger-fabric - super 账本结构 : implementing chaincode level access control

转载 作者:行者123 更新时间:2023-12-04 07:58:28 24 4
gpt4 key购买 nike

我想对某些方法实现链代码级别的访问控制。因此,例如,我希望仅当执行请求的用户具有与世界状态中请求的 Assets 字段匹配的确定身份时,才能执行调用的链代码方法。

https://hyperledger-fabric.readthedocs.io/en/release-1.4/chaincode4ade.html ,官方文档说:

“Chaincode 可以通过调用 GetCreator() 函数利用客户端(提交者)证书进行访问控制决策。此外,Go shim 提供了扩展 API,可以从提交者的证书中提取客户端身份,用于访问控制决策,无论是这是基于客户端身份本身、组织身份或客户端身份属性。

例如,表示为键/值的 Assets 可能包括客户端的身份作为值的一部分(例如作为指示 Assets 所有者的 JSON 属性),并且只有该客户端可以被授权更新 future 的键/值。可以在链代码中使用客户端身份库扩展 API 来检索提交者信息,从而做出此类访问控制决策。”

这完美地反射(reflect)了我的情况:我的 Assets 包含一个字段所有者,我希望 remove 方法只能由作为该 Assets 所有者的用户对 Assets 执行,即如果他的身份 - 用户名 - 匹配所有者字段。

我的问题是官方文档中提供的解决方案描述了使用“客户端身份 (cid) 库”( https://github.com/hyperledger/fabric/tree/master/core/chaincode/shim/ext/cid ) 从证书中提取用户信息的可能性。但就我而言,我有 Java 和 Javascript 的链代码,并且(我认为)我只能使用 GetCreator() 方法,该方法将用户证书作为字节数组输出。

如何从证书中提取我需要的信息?可能吗?是否可以从我的 Java 和 Javascript 链码中使用 CID 库?

最佳答案

CID 库只是一个语法糖包装器,它有助于在链代码中使用身份进行操作,本质上是完成的或在 GoLang 中提取信息的方式是:


serializedID, _ := stub.GetCreator()

sId := &msp.SerializedIdentity{}
err := proto.Unmarshal(serializedID, sId)
if err != nil {
return shim.Error(fmt.Sprintf("Could not deserialize a SerializedIdentity, err %s", err))
}

bl, _ := pem.Decode(sId.IdBytes)
if bl == nil {
return shim.Error(fmt.Sprintf("Could not decode the PEM structure"))
}
cert, err := x509.ParseCertificate(bl.Bytes)
if err != nil {
return shim.Error(fmt.Sprintf("ParseCertificate failed %s", err))
}

fmt.Println(cert)

这可以通过以下几行在 Java 中完成:

        try {
Identities.SerializedIdentity identity = Identities.SerializedIdentity.parseFrom(stub.getCreator());
StringReader reader = new StringReader(identity.getIdBytes().toStringUtf8());
PemReader pr = new PemReader(reader);
byte[] x509Data = pemReader.readPemObject().getContent();
CertificateFactory factory = CertificateFactory.getInstance("X509");
X509Certificate certificate = factory.generateCertificate(new ByteArrayInputStream(x509Data));

} catch (InvalidProtocolBufferException e) {
e.printStackTrace();
}

关于hyperledger-fabric - super 账本结构 : implementing chaincode level access control,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55983466/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com