比较两个程序集的公钥是否确保它们使用相同的私钥进行签名?

时间:2012-01-26 20:21:01

标签: .net signed public-key

从我读过的其他问题和文章中,听起来好像已签名的程序集已被篡改,它的哈希值会有所不同而且不会运行。如果这是真的,那么我可以得出结论,如果一个未知的assemlbly的公钥与已知程序集的公钥匹配,并且.net允许未知的程序集运行,那么unkown程序集使用相同的密钥文件签名并且它没有被篡改与?

顺便说一下,我读了this article,但它询问签名的MSI,听起来这可能与签名的.net程序集不同。

编辑:这是我的示例代码

static void Main(string[] args)
    {
        string unknownAppPath = args[0];
        byte[] unknownKeyBytes = Assembly.LoadFile(unknownAppPath).GetName().GetPublicKey();
        string unknownKeyStr = BitConverter.ToString(unknownKeyBytes);
        Assembly asm = Assembly.GetExecutingAssembly();
        AssemblyName aname = asm.GetName();
        byte[] pubKey = aname.GetPublicKey();
        string hexKeyStr = BitConverter.ToString(pubKey);
        if (hexKeyStr == unknownKeyStr)
        {
            Console.WriteLine("Signed by same private key");
        }
        else
        {
            Console.WriteLine("Uknown signer!");
        }
        Console.ReadKey(); 
    }

此外,我读了this article,它使用了更为复杂的方法。我在文章中看到他谈到使用公钥令牌的缺点,但我不明白为什么不使用整个公钥。从目前为止的答案来看,这听起来像是公钥的用途......那篇文章中你必须尝试运行程序集的问题是什么? (他说,“......但如果不检查装配是否通过验证,你就无法发现这一点。”)

3 个答案:

答案 0 :(得分:3)

是;这就是公钥的工作方式。

您还需要确保程序集不在验证跳过列表中;在VS命令提示符下运行sn-Vl

答案 1 :(得分:1)

简化后,公钥可用于解密使用私钥加密的数据。如果数据可以使用不同的私钥加密,那么整个系统将被破坏。这是公钥加密的基本主张之一。

答案 2 :(得分:0)

我不确定这是否能回答你的问题,但我在这里:你可以在你的参考文献中明确指定PublicKeyToken,如果程序集的话,Fusion(.net程序集加载程序)将不会加载程序集PublicKeyToken不匹配。

我认为其他答案特定于公钥加密,我对你的问题的理解是你在询问Fusion如何处理PublicKeyToken而不是公钥(程序集未加密)。