gpt4 book ai didi

java - 带有 SHA1 签名验证的 Bouncy CaSTLe DSA

转载 作者:搜寻专家 更新时间:2023-10-31 20:28:18 24 4
gpt4 key购买 nike

我的项目正在使用来自某些第三方软件的一些数据集的签名验证。使用的签名算法是 SHA1withDSA。当我使用 SDK 附带的标准 SUN 加密提供程序时,一切正常。最近我切换到 Bouncy CaSTLe 1.50,之后是一些以前(即与 SUNprovider) standed verification, beginning fail it, while the rest is still verified OK.

我研究了这两个提供者的源代码,结果发现 SDK 的默认提供者有某种防止错误格式签名的保护(同时能够恢复),而 Bouncy CaSTLe 提供者没有。查看 OpenJDKfor Java 7 (第 336-344 行)或 OpenJDKfor 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)。但也许我忽略了另一种方式,而这个“问题”是众所周知的?请指教。

最佳答案

如果 ASN.1 整数的不正确 BER/DER 编码——存储为signed大端,右对齐八位字节——确实是罪魁祸首,那么 Bouncy 不会有一个错误。如果设置了编码的第一位,则正值应使用 00 值字节进行填充,否则它将表示负值。

Sun 提供者允许此类签名进行验证是错误的,另一方当然会生成无效签名。请注意,可以在 Sun 代码中不使用此“修复”来验证签名:只需在 将其提供给验证功能之前调整编码。

唯一不可能的情况是 DSA 验证作为通用签名验证方法从另一个库调用,而不是从可以在调用前调整数据的应用程序调用。

另一方面,我认为您已经创建了一个优雅的修复程序。唯一的问题是,如果提供者的签名是从符合 JCA 的框架中验证的,它可能无法运行。另一种可能的解决方法是在将其送入 Signature 类进行验证之前重新编码。

请注意,我不认为这是一个安全问题;签名由 R 和 S 的值组成,它们的编码方式无关紧要,只要您最终收到正确的值即可。

关于java - 带有 SHA1 签名验证的 Bouncy CaSTLe DSA,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23735004/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com