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

时间:2018-05-02 16:55:38

标签: corda

我想写一个Corda流程,如果两方都可以证明他们共享一条共同的信息,那么双方只会进行交易。流程大纲如下:

@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.")
    }
}

两个问题:

  • 这里有什么证据可以证明我知道我的对手方有同样的秘密?
  • 如何根据他们发给我的知识证明来检查我的对方是否知道同样的秘密?

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

2 个答案:

答案 0 :(得分:4)

根据您的要求,有各种策略:

  1. 假设秘密有足够的熵(即至少128位),双方都可以选择随机nonce并发送SHA3-256(secret, nonce)SHA2-256d(双重哈希)甚至更好{{ {1}}以及HMAC到另一方。
  2. NoteA:正如您所注意到的,我省略了简单的SHA256,因为它容易受length extension attacks的影响。

    注意:发送一半的哈希值,如@ Kid101已经提到的那样,仍然有效,但它降低了安全级别,因此nonce方法被认为更安全和优雅。

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

      然而,有些情况下,秘密没有足够的熵或根本不是随机的(即,计数器或可预测的secret,例如弱密码或用户ID)。然后,一个(中间人)可以简单地强制简单的哈希或MAC方法(即使应用了一个随机数)来轻松提取&#34;弱&#34;秘密。此问题的解决方案更复杂,需要某种加密(即通过安全通道或使用password authenticated key agreement protocol发送散列消息)。

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

      1. 如果想要提供针对重播攻击的安全性,则需要质询 - 响应协议。通过重放攻击,我们意味着有意地重用相同的随机数(即,先前的认证令牌以某种方式被破坏并在将来的认证尝试中重用)。第一种情况(具有足够熵的秘密)的一个技巧是从对方接收具有挑战性的随机数,并将此随机数用于认证令牌String。因此,每个客户使用其他方收到的随机数。

      2. 扩展上述挑战 - 响应解决方案,有时建议使用两种随机数,例如,

      3. 甲方发送SHA3-256(secret, nonce)

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

        这是为了提供额外的保证,即聚合的nonce由双方控制,如果其中只有一个是恶意的,或者它的PRNG有缺陷,你仍然可以产生独特的nonce。

        NoteE :我们应该确保 SHA3-256(secret, noncefromPartyB, noncefromPartyA) ,因为回复第二方的人可以与第一方重用(转发)相同的身份验证令牌(再一次重播攻击)。

        NoteF :同样,我们强调上述哈希值中的nonce顺序应该不同,以便再次防止内部重放攻击,即使我们每个用户使用不同的nonce也是如此!

答案 1 :(得分:0)

我可以用SHA256向我的秘密发送第一个128位到另一边,并让另一方检查他的秘密SHA256哈希与他的前128位匹配。然后他可以将他的下半场送到第一方,以验证它是否与他的匹配。