file - 如何使用 NaCl 对大文件进行签名?

标签 file go cryptography signature

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

我可以想到两种方法:

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

最佳答案

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

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

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

关于file - 如何使用 NaCl 对大文件进行签名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55554802/

相关文章:

c++ - 尝试从文本文件读取到对象数组

java - 从 File[] 文件到目录

go - 如何从 tinygo webassembly 目标返回对象

java - 跨 Java 和 Python 的 PKI 验证

c++ - 使用 openssl 中的公钥验证数字签名

c# - 证书的私钥导出为不同的值?

file - 如何从另一个文件中获取 json 模式?

python - 在python中读取文件

go - 在 Golang 中以最小宽度 float 到字符串

Go:读取文件,goroutine 死锁