我需要将安全信息传递给我的应用程序中的可执行文件。换句话说,我有这行:
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
使用文件观察器类来检测文件何时被修改。如果我的程序没有运行,我将无法检测到这一点
确保用户无法看到传递给该可执行文件的命令行参数:查看传递给程序的命令行参数