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

Easy and reasonable secure way to identify a specific network

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

我想到的:

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

如果您使用 ActiveDirectory,您可以添加对 System.DirectoryServices 命名空间的引用并检查

ActiveDirectorySite currentSite = ActiveDirectorySite.GetComputerSite();

然后您可以从 currentSite 对象中获取一些信息并进行检查。这就是我 enable/disable 当前正在开发的应用程序的功能。

我也抢:

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

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

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

这比预期的要容易。有足够的教程可以为每个受支持的 OS 使用 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;
      }
  }