我正在执行许可证系统。每次我为每台计算机工作时。我创建了一个代码段。您认为这足以让我获得独特的身份吗?是否可以返回null?
我访问了某些主题,但是我无法提出清晰的主意
private string CID()
{
ManagementObjectSearcher search = new ManagementObjectSearcher("SELECT SerialNumber FROM Win32_BaseBoard");
ManagementObjectCollection searchs = search.Get();
string serial=""; string cpuid="";
foreach (ManagementObject id in searchs)
{
serial = (string)id["SerialNumber"];
}
search = new ManagementObjectSearcher("Select ProcessorId From Win32_processor");
searchs = search.Get();
foreach (ManagementObject id in searchs)
{
cpuid = (string)id["ProcessorId"];
}
return MD5(serial+cpuid);
}
我尝试了几台计算机,结果是肯定的,但是我认为您不能在数百台计算机上进行尝试。
答案 0 :(得分:1)
.NET确实在后台使用Windows API调用,您无法控制最终环境。这些呼叫可能被打补丁/伪造,没有防弹.net解决方案。
如果您想要一个体面的独特性,请注意,我并不是说完美,我会在主板序列号和处理器ID上添加PC的MAC。这三件事会使绕过它变得更加困难。
除非使用hardware tokens/dongles,否则最终总是可以绕开这些硬件检查,但这取决于您的成本/收益。
答案 1 :(得分:0)
我有很多具有序列号的应用程序。我们需要关心的第一件事是防止破解我们的序列号。黑客就像编码员总是在寻找重复的算法。在您的情况下,您只需使用md5算法和CPU ID来查找每个系统的唯一编号作为序列号。但是,如果黑客知道您的算法,那么他/她可以制作一个工具来返回任何 CPU Id + md5 。
这是我的意见,可帮助您扫清障碍。
首先,您需要在应用程序启动时检查有效性。您可以在加载和每次用户登录事件上进行检查。
这是一个示例
private void checkValidaty()
{
if (!setting.checkLicence(settingInfo.validateCode))
{
if (MessageBox.Show("Do you want to enter new licence?", MessageBoxButtons.YesNo, MessageBoxIcon.Information, MessageBoxDefaultButton.Button2, MessageBoxOptions.RightAlign) == DialogResult.No)
{
Application.Exit();
}
else
{
frmValidateNewLisence frm = new frmValidateNewLisence();
frm.ShowDialog();
this.checkValidaty();
}
}
}
然后您可以在提到的事件上调用checkValidaty()
函数。
现在,我向您展示如何创建唯一序列号的示例。
正如您所做的那样,我们有一种方法来 GetProcessorID
private static string GetProcessorID()
{
string sProcessorID = "";
string sQuery = "SELECT ProcessorId FROM Win32_Processor";
ManagementObjectSearcher oManagementObjectSearcher = new ManagementObjectSearcher(sQuery);
ManagementObjectCollection oCollection = oManagementObjectSearcher.Get();
foreach (ManagementObject oManagementObject in oCollection)
{
sProcessorID = (string)oManagementObject["ProcessorId"];
}
return (sProcessorID);
}
您可以确保任何CPU都有正确的ID。
现在有了密码生成器应用程序,您可以找到一个令人印象深刻的静态秘密密码。我只是使用此站点来创建强密码Secure Password Generator。
在这种情况下,我使用以下示例:y(M6dH%<Wx=)+fr,
。
之后,您需要将这些密码和CPUID发送到generateCode
函数。
private static string generateCode(string GetProcessorID)
{
using (SHA1Managed sha1 = new SHA1Managed())
{
var hash = sha1.ComputeHash(Encoding.UTF8.GetBytes(Id));
var sb = new StringBuilder(hash.Length * 2);
foreach (byte b in hash)
{
// can be "x2" if you want lowercase
sb.Append(b.ToString("X2"));
}
return sb.ToString() + "y(M6dH%<Wx=)+fr," + GetProcessorID;
}
}
此方法生成一个Non-repetitive
和Non-guessable
许可证。
唯一的弱点是暴露您的静态密码,因此您需要锁定源或其他方法来保护它。