验证文件未被更改/替换

时间:2012-11-25 01:44:39

标签: c# security hash

我需要将安全信息传递给我的应用程序中的可执行文件。换句话说,我有这条线:

Process.Start("someExecutable.exe","MyUsername, myPassword");

我想阻止人们看到这些参数。 (用户名和密码由用户在运行时指定,因此我不必担心这些参数。)

现在我遇到的问题是:如果有人用自己的程序替换someExecutable.exe,他们将能够看到凭据!

供将来参考我参考someExecutable.exe(程序我发送信条作为参数) A ,我将参考此程序创建的可执行文件 B

我想在这里预防这个问题是我想到的一些解决方案:

  1. 计算 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

  2. 使用文件Watcher类来检测文件何时被修改。如果我的程序没有运行,我将无法检测到这个

  3. 确保用户无法看到传递给该可执行文件的命令行参数:See command line arguments being passed to a program

1 个答案:

答案 0 :(得分:1)

要解决选项#1的问题,对哈希使用非对称加密,这样您的程序(和用户)将只能解密哈希,而不能加密另一个哈希。当然,如果他们可以编辑已编译的C#代码,那么你无法阻止他们改变它而不解密哈希,但这需要更多的时间和专业知识。

要解决问题#2,请在程序中存储可执行文件A的哈希值,并在启动它之前验证可执行文件A是否与哈希值匹配。

至于#3,据我所知,没有办法解决问题。但是,如果您能够修改目标程序,则可以通过加密的网络套接字发送用户名和密码。

另请注意,可以对.NET应用程序进行反向工程,并且如果安全性对您很重要,您应该考虑在可执行文件上运行某种混淆工具。最终它不是要使程序100%防篡改,因为这是不可能的。关于让任何有理由这样做的人都不值得烦恼。