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

时间:2015-10-20 18:58:22

标签: c# .net authentication authorization

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

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

我的想法:

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

2 个答案:

答案 0 :(得分:0)

如果使用ActiveDirectory,则可以添加对System.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;
    }
}

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

答案 1 :(得分:0)

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

比预期容易。对于每个支持的操作系统,都有足够的教程可以使用https设置apache。自签名证书的有效期为9999天 - 应该可以使用到2042年.C#-part也很合理:

  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;
      }
  }