从数字证书中提取签名

时间:2015-02-05 10:46:55

标签: python pdf openssl digital-signature pyopenssl

我的系统中有很多pdf。我需要检查所有这些文件是否都是: -

  • 以数字方式签名
  • 维护其完整性(通过比较文件内容的哈希值和/ Contents。signature dictionary中嵌入的消息摘要。

我正在使用python来执行此操作。直到现在我已经能够使用PyPDF2从签名字典中获取/Content。内容是pkcs7 - der编码。有没有办法可以提取签名的邮件摘要?

类似的操作在C this answer

中完成

2 个答案:

答案 0 :(得分:1)

DER是二进制格式,其结构称为ASN.1。 PEM格式是Base64编码的DER。

这个在线PEM解码器非常有用:http://lapo.it/asn1js/在您识别出其中的消息签名后,您可以编写代码以通过任何ASN.1库提取它。

答案 1 :(得分:0)

SignedDataCADESCMS签名的PKCS#7 1.5子类型包含SignerInfodefined here的集合,基本上包含:

  • SignerIdentifier:证书集合的密钥
  • DigestAlgorithmIdentifier:用于计算消息摘要的算法
  • SignedAttributes(可选):密封数据:
  • SignatureAlgorithmIdentifier:用于计算签名的算法(通过SignedAttributes)
  • SignatureValue:签名值
  • UnsignedAttributes(可选)

SignedAttributes可能包含,具体取决于签名的类型:

  • ContentType:已签名内容的类型
  • 消息摘要
  • SigningTime
  • 联署

如果我们仅使用找到的第一个签名并使用my forkpyx509来简化此操作,则可能是某种类型的代码(未经测试):

    public static void saveCookie(Context context, String cookie) {
        if (cookie == null) {
            return;
        }

        // Save in the preferences
        SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context.getApplicationContext());
        if (null == sharedPreferences) {
            return;
        }
        SharedPreferences.Editor editor = sharedPreferences.edit();
        editor.putString("cookie", cookie);
        editor.commit();
    }

    public static String getCookie(Context context)
    {
        SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context.getApplicationContext());
        String cookie = sharedPreferences.getString("cookie", "");
        if (cookie.contains("expires")) {
            removeCookie(context);
            return "";
        }
        return cookie;
    }