- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我的项目正在使用来自某些第三方软件的一些数据集的签名验证。使用的签名算法是 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/
我正在实现 hangFire,它是我项目中的作业调度库。 我面临着与此 link 中相同的问题 然而,将 LifestylePerWebRequest() 替换为 HybridPerWebReques
在我的项目中,我需要同时使用 CaSTLe.Windsor 和 Moq dll。 Windsor 要求 CaSTLe.Core 也在项目中被引用。 当我尝试使用 CaSTLe.Core 中的方法时,问
我已将我的解决方案从城堡版本 1.0 更新到版本 3.0,现在我收到此错误: Type Castle.Facilities.FactorySupport.FactorySupportFacility
我的应用程序使用“SignalR”客户端/服务器通信框架。如果您不熟悉它,服务器端应用程序通常包含一个或多个“集线器”类(类似于 asmx 网络服务),每个类都提供可由客户端调用的方法。在启动期间,客
假设我有这样的组件 public class MyComponent { public MyComponent(string name) { } } 我基本上想让提供的构造函数
我想知道是否有一些最佳实践来实现我需要的功能。 我有一个 Web 应用程序,它在启动期间通过反射扫描某些程序集(插件)并针对公共(public)内核注册它们的依赖项。 外部库可能需要相同的依赖项。 例
我想知道是否有一些最佳实践来实现我需要的功能。 我有一个 Web 应用程序,它在启动期间通过反射扫描某些程序集(插件)并针对公共(public)内核注册它们的依赖项。 外部库可能需要相同的依赖项。 例
是否有关于如何使用 CaSTLe Windsor 的自动事务管理的任何简单示例? documentation似乎缺少一些信息。我看到有用于 nHibernate、ActiveRecord 等的工具……
这是一次回答,但从那时起下载站点已经改变(显然)。我根本找不到 CaSTLe.MicroKernel。 2.51 不能再下载,它不在 2.52 中。或 2.53。 最佳答案 没有Castle.Micr
我正在将我们的项目从 .Net 2 升级到 .Net4.5,同时我将尽可能多的引用推送到 NuGet 并确保版本是最新的。 我在运行其中一项测试时遇到问题 测试类: public cl
当我开始使用 Windsor 时,我认为 DI 会很简单。现在它让我越来越困惑。 在我看来,存储库是一个具有单例生命周期的类。我应该有一个 FooRepository 实例来在应用程序的生命周期内将
我有一个接口(interface) ISession,其实例由不同的 session 工厂生成,具体取决于类所属的命名空间。 我的组件注册示例: IWindsorContainer container
我正在关注 example by José F. Romaniello使用 NHibernate 进行 session 管理。这是一篇非常好的文章,但是我在 NHibernate、Windsor 和
我有一个看似简单的用例。有一个 ICsvReader 组件。让我们在这里简单地将它命名为 Reader。我们加载了一组已知的 CSV 文件,其中一些有标题,有些没有。目前有多个阅读器:Reader_S
试图找出这件事的真正原因,但并没有太多乐趣! Type is not resolved for member 'Castle.MicroKernel.Lifestyle.Scoped.CallCont
这是我在 Global.asax 中的代码 WindsorContainer container = new WindsorContainer(); container.Register(Compo
我正在尝试了解如何使用 CaSTLe ActiveRecord 执行自定义查询。 我能够运行返回我的实体的简单查询,但我真正需要的是如下所示的查询(带有自定义字段集): 选择 count(1) 作为
在使用 ArrayResolver 时,如果我注册了一个接口(interface)的多个实现和一个依赖于所述接口(interface)数组的类,我希望数组解析器注入(inject)所有可以成功解析的接
我为服务注册了两个组件: container.Register( Component.For().Named("FirstChoice").ImplementedBy... Compo
有没有人有一些使用城堡 Windsor InstallerFactory 来订购安装程序的示例代码? 似乎无法在文档或其他地方找到它。 干杯 最佳答案 您只能使用 InstallerFactory与
我是一名优秀的程序员,十分优秀!