此C#代码是否足以唯一标识计算机?

时间:2019-03-26 16:30:29

标签: c#

我正在执行许可证系统。每次我为每台计算机工作时。我创建了一个代码段。您认为这足以让我获得独特的身份吗?是否可以返回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);
    }

我尝试了几台计算机,结果是肯定的,但是我认为您不能在数百台计算机上进行尝试。

2 个答案:

答案 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-repetitiveNon-guessable许可证。
唯一的弱点是暴露您的静态密码,因此您需要锁定源或其他方法来保护它。