Corda附件哈希生成、验证及SecureHash相关技术问题咨询
先给你梳理下Corda里附件哈希的核心逻辑:Corda对附件的哈希是基于文件完整二进制内容计算的,默认采用SHA-256加密哈希算法(可配置但极少调整),所有验证逻辑都围绕这个核心展开。下面逐个解答你的疑问:
疑问1:该哈希是否始终基于文件内容保持唯一性?
必须的。只要用的是加密安全的哈希算法(比如默认的SHA-256),从密码学角度来说,相同内容的文件必然生成相同哈希,不同内容的文件几乎不可能出现哈希碰撞(概率低到可以忽略)。Corda的SecureHash类严格实现了这个特性——它只读取文件的全部字节流来计算哈希,完全不受文件名、创建时间这类非内容元数据的影响。不管你在哪个节点上传同一份JAR,得到的哈希都是一模一样的。疑问2:若JAR文件内容发生变更,是否能保证哈希值随之改变(与常规哈希函数特性一致)?
完全符合常规加密哈希的特性!哪怕你只改了JAR里的一个字节——比如配置文件里的一个标点、代码里的一行注释——重新计算出的SecureHash都会完全不同。Corda计算哈希时会遍历文件的每一个字节,任何微小的内容改动都会直接改变最终的哈希结果,这也是后续完整性验证的核心依据。疑问3:交易对手方能否在其端验证哈希的完整性(即确认附件未被篡改)?
当然可以,而且这是Corda节点自动完成的流程。当你把带有附件哈希的交易发给对手方时,对方节点会获取到该附件的完整内容(要么随交易传输,要么从网络节点缓存拉取),然后会重新计算这个文件的SecureHash,再和交易里附带的哈希值做比对。如果两者匹配,就说明附件在传输或存储过程中没被篡改;如果不匹配,节点会直接拒绝这个交易,不会让它进入账本。疑问4:交易对手方能否验证JAR文件的真实性(即确认其由上传者签名)?
这里要明确:单纯的SecureHash本身不带签名信息,它只能验证完整性,没法直接证明是谁上传的。如果要验证真实性,你得在上传JAR时,额外用上传者节点的身份密钥对文件做数字签名,然后把签名和哈希一起放到交易里。对手方收到后,用上传者的公钥验证签名有效性就行——只要签名有效,就能确认这个JAR确实是声称的上传者提供的,而且内容没被篡改。
额外补充个细节:Corda的附件是分布式存储的,一个节点上传后,其他节点需要时会从对等节点获取,获取后都会自动重新计算哈希做完整性校验,确保整个网络里的附件内容一致。
内容的提问来源于stack exchange,提问作者Joel

