C#获取设备的mac码、uuid作为唯一识别码

有些时候做的某些工具不想被传播,就想加个密,绑定电脑授权使用,这就需要找到电脑的唯一识别码

找了很多都没找到电脑真正的唯一识别码,MAC经验证是会变的,最终选择使用uuid

/// <summary>
        /// 获取UUID
        /// </summary>
        /// <returns></returns>
        public static string GetUuid()
        {
            string uuid = null;
            try
            {
                SelectQuery query = new SelectQuery("select * from Win32_ComputerSystemProduct");
                using (ManagementObjectSearcher searcher = new ManagementObjectSearcher(query))
                {
                    foreach (var item in searcher.Get())
                    {
                        using (item) uuid = item["UUID"].ToString();
                    }
                }
                //有些厂商的配件不支持UUId会显示为一堆F
                if (uuid == null || uuid == "FFFFFFFF-FFFF-FFFF-FFFF-FFFFFFFFFFFF")
                {
                    uuid = GetMacAddress();
                }
                return uuid;
            }
            catch (Exception)
            {
                return "unknown";
            }
        }

  在上边有一行代码

uuid = GetMacAddress();

是因为有些设备确实获取不到uuid,那就用mac码替代,虽然可变但总比没有强,对于非常需要安全性的应用还是不建议这么做,下边是获取mac码的代码
/// <summary>  
        /// 获取本机MAC地址  
        /// </summary>  
        /// <returns>本机MAC地址</returns>  
        public static string GetMacAddress()
        {
            try
            {
                string strMac = string.Empty;
                ManagementClass mc = new ManagementClass("Win32_NetworkAdapterConfiguration");
                ManagementObjectCollection moc = mc.GetInstances();
                foreach (ManagementObject mo in moc)
                {
                    if ((bool)mo["IPEnabled"] == true)
                    {
                        strMac = mo["MacAddress"].ToString();
                    }
                }
                moc = null;
                mc = null;
                return strMac;
            }
            catch
            {
                return "unknown";
            }
        }

  为了避免两种识别码长度不一致,也为了防止用户看出这是什么(神秘感),我们对它进行MD5加密,这样结果就是固定位数了,我一般用以下这种方法

 public static string GenerateMD5(string txt)
        {
            using (MD5 mi = MD5.Create())
            {
                byte[] buffer = Encoding.Default.GetBytes(txt);
                //开始加密
                byte[] newBuffer = mi.ComputeHash(buffer);
                StringBuilder sb = new StringBuilder();
                for (int i = 0; i < newBuffer.Length; i++)
                {
                    sb.Append(newBuffer[i].ToString("x2"));
                }
                return sb.ToString();
            }
        }

  这样结果就固定长度啦,也几乎解密不出来,用的时候再次获取识别码并验证就好了,对于没有服务器需要本地授权的小伙伴,就把这些东西加密,再写入到加密文件中就好了,写入到加密文件的方法见我上一篇文档

 地址在这里,是转载的别人的。

C#创建及读取DAT文件操作

posted @ 2023-08-22 08:58  给自己个晚安  阅读(1432)  评论(0编辑  收藏  举报