缓冲数字签名/验证非常大的文件Java

时间:2014-06-05 00:43:31

标签: java digital-signature digital-certificate

好吧,所以我在很多地方检查过但仍无法找到答案。所以我想逐块验证一个文件,而不是将它全部加载到内存中。我知道我可以使用bufferedreader来逐个更新签名,但这不是我想要的。我想缓冲部分数据,然后使用签名和证书来验证数据的一部分然后重复,直到整个文件被验证为止我每次只将一小部分文件加载到内存中。如果我有1GB文件,我无法有效地将其加载到内存中以签名/验证文件。

2 个答案:

答案 0 :(得分:1)

对于如何验证经过数字签名的文件存在一些疑惑。

诀窍是,非常精确,文件本身没有签名。相反,表示文件的哈希值已签名。应使用SHA-2散列算法创建散列值。

因此,涉及整个文件的唯一操作是为文件创建哈希值的过程。通常使用SHA-2变体之一。

所以真正的问题是将SHA-2哈希计算为流操作。这是您需要解决的真正问题。

获得文件的哈希值后,您需要执行验证数字签名的其他方面。 - 但它们都不涉及整个文件。

答案 1 :(得分:1)

签名包括散列操作(例如SHA-256),后跟填充方案(例如PSS),然后是单向函数(例如,使用RSA的私钥进行模幂运算)。

现在哈希总是在整个数据量上,并且不能被分割。哈希通常在Signature.update方法之一中计算,这些方法已经提供了流支持。填充和单向函数在signverify方法之一执行。

因此,只有这种结构,您无法执行数据的部分验证。


执行部分数据验证的一种方法如下:

  1. 创建一个包含(SHA-256)哈希数据片段的新结构;
  2. 使用签名签署上述结构,并将签名添加到结构中;
  3. 代替签名,将新结构添加到数据中。
  4. 现在阅读数据时:

    1. 首先使用签名阅读并验证整个结构;
    2. 读取任何给定的片段,并验证结构中的散列。
    3. 并且presto。