digital-signature 相关问题

用于证明数字消息或文档的真实性的数学方案(维基百科)。加密工具包通常与公钥 - 私钥对一起使用,以对消息进行数字签名并验证消息。

APDU 在数据标志上响应“6985:不满足使用条件”

我需要使用智能卡签署一些数据,为此我使用以下 APDU 命令: // 一些带有 PIN 验证等的代码... 等待 sendAPDUCommand(scContext, cardContext, "

回答 0 投票 0

是否可以使用加密 API:下一代 (CNG) 解密数字签名?

我正在为应用程序开发基于云的许可解决方案。应用程序可执行文件被封装起来,因此如果它被修改就不会运行。数字签名的许可证信息被发送到...

回答 0 投票 0

Getting digital signature Error "Error Encountered while BER decoding" using TCPDF

我使用 TCPDF 在 PDF 文档上创建数字签名。 我几乎使用这里提到的确切代码: http://www.tcpdf.org/examples/example_052.phps 我使用与我用于 th... 相同的 crt 文件

回答 1 投票 0

在 flutter 中混合 8 位音频文件

我正在尝试使用我在 chatGPT 答案和其他网站中找到的混合算法将多个 WAV 文件混合成一个文件。 我尝试使用以下代码通过简单的步骤混合音频: 双混合...

回答 0 投票 0

java中如何给带有附件的SOAP请求添加数字签名

我需要为带有附件的 SOAP 请求添加数字签名。我尝试了几种使用 xmlsec-3.0.2.jar 和 javax.xml.crypto 库的方法。但是他们都没有按预期工作....

回答 0 投票 0

时间戳服务器 API(signtool 使用的)

(代码签名)时间戳服务器期望的输入是什么?回复是什么格式? 我搜索了 VeriSign 的网站(以及更多网站),但除了使用 signto 等工具的说明外什么也没找到...

回答 2 投票 0

使用 NodeJS 的 ECDH 创建签名

