c# 获取机器唯一识别码的示例

 更新时间:2021年03月11日 09:28:01   作者:leestar54  
这篇文章主要介绍了c# 获取机器唯一识别码的示例,帮助大家更好的理解和学习使用c#,感兴趣的朋友可以了解下

前言

在客户端认证的过程中,我们总要获取客户机的唯一识别信息,曾经以为MAC地址是不会变的,但是现在各种改,特别是使用无线上网卡,MAC地址插一次变一次,所以这样使用MAC就没有什么意义了,怎么办,又开始求助Google,最后找到一个折中的方案

原理

通过获取主板、处理器、BIOS、mac、显卡、硬盘等的ID生成唯一识别码

建议

1、使用那些不经常更换的模块来生成识别码。

2、如果经常更换MAC,显卡,硬盘,则不要使用这些ID。

3、确保使用static变量在整个应用来保存唯一识别码。

实现

注意引用System.Management

using System;
using System.Management;
using System.Security.Cryptography;
using System.Security;
using System.Collections;
using System.Text;
namespace Security
{
 /// <summary>
 /// Generates a 16 byte Unique Identification code of a computer
 /// Example: 4876-8DB5-EE85-69D3-FE52-8CF7-395D-2EA9
 /// </summary>
 public class FingerPrint 
 {
 private static string fingerPrint = string.Empty;
 public static string Value()
 {
  if (string.IsNullOrEmpty(fingerPrint))
  {
  fingerPrint = GetHash("CPU >> " + cpuId() + "\nBIOS >> " + 
  biosId() + "\nBASE >> " + baseId()
    //+"\nDISK >> "+ diskId() + "\nVIDEO >> " + 
  videoId() +"\nMAC >> "+ macId()
     );
  }
  return fingerPrint;
 }
 private static string GetHash(string s)
 {
  MD5 sec = new MD5CryptoServiceProvider();
  ASCIIEncoding enc = new ASCIIEncoding();
  byte[] bt = enc.GetBytes(s);
  return GetHexString(sec.ComputeHash(bt));
 }
 private static string GetHexString(byte[] bt)
 {
  string s = string.Empty;
  for (int i = 0; i < bt.Length; i++)
  {
  byte b = bt[i];
  int n, n1, n2;
  n = (int)b;
  n1 = n & 15;
  n2 = (n >> 4) & 15;
  if (n2 > 9)
   s += ((char)(n2 - 10 + (int)'A')).ToString();
  else
   s += n2.ToString();
  if (n1 > 9)
   s += ((char)(n1 - 10 + (int)'A')).ToString();
  else
   s += n1.ToString();
  if ((i + 1) != bt.Length && (i + 1) % 2 == 0) s += "-";
  }
  return s;
 }
 #region Original Device ID Getting Code
 //Return a hardware identifier
 private static string identifier
 (string wmiClass, string wmiProperty, string wmiMustBeTrue)
 {
  string result = "";
  System.Management.ManagementClass mc = 
 new System.Management.ManagementClass(wmiClass);
  System.Management.ManagementObjectCollection moc = mc.GetInstances();
  foreach (System.Management.ManagementObject mo in moc)
  {
  if (mo[wmiMustBeTrue].ToString() == "True")
  {
   //Only get the first one
   if (result == "")
   {
   try
   {
    result = mo[wmiProperty].ToString();
    break;
   }
   catch
   {
   }
   }
  }
  }
  return result;
 }
 //Return a hardware identifier
 private static string identifier(string wmiClass, string wmiProperty)
 {
  string result = "";
  System.Management.ManagementClass mc = 
 new System.Management.ManagementClass(wmiClass);
  System.Management.ManagementObjectCollection moc = mc.GetInstances();
  foreach (System.Management.ManagementObject mo in moc)
  {
  //Only get the first one
  if (result == "")
  {
   try
   {
   result = mo[wmiProperty].ToString();
   break;
   }
   catch
   {
   }
  }
  }
  return result;
 }
 private static string cpuId()
 {
  //Uses first CPU identifier available in order of preference
  //Don't get all identifiers, as it is very time consuming
  string retVal = identifier("Win32_Processor", "UniqueId");
  if (retVal == "") //If no UniqueID, use ProcessorID
  {
  retVal = identifier("Win32_Processor", "ProcessorId");
  if (retVal == "") //If no ProcessorId, use Name
  {
   retVal = identifier("Win32_Processor", "Name");
   if (retVal == "") //If no Name, use Manufacturer
   {
   retVal = identifier("Win32_Processor", "Manufacturer");
   }
   //Add clock speed for extra security
   retVal += identifier("Win32_Processor", "MaxClockSpeed");
  }
  }
  return retVal;
 }
 //BIOS Identifier
 private static string biosId()
 {
  return identifier("Win32_BIOS", "Manufacturer")
  + identifier("Win32_BIOS", "SMBIOSBIOSVersion")
  + identifier("Win32_BIOS", "IdentificationCode")
  + identifier("Win32_BIOS", "SerialNumber")
  + identifier("Win32_BIOS", "ReleaseDate")
  + identifier("Win32_BIOS", "Version");
 }
 //Main physical hard drive ID
 private static string diskId()
 {
  return identifier("Win32_DiskDrive", "Model")
  + identifier("Win32_DiskDrive", "Manufacturer")
  + identifier("Win32_DiskDrive", "Signature")
  + identifier("Win32_DiskDrive", "TotalHeads");
 }
 //Motherboard ID
 private static string baseId()
 {
  return identifier("Win32_BaseBoard", "Model")
  + identifier("Win32_BaseBoard", "Manufacturer")
  + identifier("Win32_BaseBoard", "Name")
  + identifier("Win32_BaseBoard", "SerialNumber");
 }
 //Primary video controller ID
 private static string videoId()
 {
  return identifier("Win32_VideoController", "DriverVersion")
  + identifier("Win32_VideoController", "Name");
 }
 //First enabled network card ID
 private static string macId()
 {
  return identifier("Win32_NetworkAdapterConfiguration", 
  "MACAddress", "IPEnabled");
 }
 #endregion
 }
}

