<Document>
<ZipContainer> Zip_File_In_Base64 </ZipContainer>
<X509Certificate> Certificate_In_Base64 </X509Certificate>
</Document>
>
文件,将ZIP文件的内容描述为XML(文件packagedescription.XML
);
包含传输文档内容的文件(例如,*.doc
文件);
具有分离数字签名内容的文件(*.p7s
文件-分离数字签名);
>
方法SignatureValidator
(请参阅下面的此方法)当前未使用文件.p7s
的分离签名。我确实试过了,但没有成功。如何正确验证.p7s
文件对应文件的分离签名?
在方法CertificateValidator
(请参阅下面的方法)中,如何验证从.p7s
文件中提取的证书与从Base64格式的输入字符串中提取的证书的一致性?
代码行foreach(X509Certificate2 x509 in SignCMS.Certificates){}
-->Certificates集合始终为空。为什么?
>
dictionary
(key-文件的名称*.p7s,value-字节数组,表示*.p7s文件)
dictionary
(键-使用与*.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消息,然后在验证期间指明外部内容。
看看下面SO上的Java代码,看看如何验证签名;C#应该使用相同的体系结构,因此它应该以类似的方式工作。
是否可以验证带有p7s分离签名的文件?我正试图使用Openssl实现这一点,但我得到了一条关于Openssl的默认消息和 这是我的命令: 是否可以使用openssl进行文件验证和p7s签名? --编辑。。。 只是想让你知道。我有一个p7s文件和一个pdf文件。我想知道如何验证这一点。
我试图用OpenSSL验证一个PE文件的证书/签名(或者实际上用Python,但是看起来Python在证书处理方面很糟糕)。 我已从PE文件中提取了DER PKCS7证书,如下所述:http://blog.didierstevens.com/2008/01/11/the-case-of-the-missing-digital-signatures-tab/ 我已经创建了一个没有校验和和签名数据的P
我正在编写一个接收PKCS7数据(从签名的PDF文档中提取)的服务,并需要对其进行验证。 我使用iText7 PdfPKCS7进行验证,但签名验证总是失败。我可以从PKCS7读取所有其他信息(证书、时间戳等,我也用OpenSSL验证了这一点)。只有签名显示为无效。 下面是测试案例: 输出总是: 我想我在进口方面做错了什么,但就是找不到什么... 顺便说一句,验证其他pdf工具(Adobe DC、P
我想使用BouncyCastle解析和验证OpenPGP分离签名。签名如下所示: 下面是我如何尝试在Kotlin中创建CMSSignedData: 我应该如何使用BouncyCastle验证这种签名?
介绍 Hutool针对java.security.Signature做了简化包装,包装类为:Sign,用于生成签名和签名验证。 对于签名算法,Hutool封装了JDK的Signature,具体介绍见:https://docs.oracle.com/javase/7/docs/technotes/guides/security/StandardNames.html: // The RSA signa
问题内容: 我正在尝试以编程方式验证jar文件是否未被明显篡改。我有2个要防止的用例。1)修改现有类2)在罐子中添加新类 我使用jarsigner签名了罐子。当我用jarsigner验证以上两种情况之一时,它的工作方式就与我期望的一样。 当我尝试使用如何以编程方式验证用jarsigner签名的jar 或如何通过自签名的jar验证签名中的示例以编程方式进行操作时 ?但是,我没有任何SecurityE