在c#中验证非常大的文件的外部签名

时间:2014-05-23 06:49:16

标签: c# digital-signature

我有一个需要签名的大文件才能存档。这是一个CSV文件,每月生成一次,大小为> 2Gb(不要问我这有什么用:))。 无论如何..文件的签名不是问题,有一个lib,我生成哈希,我得到我的签名。 我现在想做的是验证签名。 教程要我做这样的事情:

byte[] sig = ReadFile(signatureFile);
SignedCms cms = new SignedCms(new ContentInfo(ReadFile(dataFile)), true);
cms.Decode(sig);
cms.CheckSignature(false);

这实际上有效......但是你可以想象,我不想将2 GB文件的全部内容加载到内存中。

关于ContentInfo类的msdn文章告诉我,我可以选择内容的oid,我希望我的contentInfo初始化。 散列数据的oid为“1.2.840.113549.1.7.5” 所以我在这里:

byte[] sig = ReadFile(signatureFile);
SignedCms cms = new SignedCms(new ContentInfo(new byte[]{}), true);
cms.Decode(sig);
SignerInfo inf = cms.SignerInfos[0];
string algorithm = inf.DigestAlgorithm.FriendlyName;
cms = new SignedCms(new ContentInfo(new Oid("1.2.840.113549.1.7.5"), GetHash(algorithm, dataFile)), true);
cms.Decode(sig);
cms.CheckSignature(false);

现在CheckSignature抛出一个异常,说哈希是不正确的。

以下内容可行:

byte[] sig = ReadFile(signatureFile);
SignedCms cms = new SignedCms(new ContentInfo(new byte[]{}), true);
cms.Decode(sig)
byte[] compareableHash = GetHash(algorithm, dataFile);
foreach (var t in inf.SignedAttributes)
{
    if (t.Oid.Value == "1.2.840.113549.1.9.4")
    {         
        Pkcs9MessageDigest digest = (Pkcs9MessageDigest)t.Values[0];
        if (CompareableHash(compareableHash, digest.MessageDigest)) // this compares the hashes bytewise
        {
            Console.WriteLine("hash is correct!");
        }
    }
}

我能相信这种方法100%可靠还是有更好的方法?

0 个答案:

没有答案