从我读过的其他问题和文章中,听起来好像已签名的程序集已被篡改,它的哈希值会有所不同而且不会运行。如果这是真的,那么我可以得出结论,如果一个未知的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,它使用了更为复杂的方法。我在文章中看到他谈到使用公钥令牌的缺点,但我不明白为什么不使用整个公钥。从目前为止的答案来看,这听起来像是公钥的用途......那篇文章中你必须尝试运行程序集的问题是什么? (他说,“......但如果不检查装配是否通过验证,你就无法发现这一点。”)
答案 0 :(得分:3)
是;这就是公钥的工作方式。
您还需要确保程序集不在验证跳过列表中;在VS命令提示符下运行sn-Vl
。
答案 1 :(得分:1)
简化后,公钥可用于解密使用私钥加密的数据。如果数据可以使用不同的私钥加密,那么整个系统将被破坏。这是公钥加密的基本主张之一。
答案 2 :(得分:0)
我不确定这是否能回答你的问题,但我在这里:你可以在你的参考文献中明确指定PublicKeyToken
,如果程序集的话,Fusion(.net程序集加载程序)将不会加载程序集PublicKeyToken
不匹配。
我认为其他答案特定于公钥加密,我对你的问题的理解是你在询问Fusion如何处理PublicKeyToken
而不是公钥(程序集未加密)。