识别特定网络的简单合理的安全方法
Easy and reasonable secure way to identify a specific network
我们希望仅当 运行 在公司网络内部时才启用我们软件的一些隐藏功能。关键要求是:
- 不需要 DotNet 4.5.1 之外的第三方库
- 易于实现(应该不会超过几十行..我不想重新实现一个加密库)
- 应该是合理安全的:
- 至少:难以逆向工程
- 充其量:"impossible" 通过读取源代码来实现收支平衡
- 低维护开销
- Win2012-Server 可用于安装其他软件(首选开源或自己的实现 - 服务器可以被认为是安全的)
我想到的:
- 检查特定 PC 是否可用于已知 MAC 或 IP(当前实施,不是很安全和其他一些缺陷)
- 测试服务是否可用于特定响应(即我将 'Hello' 发送到 MyServer:12345 - 服务器响应 'World')
- 与第二个类似但更复杂的挑战(即向服务器发送 RNG 的种子,验证响应)
- 使用 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;
}
}
我们希望仅当 运行 在公司网络内部时才启用我们软件的一些隐藏功能。关键要求是:
- 不需要 DotNet 4.5.1 之外的第三方库
- 易于实现(应该不会超过几十行..我不想重新实现一个加密库)
- 应该是合理安全的:
- 至少:难以逆向工程
- 充其量:"impossible" 通过读取源代码来实现收支平衡
- 低维护开销
- Win2012-Server 可用于安装其他软件(首选开源或自己的实现 - 服务器可以被认为是安全的)
我想到的:
- 检查特定 PC 是否可用于已知 MAC 或 IP(当前实施,不是很安全和其他一些缺陷)
- 测试服务是否可用于特定响应(即我将 'Hello' 发送到 MyServer:12345 - 服务器响应 'World')
- 与第二个类似但更复杂的挑战(即向服务器发送 RNG 的种子,验证响应)
- 使用 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;
}
}