file - 如何使用 NaCl 对大文件进行签名?
问题描述
鉴于 Go NaCl 库 ( https://github.com/golang/crypto/tree/master/nacl/sign ) 的签名能力,如何签署文件,尤其是超过 1GB 的超大文件?大多数互联网搜索结果都是关于对切片或小字节数组进行签名的。
我可以想到两种方法:
- 循环遍历文件并以块的方式流式传输(例如每次 16k),然后将其输入到 sign 函数中。流式输出连接到签名证书中。为了验证,它是相反的。
- 使用 SHA(X) 生成文件的 shasum,然后对 shasum 输出进行签名。
解决方案
对于签署非常大的文件(数 GB 及以上),使用标准签名函数的问题通常是运行时和脆弱性。对于非常大的文件(或只是慢速磁盘),从头到尾连续读取完整文件可能需要数小时或更长时间。
在这种情况下,您需要一种并行处理文件的方法。适用于加密签名的常见方法之一是 Merkle 树哈希。它们允许您将大文件分成更小的块,并行散列它们(产生“叶散列”),然后在树结构中进一步散列这些散列以生成代表完整文件的根散列。
一旦你计算了这个 Merkle 树根哈希,你就可以签署这个根哈希。然后可以使用签名的 Merkle 树根哈希来并行验证所有文件块,并验证它们的顺序(基于树结构中叶哈希的位置)。
推荐阅读
- apache-spark - spark.yarn.jars 和 spark.yarn.archive 都没有设置,回退到上传 SPARK_HOME 下的库吗?
- java - 删除时执行 JPA 托管实体的清理方法
- java - 自定义Java注解引入方法参数和执行代码
- java - 如何调用以 hashmap 作为参数的用户定义方法?
- python - __call__ 装饰器没有通过 self 参数
- prolog - 写一个跳过谓词
- reactjs - 在 onChange 之后反应表内部输入失去对自身的引用
- node.js - 如何阻止 express 中的 router.post 终止对同一路由的先前呼叫?
- java - ASM 替换某些编码值
- javascript - 获取 JavaScript 中元素的每个子元素的每个子元素