【问题标题】:Get the sha1-hashed value from XML signature value从 XML 签名值中获取 sha1-hashed 值
【发布时间】:2018-06-09 08:46:27
【问题描述】:

我需要有人帮助我理解 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"/>

【问题讨论】:

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


【解决方案1】:

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

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

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

【讨论】:

  • 谢谢@dave_thompson_085!使用您提供的信息,我能够找到答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-15
  • 2012-02-17
  • 1970-01-01
  • 1970-01-01
  • 2020-12-02
相关资源
最近更新 更多