Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/382.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用JCA有效地检查大型数据集上的签名_Java_Security_Performance_Digital Signature_Jca - Fatal编程技术网

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

Java 使用JCA有效地检查大型数据集上的签名,java,security,performance,digital-signature,jca,Java,Security,Performance,Digital Signature,Jca,我必须在一个可能大到2Gb的文件上验证签名,并且我希望以尽可能节省内存的方式进行验证。由于各种原因,该文件将被完全加载到内存中,并由应用程序使用InputStream进行访问。我想使用流接口验证签名,但是JCAsignatureclass'update方法只接受byte[]和相关类 我怎样才能有效地做到这一点?我不想将beast加载到第二个字节数组中,否则我们将看到一些严重的高内存使用率,但接口似乎不支持它 更新 如果重要的话,签名算法是SHA-1为什么不一次读取一个块(4096字节或任何方便的

我必须在一个可能大到2Gb的文件上验证签名,并且我希望以尽可能节省内存的方式进行验证。由于各种原因,该文件将被完全加载到内存中,并由应用程序使用
InputStream
进行访问。我想使用流接口验证签名,但是JCA
signature
class'
update
方法只接受
byte[]
和相关类

我怎样才能有效地做到这一点?我不想将beast加载到第二个字节数组中,否则我们将看到一些严重的高内存使用率,但接口似乎不支持它

更新


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

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

创建一个字节数组作为缓冲区,一次从输入流读取缓冲区,每次对签名调用update()。如果缓冲区的大小合理,那么将数据从一个进程传输到另一个进程所消耗的CPU时间(我猜这就是您正在做的?)与计算时间相比可能可以忽略不计。在从磁盘读取数据的情况下,CPU使用率回报可以忽略不计的临界点似乎是8K左右的缓冲区大小,我怀疑这或多或少也适用于您的情况。(如果有意思,请看我放在一起的那页。)

我喜欢它的声音;
update()
是否刷新先前更新的块?我假设它是为了迭代地更新给定输入的签名,最后调用一些“finish()”方法。。。您是否有指向描述签名类的页面的链接?除了一些模糊的描述外,我找不到它。当更改每个签名更新的不同字节数组缓冲区大小时,是否正确?base64签名的结果是否不同?