简单、合理、安全的识别特定网络的方法

本文关键字:网络 方法 识别 安全 简单 合理 | 更新日期: 2023-09-27 18:18:30

我们希望只有在公司网络内部运行时才能启用我们软件的一些隐藏功能。关键要求是:

  • 不需要DotNet 4.5.1之外的第三方库
  • 容易实现(不应该超过几十行…我不想重新实现加密库)
  • 应该是合理安全的:
    • 至少:很难逆向工程
    • 最多:"不可能"通过对源代码的读访问来打破平衡
  • 低维护开销
  • Win2012-Server可用于安装额外的软件(开源或自己实现的首选-服务器可以被认为是安全的)

我的想法:

  1. 检查特定PC是否具有已知的MAC或IP(当前实现,不是真正安全的和其他一些缺陷)
  2. 测试,如果服务在特定响应上可用(例如,我发送'Hello'到MyServer:12345 -服务器响应'World')
  3. 类似于第二个,但更复杂的挑战(即发送RNG的种子到服务器,验证响应)
  4. 使用HTTPS设置apache并验证证书

简单、合理、安全的识别特定网络的方法

如果你使用ActiveDirectory,你可以添加一个对系统的引用。DirectoryServices命名空间和检查

ActiveDirectorySite currentSite = ActiveDirectorySite.GetComputerSite();

,那么你可以从currentSite对象获得一些信息,并根据它进行检查。这就是我如何启用/禁用我正在开发的应用程序的功能。

我也抓取了:

var client = Dns.GetHostEntry(Dns.GetHostName());
foreach (var ip in client.AddressList)
{
    if(ip.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)
    {
        ipAddress = ip;
    }
}

您可以检查以确保客户端与正确的协议连接。

我选择了最后一个选项:在内部网中设置一个web服务器并验证证书。

这比预期的要容易。对于每个受支持的操作系统,都有足够的教程来设置使用https的apache。自签名证书的生命周期为9999天,应该可以使用到2042年。c#部分也相当小:

  private static bool m_isHomeLocation = false;
  public static bool IsHomeLocation
  {
      get
      {
          if (m_isHomeLocation)
              return true;
          try
          {
              HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://yourLicenseServer:yourConfiguredPort");
              request.ServerCertificateValidationCallback += ((s, certificate, chain, sslPolicyErrors) => true);
              HttpWebResponse response = (HttpWebResponse)request.GetResponse();
              response.Close();
              var thumbprint = new X509Certificate2(request.ServicePoint.Certificate).Thumbprint;
              m_isHomeLocation = (thumbprint == "WhateverThumbprintYourCertificateHave");                    
          }
          catch
          {
              // pass - maybe next time
          }
          return m_isHomeLocation;
      }
  }