首页 > 解决方案 > 如何使用 NaCl 对大文件进行签名?

问题描述

鉴于 Go NaCl 库 ( https://github.com/golang/crypto/tree/master/nacl/sign ) 的签名能力,如何签署文件,尤其是超过 1GB 的超大文件?大多数互联网搜索结果都是关于对切片或小字节数组进行签名的。

我可以想到两种方法:

  1. 循环遍历文件并以块的方式流式传输(例如每次 16k),然后将其输入到 sign 函数中。流式输出连接到签名证书中。为了验证,它是相反的。
  2. 使用 SHA(X) 生成文件的 shasum,然后对 shasum 输出进行签名。

标签: filegocryptographysignature

解决方案


对于签署非常大的文件(数 GB 及以上),使用标准签名函数的问题通常是运行时和脆弱性。对于非常大的文件(或只是慢速磁盘),从头到尾连续读取完整文件可能需要数小时或更长时间。

在这种情况下,您需要一种并行处理文件的方法。适用于加密签名的常见方法之一是 Merkle 树哈希。它们允许您将大文件分成更小的块,并行散列它们(产生“叶散列”),然后在树结构中进一步散列这些散列以生成代表完整文件的根散列。

一旦你计算了这个 Merkle 树根哈希,你就可以签署这个根哈希。然后可以使用签名的 Merkle 树根哈希来并行验证所有文件块,并验证它们的顺序(基于树结构中叶哈希的位置)。


推荐阅读