Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 自动更新下载最新的.exe文件-如何验证它没有被篡改?_C#_Code Signing - Fatal编程技术网

C# 自动更新下载最新的.exe文件-如何验证它没有被篡改?

C# 自动更新下载最新的.exe文件-如何验证它没有被篡改?,c#,code-signing,C#,Code Signing,我们有一个小于200kb的小型控制台应用程序,将分发给客户端,我们希望确保它们运行的是经过WCF服务验证的最新版本。目前,它通过HTTPS下载新的.exe文件,并用它替换当前的.exe文件 假设我们的服务器没有被破坏,这就可以了。但是,我们也使用代码签名证书对.exe文件进行签名。有没有办法验证这一点并在不匹配时删除该文件?我们需要能够验证和删除文件,而不必执行它,以防它是病毒 如何验证已签名的.exe文件?例如,如果无效,Windows将显示: 编辑:这段代码能完成任务吗 X509Certi

我们有一个小于200kb的小型控制台应用程序,将分发给客户端,我们希望确保它们运行的是经过WCF服务验证的最新版本。目前,它通过HTTPS下载新的.exe文件,并用它替换当前的.exe文件

假设我们的服务器没有被破坏,这就可以了。但是,我们也使用代码签名证书对.exe文件进行签名。有没有办法验证这一点并在不匹配时删除该文件?我们需要能够验证和删除文件,而不必执行它,以防它是病毒

如何验证已签名的.exe文件?例如,如果无效,Windows将显示:

编辑:这段代码能完成任务吗

X509Certificate basicSigner = X509Certificate.CreateFromSignedFile(file);
X509Certificate2 cert = new X509Certificate2(basicSigner);
if (cert.Subject.Contains("CN=MY COMPANY NAME IN CERTIFICATE"))
    valid = true;
编辑:如果我们还检查strongNameSignatureReferenceEx,如果文件中有一位发生更改,则返回失败。也许这就足够了

[DllImport("mscoree.dll", CharSet = CharSet.Unicode)]
        static extern bool StrongNameSignatureVerificationEx(string wszFilePath, bool fForceVerification, ref bool pfWasVerified); 
编辑:我也实现了这段代码,它在WinTrust.dll中调用WinVerifyTrust来实际验证Authenticode签名:

现在,它检查数字签名是否包含正确的主题、是否来自有效的受信任根、签名是否有效以及代码是否使用其数字签名进行强命名。现在一定足够安全了吧?

这是一个很好的演练,包含了实现所需功能的可用选项的源代码

基本上,您需要pinvoke,因为没有托管API来完成您需要的工作

另一个选项可能是。

是一个很好的演练,包括实现所需功能的可用选项的源代码

基本上,您需要pinvoke,因为没有托管API来完成您需要的工作


另一种选择可能是这样做。

这是一种从根本上讲是错误的做法。代码签名证书唯一能证明的是签署EXE的个人或公司的身份。证书颁发机构仅仅证明身份是有效的。你根本没有证明它是你的证书,你只是证明它是某人的证书。攻击者可以轻松地将您的EXE替换为另一个由他签名的EXE

你可能会反对,但我不能确认它是我的吗!。答案是否定的,如果攻击者可以替换EXE,那么他在替换您的检查代码时也不会有问题。在同一台机器上执行验证是零安全的


代码证书只有一个用途,它们向用户证明签名者的身份。让他们做任何其他事情都是一个安全漏洞。真正糟糕的那种,让你觉得你的系统是安全的那种。并使您停止考虑实现真正的安全性。

这是一种非常根本错误的方法。代码签名证书唯一能证明的是签署EXE的个人或公司的身份。证书颁发机构仅仅证明身份是有效的。你根本没有证明它是你的证书,你只是证明它是某人的证书。攻击者可以轻松地将您的EXE替换为另一个由他签名的EXE

你可能会反对,但我不能确认它是我的吗!。答案是否定的,如果攻击者可以替换EXE,那么他在替换您的检查代码时也不会有问题。在同一台机器上执行验证是零安全的


代码证书只有一个用途,它们向用户证明签名者的身份。让他们做任何其他事情都是一个安全漏洞。真正糟糕的那种,让你觉得你的系统是安全的那种。并让您停止考虑实施真正的安全性。

谢谢,我来看看。我已经把这个问题编辑成了一些代码。我想这只是检查证书的公共值-这足够吗?@IgorK这取决于您想要实现什么。。。您的代码基本上检查使用的证书,但不检查签名本身…如果我们检查strongNameSignatureReferenceEx,似乎会拒绝修改的文件。我试过那个例子,但说实话,它让我不知所措@我知道你想处理什么样的风险场景?有人在更改服务器上的exe吗?有病毒改变了客户端文件吗?有人改变了服务器上的exe谢谢,我来看看。我已经把这个问题编辑成了一些代码。我想这只是检查证书的公共值-这足够吗?@IgorK这取决于您想要实现什么。。。您的代码基本上检查使用的证书,但不检查签名本身…如果我们检查strongNameSignatureReferenceEx,似乎会拒绝修改的文件。我试过那个例子,但说实话,它让我不知所措@我知道你想处理什么样的风险场景?有人在更改服务器上的exe吗?有病毒改变了客户端文件?有人改变了吗
服务器上的exe如果我们的公司名称是CA授予的有效数字签名,我将证明这是我的证书。攻击者无法替换检查代码。。。我们的应用程序已经在客户端,正在从我们的服务器下载新版本,我们希望确保该版本未被篡改。虽然我同意您的说法,但authenticode旨在解决两个问题:真实性和完整性。@Hans Passant:op说攻击者无法替换检查代码。在这种情况下,这也是根本错误的做法吗?为什么,这怎么会被攻击?如果我们的公司名称是CA授予的有效数字签名,我证明这是我的证书。攻击者无法替换检查代码。。。我们的应用程序已经在客户端,正在从我们的服务器下载新版本,我们希望确保该版本未被篡改。虽然我同意您的说法,但authenticode旨在解决两个问题:真实性和完整性。@Hans Passant:op说攻击者无法替换检查代码。在这种情况下,这也是根本错误的做法吗?为什么,这怎么会被攻击?