Java 使用JCA有效地检查大型数据集上的签名
我必须在一个可能大到2Gb的文件上验证签名,并且我希望以尽可能节省内存的方式进行验证。由于各种原因,该文件将被完全加载到内存中,并由应用程序使用Java 使用JCA有效地检查大型数据集上的签名,java,security,performance,digital-signature,jca,Java,Security,Performance,Digital Signature,Jca,我必须在一个可能大到2Gb的文件上验证签名,并且我希望以尽可能节省内存的方式进行验证。由于各种原因,该文件将被完全加载到内存中,并由应用程序使用InputStream进行访问。我想使用流接口验证签名,但是JCAsignatureclass'update方法只接受byte[]和相关类 我怎样才能有效地做到这一点?我不想将beast加载到第二个字节数组中,否则我们将看到一些严重的高内存使用率,但接口似乎不支持它 更新 如果重要的话,签名算法是SHA-1为什么不一次读取一个块(4096字节或任何方便的
InputStream
进行访问。我想使用流接口验证签名,但是JCAsignature
class'update
方法只接受byte[]
和相关类
我怎样才能有效地做到这一点?我不想将beast加载到第二个字节数组中,否则我们将看到一些严重的高内存使用率,但接口似乎不支持它
更新
如果重要的话,签名算法是SHA-1为什么不一次读取一个块(4096字节或任何方便的大小)的输入流,为每个块调用update()。创建一个字节数组作为缓冲区,一次从输入流读取缓冲区,每次对签名调用update()。如果缓冲区的大小合理,那么将数据从一个进程传输到另一个进程所消耗的CPU时间(我猜这就是您正在做的?)与计算时间相比可能可以忽略不计。在从磁盘读取数据的情况下,CPU使用率回报可以忽略不计的临界点似乎是8K左右的缓冲区大小,我怀疑这或多或少也适用于您的情况。(如果有意思,请看我放在一起的那页。)我喜欢它的声音;
update()
是否刷新先前更新的块?我假设它是为了迭代地更新给定输入的签名,最后调用一些“finish()”方法。。。您是否有指向描述签名类的页面的链接?除了一些模糊的描述外,我找不到它。当更改每个签名更新的不同字节数组缓冲区大小时,是否正确?base64签名的结果是否不同?