【发布时间】:2019-04-07 01:02:28
【问题描述】:
鉴于 Go NaCl 库 (https://github.com/golang/crypto/tree/master/nacl/sign) 的签名能力,如何对文件进行签名,尤其是超过 1GB 的超大文件?大多数互联网搜索结果都是关于对切片或小字节数组进行签名的。
我能想到两种方法:
- 循环遍历文件并以块的方式流式传输(例如,每次 16k),然后将其输入到 sign 函数中。流式输出连接到签名证书中。为了验证,它是相反的。
- 使用 SHA(X) 生成文件的 shasum,然后对 shasum 输出进行签名。
【问题讨论】:
-
欢迎来到 crypto.stackexchange - 这似乎是一个编程问题,即使他们使用密码学,编程问题在这里也是题外话。编程问题的正确位置在stackoverflow;我可以帮你迁移到那里。
-
对于一个足够大的文件,计算整个文件的单个哈希并不简单,您可以使用 Merkle 树哈希将文件分成块,然后对哈希根进行签名。
-
来自 godoc:“消息应该很小,因为: 1. 整个消息需要保存在内存中以进行处理。 2. 使用大型消息对小型机器上的实现施加压力,无需验证签名即可处理明文。这是非常危险的,这个 API 不鼓励这样做,但是使用过多消息大小的协议可能会呈现一些没有其他选择的实现。 3. 使用适合数据缓存的消息可以提高性能。因此,应该对大量数据进行分块,以使每条消息都很小。“。
-
@Natanael,谢谢。你能把你的评论变成答案吗?这正是我正在寻找的东西。我找到了我需要的示例:github.com/cbergoon/merkletree/blob/master/merkle_tree.goen.wikipedia.org/wiki/Merkle_tree。我会将其标记为答案。
标签: file go cryptography signature