java - 从 XML 签名值获取 sha1 哈希值

标签 java rsa digital-signature xml-signature rsa-sha256

我需要有人帮助我理解 XML 数字签名方法 rsa-sha1。我认为签名值= RSA-encrypt(sha1(signedInfo), privatekey)。

注意 Base64.encode(sha1(signedInfo)) 包含 28 个字符。所以我认为 Base64.encode(RSA-decrypt(signaturevalue), publickey) 也应该返回 28 个字符。然而,我实际上得到了一个 48 个字符的字符串。

Base64 base64 = new Base64();
byte[] encrypted = base64.decode(signatureValue);
try {
        Cipher cipher = Cipher.getInstance("RSA");
        cipher.init(Cipher.DECRYPT_MODE, getX509Cert().getPublicKey());
        byte[] cipherText = cipher.doFinal(encrypted);

        System.out.println(base64.encodeToString(cipherText));
        //print out MCEwCQYFKw4DAhoFAAQU0G+7jFPydS/sWGO1QPjB0v3XTz4=
        //which contains 48 characters. 
 }
 catch (Exception ex){
    ex.printStackTrace();
 }

XML 文件中指示的签名方法

<ds:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>

最佳答案

RSA 签名实际上与使用私钥加密不同,但 JCE 通过允许 RSA 的 Cipher 中的“向后”操作(仅限)来促进此错误,该操作实际上执行 PKCS1-v1_5 签名,并且恢复而不是按照其设计目的进行加密和解密。

对于 PKCS1 到 v1.5 中的原始标准化 RSA 签名方案(现在改名为 RSASSA-PKCS1-v1_5),该值被填充(使用“类型”01 多个 FF 和一个 00)并用私钥进行 modexp'ed 不仅仅是哈希值,而且是包含哈希值的 ASN.1 结构。请参阅 section 9.2 of rfc8017 中的编码操作 EMSA-PKCS1-v1_5或 rfc3447 或 rfc2437 中的 9.2.1,尤其是步骤 2 和(对于较新的两个版本)“注释”项 1。

欺骗Using SHA1 and RSA with java.security.Signature vs. MessageDigest and Cipher
Separate digest & signing using java security provider

关于java - 从 XML 签名值获取 sha1 哈希值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48013643/

相关文章:

ios - 如何使用 Monotouch 或 Xcode 4.2 对 PDF 文件进行数字签名?

cryptography - 公钥指纹与数字签名

java - 具有 RSA 签名的 SHA256 在各种 Android 设备上返回不同的输出

java - JNDI 定义中的额外信息

java - 无法在 Spring Boot 中使用 @Async

python - 将 RSA key 导入 Python

c# - 将 Asp.Net Core 1 转换为 Core 2 后 Jwt 不工作

java - 我可以在 Acrobat Pro 之外为 PDF 启用数字签名吗?

java - 这四个 Android 类包含的模式的名称是什么?

java - 通过避免在特定场景中重写 java 父类(super class)方法来重新使用父类(super class)方法