鉴于 Go NaCl 库 ( https://github.com/golang/crypto/tree/master/nacl/sign ) 的签名功能,如何对文件进行签名,尤其是超过 1GB 的超大文件?大多数互联网搜索结果都是关于对 slice 或小字节数组进行签名的。
我可以想到两种方法:
- 以 block 的方式循环文件和流(例如每次 16k),然后将其输入符号函数。流式输出连接成签名证书。为了验证,它是相反的。
- 使用 SHA(X) 生成文件的 shasum,然后对 shasum 输出进行签名。
最佳答案
对于非常大的文件(数 GB 及以上),使用标准签名功能的问题通常是运行时和脆弱性。对于非常大的文件(或只是慢速磁盘),从头到尾连续读取整个文件可能需要数小时或更长时间。
在这种情况下,您需要一种并行处理文件的方法。一种适用于加密签名的常见方法是 Merkle 树哈希。它们允许您将大文件拆分成较小的 block ,并行散列它们(生成“叶散列”),然后进一步散列树结构中的这些散列以生成代表完整文件的根散列。
一旦你计算出这个 Merkle 树根哈希,你就可以签署这个根哈希。然后可以使用签名的 Merkle 树根哈希并行验证所有文件 block ,以及验证它们的顺序(基于树结构中叶哈希的位置)。
关于file - 如何使用 NaCl 对大文件进行签名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55554802/