我想写一个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.")
}
}
两个问题:
重要的是,在这个挑战 - 响应协议中,秘密永远不会泄露。
答案 0 :(得分:4)
根据您的要求,有各种策略:
nonce
并发送SHA3-256(secret, nonce)
或SHA2-256d
(双重哈希)甚至更好{{ {1}}以及HMAC
到另一方。NoteA:正如您所注意到的,我省略了简单的SHA256,因为它容易受length extension attacks的影响。
注意:发送一半的哈希值,如@ Kid101已经提到的那样,仍然有效,但它降低了安全级别,因此nonce方法被认为更安全和优雅。
NoteC: nonce方法提供额外的(可能需要的)不可链接属性,根据该属性,恶意攻击者无法判断在两个不同的事务/流中是否重用了相同的nonce
。我们需要的是始终生成一个新的随机数。
secret
,例如弱密码或用户ID)。然后,一个(中间人)可以简单地强制简单的哈希或MAC方法(即使应用了一个随机数)来轻松提取&#34;弱&#34;秘密。此问题的解决方案更复杂,需要某种加密(即通过安全通道或使用password authenticated key agreement protocol发送散列消息)。
醇>
NoteD: Corda节点无论如何都通过TLS连接,但如果您需要保护静态数据(即检查点),则应使用额外的加密层。
如果想要提供针对重播攻击的安全性,则需要质询 - 响应协议。通过重放攻击,我们意味着有意地重用相同的随机数(即,先前的认证令牌以某种方式被破坏并在将来的认证尝试中重用)。第一种情况(具有足够熵的秘密)的一个技巧是从对方接收具有挑战性的随机数,并将此随机数用于认证令牌String
。因此,每个客户使用其他方收到的随机数。
扩展上述挑战 - 响应解决方案,有时建议使用两种随机数,例如,
甲方发送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位匹配。然后他可以将他的下半场送到第一方,以验证它是否与他的匹配。