我需要将安全信息传递给我的应用程序中的可执行文件。换句话说,我有这条线:
Process.Start("someExecutable.exe","MyUsername, myPassword");
我想阻止人们看到这些参数。 (用户名和密码由用户在运行时指定,因此我不必担心这些参数。)
现在我遇到的问题是:如果有人用自己的程序替换someExecutable.exe,他们将能够看到凭据!
供将来参考我参考someExecutable.exe(程序我发送信条作为参数) A ,我将参考此程序创建的可执行文件 B 的
我想在这里预防这个问题是我想到的一些解决方案:
计算 A 的哈希值并在执行前检查它。
static bool? VerifyThatExeIsReliable(string pathOfExe)
{
if (System.IO.File.Exists(pathOfExe) == false)
return null;
var bytes = System.IO.File.ReadAllBytes(pathOfExe);
using (SHA1Managed a = new SHA1Managed())
{
var hash = a.ComputeHash(bytes);
StringBuilder formatted = new StringBuilder(2 * hash.Length);
foreach (byte b in hash)
formatted.AppendFormat("{0:X2}", b);
var code = formatted.ToString();
if (code == "4835658749AF89A65C5F4835658749AF89A65C5F")
return true;
}
return false;
}
这种方法的问题是哈希4835658749AF89A65C5F4835658749AF89A65C5F
将存储在可执行文件 A 中,如果有人用十六进制编辑器打开这个程序,他将能够找到哈希并修改它。换句话说,他们将计算他们编写的程序的sha1哈希并放置该哈希而不是4835658749AF89A65C5F4835658749AF89A65C5F
使用文件Watcher类来检测文件何时被修改。如果我的程序没有运行,我将无法检测到这个
确保用户无法看到传递给该可执行文件的命令行参数:See command line arguments being passed to a program
答案 0 :(得分:1)
要解决选项#1的问题,对哈希使用非对称加密,这样您的程序(和用户)将只能解密哈希,而不能加密另一个哈希。当然,如果他们可以编辑已编译的C#代码,那么你无法阻止他们改变它而不解密哈希,但这需要更多的时间和专业知识。
要解决问题#2,请在程序中存储可执行文件A的哈希值,并在启动它之前验证可执行文件A是否与哈希值匹配。
至于#3,据我所知,没有办法解决问题。但是,如果您能够修改目标程序,则可以通过加密的网络套接字发送用户名和密码。
另请注意,可以对.NET应用程序进行反向工程,并且如果安全性对您很重要,您应该考虑在可执行文件上运行某种混淆工具。最终它不是要使程序100%防篡改,因为这是不可能的。关于让任何有理由这样做的人都不值得烦恼。