我们正在使用一个名为
在这种情况下会发生什么:当要在
license3j
的Java库进行许可证管理。该库使用非对称加密,并依赖于Bouncycastle。我们使用简单的gpg
命令创建许可证文件,并在我们的软件中使用公钥验证许可证。到目前为止,一切都运行良好。但是,在生成的1,000个许可证中,有很小一部分无法正确验证,尽管它们实际上是有效的(大约5/1000)。在这种情况下会发生什么:当要在
com.verhas.licensor.License.setLicenseEncoded(InputStream)
中验证许可证时,org.bouncycastle.openpgp.PGPOnePassSignature.verify(PGPSignature)
会抛出以下异常:
org.bouncycastle.openpgp.PGPRuntimeOperationException: 无法验证签名:签名长度不正确:得到了511但期望是512
对于我只有基本密码学知识的人来说,这听起来相当晦涩。经过几个小时的谷歌搜索,我想到了“前导零”的问题。所以,在这个例子中,显然某个地方(哪里?)削减了一个前导零,并且要比较的签名数据长度不匹配。很有道理。
现在,我不知道问题可能在哪里。是在许可文件的创建过程中出现的吗?基本上,我们只需执行以下操作:
gpg --armor --local-user=name.of.software --sign
这将为我们提供许可文件。
或者错误发生在验证期间?我是否需要修改任何Bouncycastle配置以正确解决前导零问题?他们的FAQ给出了一些提示,但是License3j
source显然从未使用过任何Cipher
实例,因此我完全不知道如何将其集成到给定的API中。
我知道这是一个非常特殊的问题,涉及到一个显然不太知名的库。因此,我感激任何小的反馈或输入。
java.security.Signature
类。验证步骤似乎并不太复杂,所以我也考虑重新编写该功能。 - qqilihq