使用JCA有效地检查大型数据集上的签名

时间:2009-01-02 20:53:32

标签: java security performance digital-signature jca

我必须在可能大到2Gb的文件上验证签名,并且我希望以尽可能节省内存的方式执行此操作。由于各种原因,该文件已经完全加载到内存中,并由应用程序使用InputStream进行访问。我想使用流界面验证签名,但JCA Signature类'update方法只接受byte[]及相关类。

我该如何有效地做到这一点?我不想将野兽加载到第二个字节数组中,否则我们会看到一些非常高的内存使用,但是接口似乎不支持它。

更新

如果重要,签名算法是SHA-1

2 个答案:

答案 0 :(得分:2)

为什么不一次只读取一个块(4096字节或任何方便大小)的输入流,为每个块调用update()。

答案 1 :(得分:1)

创建一个字节数组以充当缓冲区并一次从InputStream读取缓冲区,每次都在Signature上调用update()。如果缓冲区的大小合理,那么将数据从一个进程传输到另一个进程所消耗的CPU时间(我猜你正在做的是什么?)与计算时间相比可能是微不足道的。在从磁盘读取的情况下,CPU使用率可忽略不计的回报的截止点似乎是大约8K的缓冲区大小,我怀疑这也会或多或少地适用于您的情况。 (如果有意思,请参阅我在InputStream buffer sizes上放在一起的页面。)