我正在尝试使用oracle中的this tutorial对我正在使用的文件进行数字签名。
这一切都在我的本地机器上运行得很好,但是当我尝试在没有鼠标,键盘等的Web服务器上运行它时,我设法只签署一个文件,并且每次尝试都会导致以下异常:< / p>
java.security.ProviderException: nextBytes() failed
这恰好在执行sign函数时发生:
byte[] realSig = dsa.sign();
从我到目前为止所学到的,这可能是由于排出生成随机序列所需的熵池引起的。在没有输入设备的服务器上,它的填充速度不够快。如果实际上是这种情况,一种解决方案可能是将随机种子的来源从dev / random更改为dev / urandom,但是有人告诉它,出于安全原因它并不好。
所以问题是:这真的是我问题的原因吗?如果是这样,强制Java使用dev / urandom的方式是什么?或者有更好的方法来处理这个问题吗?
编辑:正如这里提到的,但在我回复之前删除了他的答案,添加以下代码解决了问题:
if (System.getProperty("java.security.egd") == null) {
System.setProperty("java.security.egd", "file:///dev/urandom");
}
它可能不是最好的解决方案,但它足以签署和验证文件。