首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Corda中,两个节点如何相互证明它们都知道一条信息?

在Corda中,两个节点如何相互证明它们都知道一条信息?
EN

Stack Overflow用户
提问于 2018-05-02 16:55:38
回答 2查看 206关注 0票数 2

我想写一个Corda流,其中双方只有在双方都能证明他们共享一条共同的信息的情况下才能继续进行事务。该流程的概要如下:

代码语言:javascript
复制
@InitiatingFlow
@StartableByRPC
class ChallengeResponseFlow(val otherParty: Party, val proofOfKnowledge: Int) : FlowLogic<Unit>() {

    @Suspendable
    override fun call() {
        val otherPartySession = initiateFlow(otherParty)
        otherPartySession.send(proofOfKnowledge)
        val theirProofOfKnowledge = otherPartySession.receive<Int>().unwrap { theirProofOfKnowledge -> theirProofOfKnowledge }
        verifySecretValue(theirProofOfKnowledge)

        TODO("Challenge-response passed. Continue with flow.")
    }

    private fun verifyTheirProofOfKnowledge(theirProofOfKnowledge: Int) {
        TODO("Write verification logic.")
    }
}

两个问题:

  • 在这里,有什么证据可以证明我和我的对手知道同样的秘密?
  • 我怎样才能根据他们寄给我的证据来确认我的对手知道同样的秘密呢?

重要的是,在这个挑战响应协议中,秘密永远不会被泄露。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-05-02 21:57:29

根据您的需求,有不同的策略:

  1. 假设秘密有足够的熵(即至少128位),双方都可以选择一个随机的nonce,并将SHA3-256(secret, nonce)SHA2-256d (双哈希)或甚至更好的HMAC连同它们的nonce发送给对方。

NoteA:正如您注意到的,我忽略了简单的SHA256,因为它容易受到长度扩展攻击的影响。

NoteB:发送一半的散列(正如@Kid101中已经提到的那样)仍然有效,但它降低了安全性,因此现在的方法被认为更安全和优雅。

NoteC:现在的方法提供了额外的(可能需要的)不可链接属性,根据该属性,恶意攻击者无法判断是否在两个不同的事务/流中重用相同的secret。我们需要的总是产生一个新的随机的现在。

  1. 然而,在有些情况下,秘密没有足够的熵,或者根本不是随机的(例如计数器或可预测的String,如弱密码或userID)。然后,一个人(中间人)可以简单地强制使用简单的散列或MAC方法(即使应用了一个名)来轻松地提取“弱”秘密。该问题的解决方案更为复杂,需要某种加密(即通过安全通道或使用口令认证密钥协商协议发送散列消息)。

NoteD: Corda节点无论如何都是通过TLS连接的,但是如果您需要在rest (即检查点)保护数据,则应该使用额外的加密层。

  1. 如果一个人想提供安全的重播攻击,一个挑战-响应协议是必需的。通过重放攻击,我们意味着相同的nonce被故意重用(即以前的身份验证令牌在未来的身份验证尝试中被某种程度地破坏和重用)。对于第一种情况(具有足够熵的秘密),一个技巧是接收来自对手方的一个具有挑战性的无值,并将它用于身份验证令牌SHA3-256(secret, nonce)。因此,每个客户端都使用对方接收到的时间。
  2. 扩展上述挑战-响应解决方案,有时建议同时使用两种方法,例如,

SHA3-256(secret, noncefromPartyA, noncefromPartyB) 甲方发送

SHA3-256(secret, noncefromPartyB, noncefromPartyA) 乙方发送

这是为了提供额外的保证,即聚合的当前是由双方控制的,如果其中一个是恶意的,或者它的PRNG是有缺陷的,那么您仍然可以产生唯一的非can。

noncefromPartyA != noncefromPartyB,:我们应该确保这个NoteE,因为第二个应答者可以与第一方重用(转发)相同的身份验证令牌(同样是一种重放攻击)。

NoteF:按照同样的思路,我们强调上述散列中的非per的顺序应该是不同的,以再次防止内部重放攻击,即使我们对每个用户使用不同的非per!

票数 4
EN

Stack Overflow用户

发布于 2018-05-02 17:51:31

我可以使用SHA256散列我的秘密,将第128位发送到另一边,让另一方检查他的秘密SHA256散列是否与他的前128位匹配。然后,他可以把他的下半场送到第一场比赛,以验证是否与他的比赛相匹配。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50139852

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档