我想写一个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.")
}
}两个问题:
重要的是,在这个挑战响应协议中,秘密永远不会被泄露。
发布于 2018-05-02 21:57:29
根据您的需求,有不同的策略:
nonce,并将SHA3-256(secret, nonce)或SHA2-256d (双哈希)或甚至更好的HMAC连同它们的nonce发送给对方。NoteA:正如您注意到的,我忽略了简单的SHA256,因为它容易受到长度扩展攻击的影响。
NoteB:发送一半的散列(正如@Kid101中已经提到的那样)仍然有效,但它降低了安全性,因此现在的方法被认为更安全和优雅。
NoteC:现在的方法提供了额外的(可能需要的)不可链接属性,根据该属性,恶意攻击者无法判断是否在两个不同的事务/流中重用相同的secret。我们需要的总是产生一个新的随机的现在。
String,如弱密码或userID)。然后,一个人(中间人)可以简单地强制使用简单的散列或MAC方法(即使应用了一个名)来轻松地提取“弱”秘密。该问题的解决方案更为复杂,需要某种加密(即通过安全通道或使用口令认证密钥协商协议发送散列消息)。NoteD: Corda节点无论如何都是通过TLS连接的,但是如果您需要在rest (即检查点)保护数据,则应该使用额外的加密层。
SHA3-256(secret, nonce)。因此,每个客户端都使用对方接收到的时间。SHA3-256(secret, noncefromPartyA, noncefromPartyB) 甲方发送
和
SHA3-256(secret, noncefromPartyB, noncefromPartyA) 乙方发送
这是为了提供额外的保证,即聚合的当前是由双方控制的,如果其中一个是恶意的,或者它的PRNG是有缺陷的,那么您仍然可以产生唯一的非can。
noncefromPartyA != noncefromPartyB,:我们应该确保这个NoteE,因为第二个应答者可以与第一方重用(转发)相同的身份验证令牌(同样是一种重放攻击)。
NoteF:按照同样的思路,我们强调上述散列中的非per的顺序应该是不同的,以再次防止内部重放攻击,即使我们对每个用户使用不同的非per!
发布于 2018-05-02 17:51:31
我可以使用SHA256散列我的秘密,将第128位发送到另一边,让另一方检查他的秘密SHA256散列是否与他的前128位匹配。然后,他可以把他的下半场送到第一场比赛,以验证是否与他的比赛相匹配。
https://stackoverflow.com/questions/50139852
复制相似问题