我的项目使用来自某些第三方软件的一些数据集的签名验证.使用的签名算法是SHA1withDSA.当我使用SDK附带的标准SUN加密提供程序时,一切都很顺利.最近我切换到Bouncy Castle 1.50,之后一些以前(也就是SUN提供商)的数据集经过验证,开始失败,其余的仍然可以验证.
我探索了两个提供商的源代码,结果发现SDK的默认提供商对错误形成的签名(虽然能够被恢复)有某种保护,而Bouncy Castle提供商没有它.查看
OpenJDK for Java 7(第336-344行)或
OpenJDK for Java 8(第265-273行):在某些情况下,他们已经做了一些签名修复.org.bouncycastle.jcajce.provider.asymmetric.dsa.DSASigner#engineVerify此外,没有做过这样的事情,而且org.bouncycastle.crypto.signers.DSASigner#verifySignature明确指出数字必须是正数,否则验证会立即失败.
这是BC的一个错误,还是我错过了什么?为了克服这个问题,我已经将子类化org.bouncycastle.crypto.signers.DSASigner并添加了相同的上述签名修复,然后将其作为另一个签名算法(通过子类化org.bouncycastle.jcajce.provider.asymmetric.dsa.DSASigner)插入.但也许我忽略了另一种方式,这个"问题"是众所周知的?请指教.