数字签名错误 - 签名长度不正确:得到344但期望256

问题描述 投票:0回答:1

我正在使用带有256位证书的SHA1withRSA算法开发数字签名java类。但是我收到了这个错误:

签名长度不正确:得到344但是期待256。

我正在使用SunJSSE提供程序(未实现SHA256withRSA算法),因为他使用PKCS12密钥库类型。我需要这个,因为这是一个批处理应用程序。

SAH1withRSA算法是否与256位证书不兼容?

java certificate digital-signature
1个回答
1
投票

首先,您不可能拥有256位RSA证书或密钥。当RSA于1977年发布时,256位RSA并不安全。该异常表示它正在寻找一个256字节的签名,即2048位,这意味着密钥和证书也是2048位,这是(自2015年起)标准和广泛使用的RSA大小。

其次,是的SHA1withRSA技术上使用2048位RSA密钥(和证书),虽然它不太安全。 SHA1最初仅针对碰撞被评为80位强度,并且在大约一年前被打破(成本显着降低,大约63位) - 请参阅https://shattered.io - 在许多情况下使签名不安全,从而导致更多以及拒绝SHA1签名的更多系统,程序和用户。例如,所有来自8u144的Oracle Java软件包(大约去年夏天)都默认配置了java.security jdk.certpath.disabledAlgorithms,以禁止在TLS中使用SHA1签名证书(包括SSL,但SSL也会被破坏并默认禁止)。 Java目前不禁止使用SHA1签名,但可能会更改为。您可能希望与浏览器,Web服务器,电子邮件系统,存储库等进行通信或互操作的许多内容已经禁止使用SHA1或者可能会禁用。

但这没有必要。您可以在一个程序中使用多个提供程序,特别是您可以使用SunJSSE中的KeyStore PKCS12,同时还可以使用SunRsaSign的Signature SHA256withRSA(或其他SHA2 + RSA变体)。实际上,最简单的方法是不指定提供程序,只需让KeyStore.getInstance()Signature.getInstance()(以及其他JCA接口类)自动找到正确的提供程序。

最后,您的签名可能是base64编码的:ceil(256/3)* 4 = 344。看看数据,看它是否包含base64字符,如果是,则设置。如果它是base64,则将其解码为二进制(即Java中的byte[])并使用它。在Java8 +中,只需使用java.util.Base64,它支持现在常见的两种变体:'MIME'变体和'URL-safe'(主要是JSON)变体。在较旧的Java中,您可以将javax.xml.bind.DatatypeConverter用于MIME,或者使用具有不同功能的任意数量的第三方库。

© www.soinside.com 2019 - 2024. All rights reserved.