补充

现在遇到一些平板等简陋的机型,竟然获取到的所有设备标识都一样(除了mac),最后只好在本地再生成一个软件自身的标识,然后每次在计算标识的时候附带上,这样不会再重复了吧。

代码如下:

private static string localkey()
 {
  string path=Environment.CurrentDirectory + "client.key";
  if (File.Exists(path))
  {
  StreamReader sr = new StreamReader(path);
  string key= sr.ReadLine();
  sr.Close();
  return key;
  }
  else
  {
  StreamWriter sw = File.CreateText(path);
  string key = Guid.NewGuid().ToString();
  sw.WriteLine(key);
  sw.Close();
  return key;
  }
 }

可以再把该文件设为隐藏等手段,防止用户误操作。

补充2

文件容易被误删,还可以写入注册表,除非系统重装,但是需要以管理员权限运行

class RegistryHelper
 {
 const string _uriDeviecId = "SOFTWARE\\YourCompany\\YouApp";
 public static string GetDeviceId()
 {
  string ret = string.Empty;
  using (var obj = Registry.LocalMachine.OpenSubKey(_uriDeviecId, false))
  {
  if (obj != null)
  {
   var value = obj.GetValue("DeviceId");
   if (value != null)
   ret = Convert.ToString(value);
  }
  }
  return ret;
 }

 public static void SetDeviceId()
 {
  using (MD5 md5Hash = MD5.Create())
  {
  byte[] data = md5Hash.ComputeHash(Encoding.UTF8.GetBytes(DateTime.Now.ToString()));
  StringBuilder sBuilder = new StringBuilder();
  for (int i = 0; i < data.Length; i++)
  {
   sBuilder.Append(data[i].ToString("x2"));
  }

  string id = sBuilder.ToString();
  using (var tempk = Registry.LocalMachine.CreateSubKey(_uriDeviecId))
  {
   tempk.SetValue("DeviceId", id);
  }
  }
 }
 }

以上就是c# 获取机器唯一识别码的示例的详细内容,更多关于c# 获取机器识别码的资料请关注脚本之家其它相关文章!

相关文章

  • C#如何提取经纬度文件中的经纬度数据

    C#如何提取经纬度文件中的经纬度数据

    近期开发时需要获取当前的经纬度坐标,下面这篇文章主要给大家介绍了关于C#如何提取经纬度文件中经纬度数据的相关资料,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2022-08-08
  • C#灰度化图像的实例代码

    C#灰度化图像的实例代码

    灰度化一幅图像就是将图像的色彩信息全部丢掉,将24位的位图信息,用8位来表示,灰度图共有256级灰度等级,也就是将24位位图的一点如(255,255,255)转换成255,所以R,G,B三个值所乘的系数和为1
    2013-09-09
  • C#区分中英文按照指定长度截取字符串的方法

    C#区分中英文按照指定长度截取字符串的方法

    这篇文章主要介绍了C#区分中英文按照指定长度截取字符串的方法,涉及C#操作字符串的正则匹配与截取等常用操作技巧,非常具有实用价值,需要的朋友可以参考下
    2015-03-03
  • Unity UGUI的PointerEventData的介绍及使用

    Unity UGUI的PointerEventData的介绍及使用

    这篇文章主要为大家介绍了Unity UGUI的PointerEventData的介绍及使用,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-07-07
  • C#简单获取全屏中鼠标焦点位置坐标的方法示例

    C#简单获取全屏中鼠标焦点位置坐标的方法示例

    这篇文章主要介绍了C#简单获取全屏中鼠标焦点位置坐标的方法,涉及C#针对鼠标位置Position属性的简单操作技巧,需要的朋友可以参考下
    2017-07-07
  • C#如何自动选择出系统中最合适的IP地址

    C#如何自动选择出系统中最合适的IP地址

    这篇文章介绍了C#如何自动选择出系统中最合适的IP地址,非常具有实用价值,需要的朋友可以参考下
    2015-08-08
  • C#实现多种图片格式转换的示例详解

    C#实现多种图片格式转换的示例详解

    这篇文章主要为大家详细介绍了C#如何实现多种图片格式转换,例如转换成图标图像ICO,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-01-01
  • C#中缓存的基本使用方法

    C#中缓存的基本使用方法

    项目开发过程中缓存的应用到处可见,下面这篇文章主要给大家介绍了关于C#中缓存的基本使用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-09-09
  • C#绘制实时曲线的方法

    C#绘制实时曲线的方法

    这篇文章主要为大家详细介绍了C#绘制实时曲线的方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02
  • 利用Aspose.Word控件实现Word文档的操作

    利用Aspose.Word控件实现Word文档的操作

    偶然一次机会,一个项目的报表功能指定需要导出为Word文档,因此寻找了很多篇文章,不过多数介绍的比较简单一点,于是也参考了官方的帮助介绍,终于满足了客户的需求。下面我由浅入深来介绍这个控件在实际业务中的使用过程吧
    2013-05-05

最新评论