数字签名错误 - 签名长度不正确:得到344但期望256
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数字签名错误 - 签名长度不正确:得到344但期望256相关的知识,希望对你有一定的参考价值。
我正在使用带有256位证书的SHA1withRSA算法开发数字签名java类。但是我收到了这个错误:
签名长度不正确:得到344但是期待256。
我正在使用SunJSSE提供程序(未实现SHA256withRSA算法),因为他使用PKCS12密钥库类型。我需要这个,因为这是一个批处理应用程序。
SAH1withRSA算法是否与256位证书不兼容?
首先,您不可能拥有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,或者使用具有不同功能的任意数量的第三方库。
以上是关于数字签名错误 - 签名长度不正确:得到344但期望256的主要内容,如果未能解决你的问题,请参考以下文章
字段“签名”的值不正确:值为 662655099,但应为 67324752
Google Cloud Endpoints:verifyToken:签名长度不正确