gpt4 book ai didi

c# - 验证分离的签名(*.p7s 文件)和 X509Certificate2

转载 作者:太空狗 更新时间:2023-10-29 23:52:09 26 4
gpt4 key购买 nike

我在方法中收到一个 XML 文档作为字符串参数。 XML 文档是:

<Document>
    <ZipContainer> Zip_File_In_Base64 </ZipContainer>
    <X509Certificate> Certificate_In_Base64 </X509Certificate>
</Document>

我从这个字符串中提取了 base64 格式的 ZIP 文件和 base64 格式的 X509Certificate2 证书。 ZIP 文件包含:

  • 将 ZIP 文件的内容描述为 XML 的文件(文件 packageDescription.xml );

  • 包含传输文档内容的文件(例如,*.doc 文件);

  • 具有分离数字签名内容的文件(*.p7s 文件 - 分离数字签名);

应该从存档中提取签署文件的签名(分离的数字签名可能不止一个)。分离的数字签名存储在带有 .p7s 的文件中延期。必须完成每个签名以检查其与数字签名的协议(protocol),用户使用该数字签名登录门户。

必须包含两个步骤:

  1. 参见方法 certificateValidator() (参见下面的方法):这是一个分离签名,包含在 .p7s 中。文件及其相应的已签名文件,这些 *. P7s 文件。
    例如:一对相关文件:ZayavUL_3594c921f545406d9b8734bbe28bf894.doc_1.p7s
    ZayavUL_3594c921f545406d9b8734bbe28bf894.doc .

  2. 参见方法 certificateValidator() : 这验证文件中的证书 .p7s使用从 XML 文档输入字符串中提取的证书。

问题

  1. 方法signatureValidator (请参阅下面的此方法)当前未使用文件的分离签名.p7s .我确实尝试过,但没有成功。如何正确验证 .p7s 的分离签名对应文件的文件?

  2. 在方法中certificateValidator (参见下面的方法)我如何验证从 .p7s 中提取的证书的一致性?文件,带有从 Base64 格式的输入字符串中提取的证书?

  3. 代码行foreach (X509Certificate2 x509 in signCms.Certificates) { } ---> 证书集合始终为空。为什么?

输入参数

  • Dictionary <string, byte[]> dictP7SFiles (key - *.p7s 文件的名称,value - 字节数组,代表 *.p7s 文件)

  • Dictionary <string, byte[]> dictNotP7SFiles (键 - 使用 *.p7s 文件中的分离签名签名的文件的名称,值 - 字节数组,代表文件)

  • X509Certificate2 userCertX509 - 证书对象,从输入的 xml 文档中提取(格式为 Base64)

代码

下面是验证步骤的测试实现(见上面这2个步骤):

private bool certificateValidator(Dictionary<string, byte[]> dictP7SFiles, 
Dictionary<string, byte[]> dictNotP7SFiles, X509Certificate2 userCertX509)
{
bool isValid = false;
try
{
foreach (KeyValuePair<string, byte[]> pair in dictP7SFiles)
{
ContentInfo contentInfo = new ContentInfo(pair.Value);
SignedCms signCms = new SignedCms(contentInfo, true);

if (signCms.Certificates.Count != 0)
{
//Certificates Collection always is empty. Why?
foreach (X509Certificate2 x509 in signCms.Certificates)
{
if ((x509.SerialNumber != userCertX509.SerialNumber)
|| (x509.Thumbprint != userCertX509.Thumbprint))
{
isValid = false;
return isValid;
}
}

isValid = true;
return isValid;
}
}
}
catch (Exception ex)
{
//here process exception code
}

return isValid;
}



private bool signatureValidator(Dictionary<string, byte[]> dictP7SFiles,
Dictionary<string, byte[]> dictNotP7SFiles, X509Certificate2 userCertX509)
{
bool isValid = false;
try
{
byte[] data = dictP7SFiles["ZayavUL_3594c921f545406d9b8734bbe28bf894.doc"];
byte[] publicKey;
byte[] signature;
object hasher = SHA1.Create(); // Our chosen hashing algorithm.
// Generate a new key pair, then sign the data with it:
using (var publicPrivate = new RSACryptoServiceProvider())
{
signature = publicPrivate.SignData(data, hasher);
publicKey = publicPrivate.ExportCspBlob(false); // get public key
}
// Create a fresh RSA using just the public key, then test the signature.
using (var publicOnly = new RSACryptoServiceProvider())
{
publicOnly.ImportCspBlob(publicKey);

isValid = publicOnly.VerifyData(data, hasher, signature); // Return True

//isValid = ByteArrayCompare(dictP7SStreams["ZayavUL_3594c921f545406d9b8734bbe28bf894.doc_1.p7s"], signature);

byte[] p7sDetachedSignature = File.ReadAllBytes(@"D:\ZayavUL_3594c921f545406d9b8734bbe28bf894.doc_1.p7s");
isValid = ByteArrayCompare(p7sDetachedSignature, signature);
}
}
catch (Exception)
{
//here process exception code
}

return isValid;
}

最佳答案

您做错的主要事情是重新生成 CMS 和签名。您应该解析 CMS 消息,然后在验证期间指明外部内容。

  1. How do I properly verify the detached signature of .p7s file for its corresponding file?

看看 following Java code on SO查看如何验证签名; C# 应该使用相同的体系结构,因此它应该以类似的方式工作。

  1. In the method certificateValidator (see this method below) how do I verify the conformity of the certificate extracted from the .p7s file, with a certificate extracted from input string in Base64 format?

对base 64证书进行解码,对证书进行链式验证和验证。您想要执行多少验证(例如检查生效日期)由您决定。

  1. The line of code foreach (X509Certificate2 x509 in signCms.Certificates) { } ---> Certificates Collection always is empty. Why?

在构建新的 CMS 结构时,您根本没有放入一个。


您当然也不应该重新生成签名。通常您在验证期间不会有私钥,并且算法可能与 CMS 文档中使用的算法不匹配。此外,即使可以,签名生成也不总是确定性的(您可能会得到不同的签名值)。

关于c# - 验证分离的签名(*.p7s 文件)和 X509Certificate2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12240355/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com