我无法使用 Node 的加密模块为私钥所有权创建签名。如何使用以下十六进制公钥和私钥执行此操作: const crypto = require("加密"...

回答 1 投票 0

如何在生成数字签名之前规范化SignedInfo节点?

我想生成数字签名,但被告知我需要在生成之前先规范化 SignedInfo 节点。我坚持如何首先规范化节点并且想知道我......

回答 0 投票 0

PHP - 如何获得数字签名 PDF 的签名者?

阅读这个 Stack Overflow 问题(以及其他页面,在下面引用,在评论中)后,我想出了一个 PHP 代码,给定一个数字签名的 PDF 文件,通知谁签署了它: 阅读完这个 Stack Overflow 问题(以及其他页面,在下面引用,在评论中)我想出了一个 PHP 代码,给定一个数字签名的 PDF 文件,通知谁签署了它: <?php function der2pem($der_data) { // https://www.php.net/manual/en/ref.openssl.php $pem = chunk_split(base64_encode($der_data), 64, "\n"); $pem = "-----BEGIN CERTIFICATE-----\n".$pem."-----END CERTIFICATE-----\n"; return $pem; } function extract_pkcs7_signatures($path_to_pdf) { // https://stackoverflow.com/q/46430367 $content = file_get_contents($path_to_pdf); $regexp = '/ByteRange\ \[\s*(\d+) (\d+) (\d+)/'; $result = []; preg_match_all($regexp, $content, $result); $signatures = null; if (isset($result[2]) && isset($result[3]) && isset($result[2][0]) && isset($result[3][0])) { $start = $result[2][0]; $end = $result[3][0]; if ($stream = fopen($path_to_pdf, 'rb')) { $signatures = stream_get_contents($stream, $end - $start - 2, $start + 1); fclose($stream); $signatures = hex2bin($signatures); } } return $signatures; } function who_signed($path_to_pdf) { // https://www.php.net/manual/en/openssl.certparams.php // https://www.php.net/manual/en/function.openssl-pkcs7-read.php // https://www.php.net/manual/en/function.openssl-x509-parse.php $signers = []; $signatures = extract_pkcs7_signatures($path_to_pdf); if (!empty($signatures)) { $pem = der2pem($signatures); $certificates = array(); $result = openssl_pkcs7_read($pem, $certificates); if ($result) { foreach ($certificates as $certificate) { $certificate_data = openssl_x509_parse($certificate); $signers[] = $certificate_data['subject']['CN']; } } } return $signers; } $path_to_pdf = 'test.pdf'; // In case you want to test the extract_pkcs7_signatures() function: /* $signatures = extract_pkcs7_signatures($path_to_pdf); $path_to_pkcs7 = pathinfo($path_to_pdf, PATHINFO_FILENAME) . '.pkcs7'; file_put_contents($path_to_pkcs7, $signatures); echo shell_exec("openssl pkcs7 -inform DER -in $path_to_pkcs7 -print_certs -text"); exit; */ var_dump(who_signed($path_to_pdf)); ?> 这只是命令行 PHP,您无需运行任何以前的 Composer 命令即可运行此脚本。 对于一些test1.pdf,只有一个人签名(我们称她为ALICE),这个脚本返回: array(4) { [0]=> string(23) "CERTIFICATE AUTHORITY 1" [1]=> string(23) "CERTIFICATE AUTHORITY 2" [2]=> string(5) "ALICE" [3]=> string(5) "ALICE" } 对于一些test2.pdf,由两个人签名(让我们称他们为BOB和CAROL),这个脚本返回: array(4) { [0]=> string(23) "CERTIFICATE AUTHORITY 1" [1]=> string(3) "BOB" [2]=> string(23) "CERTIFICATE AUTHORITY 2" [3]=> string(23) "CERTIFICATE AUTHORITY 3" } 此脚本的问题在于,将其输出与 pdfsig 提供的输出进行比较,它们是错误的。 对于相同的test1.pdf,pdfsig返回: Digital Signature Info of: test1.pdf Signature #1: - Signer Certificate Common Name: ALICE ... 对于相同的test2.pdf,pdfsig返回: Digital Signature Info of: test2.pdf Signature #1: - Signer Certificate Common Name: BOB ... Signature #2: - Signer Certificate Common Name: CAROL ... 我做错了什么?我的意思是,我需要做什么才能正确识别签署 PDF 文件的人? 我以前的脚本没有考虑以下内容: 一个 PDF 文件可能有一个或多个签名(PKCS#7 文件),每个签名由一个 ByteRange 数组表示(我发现这是阅读 PDF 规范中的数字签名,@Denis 提出的解决方案 Alimov 只读第一篇ByteRange) 一个 PKCS#7 文件可能包含许多证书,包括证书颁发机构证书和人员证书(我们只对人员证书感兴趣) PKCS#7 文件可能包含重复的证书(如果您知道原因,请告诉我,这正是我在示例 PDF 中找到的) 这是我当前的工作脚本,它返回与 pdfsig: 对齐的输出 <?php function der2pem($der_data) { // https://www.php.net/manual/en/ref.openssl.php $pem = chunk_split(base64_encode($der_data), 64, "\n"); $pem = "-----BEGIN CERTIFICATE-----\n".$pem."-----END CERTIFICATE-----\n"; return $pem; } function extract_pkcs7_signatures($path_to_pdf) { // https://stackoverflow.com/q/46430367 $pdf_contents = file_get_contents($path_to_pdf); $regexp = '/ByteRange\ \[\s*(\d+) (\d+) (\d+)/'; $result = []; preg_match_all($regexp, $pdf_contents, $result); $signatures = []; if (isset($result[0])) { $signature_count = count($result[0]); for ($s = 0; $s < $signature_count; $s++) { $start = $result[2][$s]; $end = $result[3][$s]; $signature = null; if ($stream = fopen($path_to_pdf, 'rb')) { $signature = stream_get_contents($stream, $end - $start - 2, $start + 1); fclose($stream); $signature = hex2bin($signature); $signatures[] = $signature; } } } return $signatures; } function who_signed($path_to_pdf) { // https://www.php.net/manual/en/openssl.certparams.php // https://www.php.net/manual/en/function.openssl-pkcs7-read.php // https://www.php.net/manual/en/function.openssl-x509-parse.php $signers = []; $pkcs7_der_signatures = extract_pkcs7_signatures($path_to_pdf); if (!empty($pkcs7_der_signatures)) { $parsed_certificates = []; foreach ($pkcs7_der_signatures as $pkcs7_der_signature) { $pkcs7_pem_signature = der2pem($pkcs7_der_signature); $pem_certificates = []; $result = openssl_pkcs7_read($pkcs7_pem_signature, $pem_certificates); if ($result) { foreach ($pem_certificates as $pem_certificate) { $parsed_certificate = openssl_x509_parse($pem_certificate); $parsed_certificates[] = $parsed_certificate; } } } // Remove certificate authorities certificates $people_certificates = []; foreach ($parsed_certificates as $certificate_a) { $is_authority = false; foreach ($parsed_certificates as $certificate_b) { if ($certificate_a['subject'] == $certificate_b['issuer']) { // If certificate A is of the issuer of certificate B, then // certificate A belongs to a certificate authority and, // therefore, should be ignored $is_authority = true; break; } } if (!$is_authority) { $people_certificates[] = $certificate_a; } } // Remove duplicate certificates $distinct_certificates = []; foreach ($people_certificates as $certificate_a) { $is_duplicated = false; if (count($distinct_certificates) > 0) { foreach ($distinct_certificates as $certificate_b) { if ( ($certificate_a['subject'] == $certificate_b['subject']) && ($certificate_a['serialNumber'] == $certificate_b['serialNumber']) && ($certificate_a['issuer'] == $certificate_b['issuer']) ) { // If certificate B has the same subject, serial number // and issuer as certificate A, then certificate B is a // duplicate and, therefore, should be ignored $is_duplicated = true; break; } } } if (!$is_duplicated) { $distinct_certificates[] = $certificate_a; } } foreach ($distinct_certificates as $certificate) { $signers[] = $certificate['subject']['CN']; } } return $signers; } $path_to_pdf = 'test.pdf'; // In case you want to test the extract_pkcs7_signatures() function: /* $signatures = extract_pkcs7_signatures($path_to_pdf); for ($s = 0; $s < count($signatures); $s++) { $path_to_pkcs7 = pathinfo($path_to_pdf, PATHINFO_FILENAME) . $s . '.pkcs7'; file_put_contents($path_to_pkcs7, $signatures[$s]); echo shell_exec("openssl pkcs7 -inform DER -in $path_to_pkcs7 -print_certs -text"); } exit; */ var_dump(who_signed($path_to_pdf)); ?>

回答 1 投票 0

将带有私钥的签名哈希的字节数组写入pdf文件的问题

我像这样使用私钥对哈希进行签名 var signature = privateKey.SignHash(hash, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1); 签名后,我想在签名的pdf上显示它...

回答 0 投票 0

如何签署 Winform 应用程序(安全检查)

我们的网络有一个应用程序可以阻止所有应用程序,除非它们被列入白名单。将应用程序列入白名单需要一段时间,因为请求需要很长时间才能被接收,而且每次...

回答 0 投票 0

验证 SAML 响应“封装签名”的问题

任何人都可以建议以下是否是将 SignedInfo 元素传递给某些代码以对 xml 消息进行数字签名的正确格式? 任何人都可以建议以下是否是将 SignedInfo 元素传递给某些代码以对 xml 消息进行数字签名的正确格式? <ds:SignedInfo xmlns:ds="http://www.w3.org/2000/09/xmldsig#"> <ds:CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315#WithComments"></ds:CanonicalizationMethod> <ds:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"></ds:SignatureMethod> <ds:Reference URI="#pfxffef2099-cc79-fd84-e7e8-5bdced364715"> <ds:Transforms> <ds:Transform Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315#WithComments"></ds:Transform> <ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"></ds:Transform> </ds:Transforms> <ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"></ds:DigestMethod> <ds:DigestValue>LC/2Thrnfl3SUqWp8LXfZFyXoZA=</ds:DigestValue> </ds:Reference> </ds:SignedInfo> 下面的 python 代码应该完成这项工作吗? from cryptography.hazmat.primitives.asymmetric import utils from cryptography.hazmat.backends import default_backend from cryptography.hazmat.primitives import serialization from cryptography.hazmat.primitives.asymmetric import padding from cryptography.hazmat.primitives import hashes with open("mysaml_pr_key.pem", "rb") as key_file: private_key = serialization.load_pem_private_key( key_file.read(), password=None, backend=default_backend() ) mypadding_for_signature=padding.PSS( mgf=padding.MGF1(hashes.SHA1()), salt_length=padding.PSS.MAX_LENGTH ) hasher2 = hashes.Hash(hashes.SHA1()) hasher2.update(to_be_signed.encode()) digest_of_signed_info=hasher2.finalize() signature_before_64encode=private_key.sign(digest_of_signed_info,mypadding_for_signature,utils.prehashed(hashes.SHA1())) signature=base64.b64encode(signature_before_64encode) 响应被SP拒绝,原因是“未能验证签名”。 根据 SP 的文档,我确实上传了 IDP 证书和签署它的 CA,它们应该用于签名验证。此外,我确实尝试在第三方工具中验证签名并返回相同的响应(签名验证失败。).. 我预计是以下两个原因之一导致失败: XML 元素的语法或规范化<SignedInfo> 是错误的。根据我的理解,签名是 <SignedInfo> 元素的 SHA1 摘要签名的产生。请注意,<DigestValue> 是 XML 节点的散列,其 ID 在 <reference> 元素中给出。我确认我的哈希值与第三方工具(在线 SAML 工具)生成的哈希值相同 也许我用来对元素进行签名的python代码是错误的。我需要使用 SHA1 然后使用我的私钥签名 W3C XML签名规范中使用的RSA算法是指RFC 3447中描述的RSASSA-PKCS1-v1_5算法。使用的填充方法是 PKCS#1 v1.5。您的 python 代码使用 PSS 填充 终于成功了: 最终的 signedinfo 元素是: <ds:SignedInfo xmlns:ds="http://www.w3.org/2000/09/xmldsig#"> <ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"></ds:CanonicalizationMethod> <ds:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"></ds:SignatureMethod> <ds:Reference URI="#pfxffef2099-cc79-fd84-e7e8-5bdced364715"> <ds:Transforms> <ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"></ds:Transform> <ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"></ds:Transform> </ds:Transforms> <ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"></ds:DigestMethod> <ds:DigestValue>YeKgITtMiXZjSnfQ1I+byM6aOoQ=</ds:DigestValue> </ds:Reference> </ds:SignedInfo> 我认为问题是提到了错误的规范化方法。 唱歌的密码是: with open("mysaml_pr_key.pem", "rb") as key_file: private_key = serialization.load_pem_private_key( key_file.read(), password=None, backend=default_backend() ) signature_before_64encode = private_key.sign(to_be_signed,padding.PKCS1v15(),hashes.SHA1()) signature=base64.b64encode(signature_before_64encode) 其中 to_be_signed 是 singedinfo 字符串的 .encode() 结果。

回答 2 投票 0

Perl 的 XML-Sig 库添加 dsig 元素到 XML 标签

我正在尝试使用 Perl 的 XML::Sig 库对 XML 文档进行签名。我将下面的代码基于其 Meta CPAN 示例页面中提供的示例。使用此代码: 使用 XML::Sig; 我的 xml = ' 我正在尝试使用 Perl 的 XML::Sig 库对 XML 文档进行签名。我将下面的代码基于其 Meta CPAN 示例页面中提供的示例。使用此代码: use XML::Sig; my xml = '<?xml version="1.0"?><foo ID="abc"><bar>123</bar></foo>'; my $pkey = '/path/to/X509/private.key'; my $cert = '/path/to/X509/certificate.pem'; my $signer = XML::Sig->new({ key => $pkey, cert => $cert, x509 => 1, sig_hash => 'sha256', digest_hash => 'sha256' }); my $signedXml = $signer -> sign($xml); print $signedXml; 应该产生这样的东西: <?xml version="1.0"?> <foo ID="abc"> <bar>123</bar> <Signature xmlns="http://www.w3.org/2000/09/xmldsig#"> <SignedInfo xmlns="http://www.w3.org/2000/09/xmldsig#" xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol" xmlns:xenc="http://www.w3.org/2001/04/xmlenc#"> <CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315#WithComments" /> <SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1" /> <Reference URI="#abc"> <Transforms> <Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" /> </Transforms> <DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" /> <DigestValue>9kpmrvv3peVJpNSTRycrV+jeHVY=</DigestValue> </Reference> </SignedInfo> <SignatureValue> HXUBnMgPJf//j4ihaWnaylNwAR5AzDFY83HljFIlLmTqX1w1C72ZTuRObvYve8TNEbVsQlTQkj4R hiY0pgIMQUb75GLYFtc+f0YmBZf5rCWY3NWzo432D3ogAvpEzYXEQPmicWe2QozQhybaz9/wrYki XiXY+57fqCkf7aT8Bb6G+fn7Aj8gnZFLkmKxwCdyGsIZOIZdQ8MWpeQrifxBR0d8W1Zm6ix21WNv ONt575h7VxLKw8BDhNPS0p8CS3hOnSk29stpiDMCHFPxAwrbKVL1kGDLaLZn1q8nNRmH8oFxG15l UmS3JXDZAss8gZhU7g9T4XllCqjrAvzPLOFdeQ== </SignatureValue> <KeyInfo> <KeyValue> <RSAKeyValue> <Modulus> 1b+m37u3Xyawh2ArV8txLei251p03CXbkVuWaJu9C8eHy1pu87bcthi+T5WdlCPKD7KGtkKn9vq i4BJBZcG/Y10e8KWVlXDLg9gibN5hb0Agae3i1cCJTqqnQ0Ka8w1XABtbxTimS1B0aO1zYW6d+U Yl0xIeAOPsGMfWeu1NgLChZQton1/NrJsKwzMaQy1VI8m4gUleit9Z8mbz9bNMshdgYEZ9oC4bH n/SnA4FvQl1fjWyTpzL/aWF/bEzS6Qd8IBk7yhcWRJAGdXTWtwiX4mXb4h/2sdrSNvyOsd/shCf OSMsf0TX+OdlbH079AsxOwoUjlzjuKdCiFPdU6yAJw== </Modulus> <Exponent>Iw==</Exponent> </RSAKeyValue> </KeyValue> </KeyInfo> </Signature> </foo> 但是,我得到了这个奇怪的输出: <?xml version="1.0"?> <foo xmlns:dsig="http://www.w3.org/2000/09/xmldsig#" ID="abc"> <bar>123</bar> <dsig:Signature> <dsig:SignedInfo xmlns:xenc="http://www.w3.org/2001/04/xmlenc#"> <dsig:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/> <dsig:SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"/> <dsig:Reference URI="#abc"> <dsig:Transforms> <dsig:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/> <dsig:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/> </dsig:Transforms> <dsig:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/> <dsig:DigestValue>FHuo2WkVLRpa7bNfiojdVEHxa0nrhC1/uKoRjnkWJ94= </dsig:DigestValue> </dsig:Reference> </dsig:SignedInfo> <dsig:SignatureValue>kgp/+lPtErMFmtYIVJ+vpzzABLYOa0UEz6I7/LjHu/X+45vqpfVNZdLMjDzqShITA38LnNe+KuY/ qmXUplBXFQd26dP9opiAlh9rzS8YQ/yiWXcpQKoM2Ssam9c84ELUDy64Dw5NHXJUaFCVfyuwth/m Fju7J3r42KOvzl3YSAduqEVotDmyVx2WGv3/vr9MAkUfSrlc5PtQP9NU3et2lCVp+4B7wWD7vrDd w4Qnz7NYlc1xcbMtcHGNWHqzoWRInJgJG/wawRp8LRgeyxYFUTV7+U6gzbkCIbgy1CKGmfqkoWgJ vVO2kwwu7cKcZ6peFDdVSKriN/EpZOUn7uC2DA== </dsig:SignatureValue> <dsig:KeyInfo> <dsig:X509Data> <dsig:X509Certificate>MIIIGjCCBgKgAwIBAgIITEy4wqEVR0kwDQYJKoZIhvcNAQELBQAwdDELMAkGA1UE BhMCQlIxEzARBgNVBAoTCklDUC1CcmFzaWwxNjA0BgNVBAsTLVNlY3JldGFyaWEg ZGEgUmVjZWl0YSBGZWRlcmFsIGRvIEJyYXNpbCAtIFJGQjEYMBYGA1UEAxMPQUMg VkFMSUQgUkZCIHY1MB4XDTIyMDgwMzE5MjkwMloXDTIzMDgwMzE5MjkwMlowggEn MQswCQYDVQQGEwJCUjELMAkGA1UECBMCU1AxDzANBgNVBAcTBlNVTUFSRTETMBEG A1UEChMKSUNQLUJyYXNpbDE2MDQGA1UECxMtU2VjcmV0YXJpYSBkYSBSZWNlaXRh IEZlZGVyYWwgZG8gQnJhc2lsIC0gUkZCMRYwFAYDVQQLEw1SRkIgZS1DTlBKIEEx MRYwFAYDVQQLEw1BUiBJTkZPUk1CQU5LMRkwFwYDVQQLExBWaWRlb2NvbmZlcmVu Y2lhMRcwFQYDVQQLEw4xNjY5NjA2MTAwMDE3NTFJMEcGA1UEAxNATUFYSU1VUyBE SVNUUklCVUlET1JBIERFIEVRVUlQQU1FTlRPUyBBVVRPTU9USVZPUzozNDMzMzIz MzAwMDEyODCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKtSXumD8s+I EutiXQuQqSiEXoIUvrsvgtOL4TbVlQTHwO/PXSitGdberioaYiQoC4ZKod48S9iJ 2X8gi+SUsrsvaVpNGEZFAbGHI0RD6NfUbuUZe3Ecq4NxJ7QxJNi34gkRHBrcOemd b8LtOtq6Ny0rujl6wvlNCQPFGGnjHCwzeO/qnGmiGLRedTr/xme2xD8wXwvyy1qR 1sYPzbUKCvAw74usAxN3aOGRwQgiMohsUysD3HcJyjCc5vLMFrgyRJ3aqujUXQj3 kOrfgo+w7fq2YG2RXjH0F7CpcKULXaNqCmmce9A764drrkq36Ty4cAXw3UnKWkw9 ZBk9UEYhItkCAwEAAaOCAvkwggL1MIGcBggrBgEFBQcBAQSBjzCBjDBVBggrBgEF BQcwAoZJaHR0cDovL2ljcC1icmFzaWwudmFsaWRjZXJ0aWZpY2Fkb3JhLmNvbS5i ci9hYy12YWxpZHJmYi9hYy12YWxpZHJmYnY1LnA3YjAzBggrBgEFBQcwAYYnaHR0 cDovL29jc3B2NS52YWxpZGNlcnRpZmljYWRvcmEuY29tLmJyMAkGA1UdEwQCMAAw HwYDVR0jBBgwFoAUU8ul5HVQmUAsvlsVRcm+yzCqicUwcAYDVR0gBGkwZzBlBgZg TAECASUwWzBZBggrBgEFBQcCARZNaHR0cDovL2ljcC1icmFzaWwudmFsaWRjZXJ0 aWZpY2Fkb3JhLmNvbS5ici9hYy12YWxpZHJmYi9kcGMtYWMtdmFsaWRyZmJ2NS5w ZGYwgbYGA1UdHwSBrjCBqzBToFGgT4ZNaHR0cDovL2ljcC1icmFzaWwudmFsaWRj ZXJ0aWZpY2Fkb3JhLmNvbS5ici9hYy12YWxpZHJmYi9sY3ItYWMtdmFsaWRyZmJ2 NS5jcmwwVKBSoFCGTmh0dHA6Ly9pY3AtYnJhc2lsMi52YWxpZGNlcnRpZmljYWRv cmEuY29tLmJyL2FjLXZhbGlkcmZiL2xjci1hYy12YWxpZHJmYnY1LmNybDAOBgNV HQ8BAf8EBAMCBeAwHQYDVR0lBBYwFAYIKwYBBQUHAwIGCCsGAQUFBwMEMIHNBgNV HREEgcUwgcKBIGZyYW5jaXNjby5iYXJjZWxsb3NhZHZAZ21haWwuY29toDgGBWBM AQMEoC8ELTIxMTIxOTY2MDg0NzUxMDY4OTcwMDAwMDAwMDAwMDAwMDAwMDAwMDAw MDAwMKAwBgVgTAEDAqAnBCVGUkFOQ0lTQ08gQ0FSTE9TIERPUyBTQU5UT1MgQkFS Q0VMTE9ToBkGBWBMAQMDoBAEDjM0MzMzMjMzMDAwMTI4oBcGBWBMAQMHoA4EDDAw MDAwMDAwMDAwMDANBgkqhkiG9w0BAQsFAAOCAgEAEGcTeHal+ZqMse5zRXNDVO2T AAEWdOEfF4ssR0H67+R0KFy0RJ6NQa7QwnwHwaymw3TWd+lcRwEmp//6+v0xmBYm 7SiHjgsvVVZdC9WIN51BhskXZJltX+g8uTv1BafZ93YcEJiDJlj0Ng3GSwMOPg80 FXqjtAml5uas8KV2jI5r5Pm3gM2F+tbGFB8ybb4HgQfdvtUexgN/gTT+Mp4y9UsQ znuIu1XBNQHWSaYT1BKLh/cAdrE5hNwdwYkSuvHeiA20ak2m4fmdH8rhMsWHOtua kUh6fpoQCJXjJr5wxMD40boFSQQHdEasSRBPKOXNIbmmRWBVE9RhV+xxIwPDuZY+ E8W3H0mdOtzgXLgj/9y31jMNiQCymZ6MUxUJfwqIecOQsCVunREOPFD/u8fuIX+3 gpbcQudVTtD0duZMO5Uqa2z6hzMXuLR1/og4TnZoKJ4HrFijt5vrNKxIiJKDd9zz qOqFfvPOQ8AaBxmYfYzcn7V4NYSrU7wliGl92vdD1ZUC2HsgNzwAjEbI+Je+yWSM ria3Vr+f3X3qvoiARpZ7AuhpvUpVCdl0Khb7FlqFqfjebUZvvqqu2aREPmdPsagT DIu4BesHL8JIUs8nKEEqApYTHQukxMSq5Ixind9ZY8eaB69PqVO5a0qqfQxvOUwA AoF8N+KW4C8r5OvN6Mw= </dsig:X509Certificate> </dsig:X509Data> </dsig:KeyInfo> </dsig:Signature> </foo> foo 标签被标记为 dsig 元素,之后所有其他元素都引用它。这引起了问题,因为它改变了我期望签署的文档的结构,使其无法通过结构验证。为什么会这样?我怎样才能删除这个dsig? 编辑:更正示例代码中的拼写错误 我维护 XML::Sig。如上 dsig 是 xml 签名所需的名称空间。它可以是 ds: 在某些情况下,但您需要将应用程序中的命名空间设置为您要使用的前缀。 您可以验证创建的文档: xmlsec1 verify --verbose --lax-key-search --id-attr:ID "foo" --pubkey-cert-pem t/rsa.cert.pem --untrusted t/intermediate.pem --trusted-pem t/cacert.pem text.xml Verification status: OK SignedInfo References (ok/all): 1/1 Manifests References (ok/all): 0/0 顺便说一句,您的示例中有一个错字: use XML::Sig; my $xml = '<?xml version="1.0"?><foo ID="abc"><bar>123</bar></foo>'; my $pkey = 't/rsa.private.key'; my $cert = 't/rsa.cert.pem'; my $signer = XML::Sig->new({ key => $pkey, cert => $cert, x509 => 1, sig_hash => 'sha256', digest_hash => 'sha256' }); my $signedXml = $signer -> sign($xml); print $signedXml; 我在 XML::Sig git repo 中引用了私钥和证书: perl -I blib/lib test.pl > text.xml 它改变了我期望签署的文件的结构 它没有。 <foo> <Signature xmlns="http://www.w3.org/2000/09/xmldsig#"> ... </Signature> </foo> 等同于 <foo xmlns:dsig="http://www.w3.org/2000/09/xmldsig#"> <dsig:Signature> ... </dsig:Signature> </foo> 元素不仅通过名称来识别;它们由命名空间和名称的组合来标识。以后我将使用{namespace}name符号。 上面的代码片段创建了一个带有 {}foo 子元素的 {http://www.w3.org/2000/09/xmldsig#}Signature 元素。结构相同。 第一个片段更改默认命名空间以实现此目的。第二个使用前缀。但它们是相同的。

回答 2 投票 0

使用 HSM 符号时参考摘要无效

我必须创建 xml 来生成摘要值 元素 objTimer = doc.createElement("Object"); ---code gen xml标签和数据 objTimer.appendChild(signatureProperties); 和数据 xml 像 thi...

回答 0 投票 0

“走进野外:探索大自然的美丽和保护工作”

我们如何才能保留大自然的美丽,让子孙后代享受? 为子孙后代保留自然之美是一个需要我们立即关注的关键问题......

回答 0 投票 0

在以太坊上验证 mpc 协议(ZenGo)的签名

我在验证 mpc 协议(ZenGo)在以太坊上生成的签名时得到无效签名。他们以 Secp256k1 标量值的形式生成签名,但我不能

回答 0 投票 0

Visual Studio git 版本由 Johannes Schindelin 而非 Microsoft Corporation 进行数字签名

我试图使用 Visual Studio 自带的 Git。客户端有程序可执行文件过滤软件检查可执行文件的数字签名。微软产品在此列入白名单

回答 0 投票 0

如何在 React 中获得多个用户

我想在本地存储中获取一些用户并在登录页面中使用它。 在下面的代码中,我只能在 localstorage 中保存一个用户,通过添加一个新用户,旧用户被删除,...

回答 0 投票 0

在矩形内包裹签名文本

我正在为我的一个用例使用 PDFBox 创建数字签名。但是,根据我的要求,从样本生成的签名的外观有所不同。我想要的签名

回答 0 投票 0

自定义 Pdf 签名外观:IText7

我想自定义PDF中的数字签名外观。我正在使用 IText7 (C#)。以下是我在 C# 中的代码摘录: PdfSignatureAppearance psa = signer.GetSignatureAppearance(); 诗篇

回答 0 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.