首先,您不可能拥有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 默认配置为禁止使用SHA1签名证书 在TLS中 (包括SSL,但SSL也会被破坏并默认禁止)。 Java目前不禁止使用SHA1签名,但可能会更改为。您可能希望与浏览器,Web服务器,电子邮件系统,存储库等进行通信或互操作的许多内容已经禁止使用SHA1或者可能会禁用。
jdk.certpath.disabledAlgorithms
的 但这没有必要。 强> 您可以在一个程序中使用多个提供程序,特别是您可以使用SunJSSE中的KeyStore PKCS12,同时还可以使用SunRsaSign的Signature SHA256withRSA(或其他SHA2 + RSA变体)。实际上,最简单的方法是不指定提供者,只是让它 KeyStore.getInstance() 和 Signature.getInstance() (以及其他JCA接口类)自动找到正确的提供程序。
KeyStore.getInstance()
Signature.getInstance()
最后, 的 您的签名可能是base64编码的: 强> 小区(3分之256)* 4 = 344。看看数据,看它是否包含base64字符,如果是,则设置。如果是base64,则将其解码为二进制(即 byte[] 在Java中)并使用它。在Java8 +中使用 java.util.Base64 它支持现在常见的两种变体:'MIME'变体和'URL-safe'(主要是JSON)变体。在较旧的Java中,您可以使用 javax.xml.bind.DatatypeConverter 适用于MIME或具有不同功能的任意数量的第三方库。
byte[]
java.util.Base64
javax.xml.bind.DatatypeConverter