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

在Corda中,两个节点如何相互证明它们都知道一条信息?,corda,Corda,我想写一个Corda流程,其中只有当双方都能证明他们共享一条共同的信息时,双方才能进行交易。流程概述如下: @InitiatingFlow @StartableByRPC class ChallengeResponseFlow(val otherParty: Party, val proofOfKnowledge: Int) : FlowLogic<Unit>() { @Suspendable override fun call() { val ot

我想写一个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.")
    }
}
@InitiatingFlow
@星表
类ChallengeResponseFlow(val其他方:Party,val知识证明:Int):FlowLogic(){
@暂停
覆盖有趣的调用(){
val otherPartySession=initiateFlow(其他方)
otherPartySession.send(知识证明)
val theirprooffknowledge=otherPartySession.receive().unwrap{theirprooffknowledge->theirprooffknowledge}
verifySecretValue(他们的ProofkKnowledge)
TODO(“质询响应已通过。继续流动”)
}
私人娱乐验证他们的ProoffKnowledge(他们的ProoffKnowledge:Int){
TODO(“写入验证逻辑”)
}
}
两个问题:

  • 有什么证据可以证明我知道与对手相同的秘密
  • 我如何根据对方发送给我的知识证明来检查对方是否知道相同的秘密

重要的是,在这个质询-响应协议期间,秘密永远不会泄露。

我可以用SHA256散列我的秘密,将前128位发送给另一方,让另一方检查他的秘密SHA256散列是否与他的前128位匹配。然后,他可以将他的后半部分发送给第一方,以验证它是否与他的匹配。

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

  • 假设秘密具有足够的熵(即,至少128位),双方可以选择一个随机的
    nonce
    ,并将
    SHA3-256(秘密,nonce)
    SHA2-256d
    (双哈希)或更好的
    HMAC
    及其
    nonce
    发送给另一方
  • 注A:正如您所注意到的,我省略了简单的SHA256,因为它容易受到攻击

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

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

  • 然而,在某些情况下,秘密没有足够的熵或根本不是随机的(即计数器或可预测的
    字符串,如弱密码或用户ID)。然后,一个(中间的人)可以简单地强制简单的散列或MAC方法(即使应用了nonce)轻松提取“弱”秘密。此问题的解决方案更为复杂,需要某种加密(即,通过安全通道或使用加密协议发送散列消息)
  • 注意:Corda节点无论如何都是通过TLS连接的,但是如果您需要保护静止数据(即检查点),则应使用额外的加密层

  • 如果想要提供针对重播攻击的安全性,则需要质询响应协议。重放攻击是指故意重复使用相同的nonce(即,以前的身份验证令牌以某种方式被破坏,并在将来的身份验证尝试中重复使用)。第一种情况(具有足够熵的秘密)的一个技巧是从对方接收一个具有挑战性的nonce,并将该nonce用于身份验证令牌
    SHA3-256(秘密,nonce)
    。因此,每个客户机都使用另一方收到的nonce

  • 扩展上述质询响应解决方案,有时建议同时使用两个nonce,例如

  • 甲方发送
    SHA3-256(保密、非保密、非保密)

    乙方发送
    SHA3-256(保密、非保密、非保密)

    这是为了提供额外的保证,即聚合的nonce由双方控制,如果其中只有一方是恶意的或其PRNG有缺陷,您仍然可以生成唯一的nonce

    注:我们应该确保
    不违反宪法!=因为第二方回复的人可以与第一方重复使用(转发)相同的身份验证令牌(同样是一种重播攻击)


    注:同样,我们强调上述散列中的nonce顺序应该不同,以再次防止内部重播攻击,即使我们每个用户使用不同的nonce

    现在的荣誉!我认为这不会阻止野蛮的暴力行为。我只是认为这个问题是一个需要从头开始解决的难题,而不是考虑安全的所有方面。Chackias在提供每个关键方面的答案方面做得很好。