我的编程空间,编程开发者的网络收藏夹
学习永远不晚

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

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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# 获取机器识别码的资料请关注编程网其它相关文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

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

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

获取Android系统唯一识别码的方法

本文实例讲述了获取Android系统唯一识别码的方法。分享给大家供大家参考。具体如下: 在计算机上,我们习惯用MAC地址来标志一台计算机。在Android设备上,可以用IMIE或者Android ID来标志一个设备。 看一下Android上
2022-06-06

android手机获取唯一标识的方法

获取手机唯一标识 拼接的方式获取手机唯一标识第一种方式是获取IMEI,但是有的手机如果不是正品的话,就获取不到所以通过这一种方式还是会出现有的设备是没有唯一标识的 第二种方式获取手机卡的序列号,当然这种也不是唯一的,因为有的手机是双卡双待的
2023-05-31

android获取手机唯一标识的方法

代码如下:import android.provider.Settings.Secure; private String android_id = Secure.getString(getContext().getContentResolv
2022-06-06

在Android中获取手机的唯一标识码的方法

在Android中获取手机的唯一标识码的方法 在Android平台上,无论是手机还是平板,获取设备唯一标识码的方式是通用的。以下是一些常见的方式: 1. IMEI(International Mobile Equipment Identit
在Android中获取手机的唯一标识码的方法
2023-12-23

C#实现获取机器码的示例详解

这篇文章主要为大家详细介绍了如何利用C#实现获取机器码的功能,文中的示例代码讲解详细,对我们学习C#有一定的帮助,感兴趣的小伙伴可以跟随小编一起了解一下
2022-12-30

C/C++实现获取系统时间的示例代码

C标准库提供了time()函数与localtime()函数可以获取到当前系统的日历时间。本文将通过一些简单的示例为大家讲讲C++获取系统时间的具体方法,需要的可以参考一下
2022-12-20

$.get获取一个文件的内容示例代码

使用$.get可以获取一个文件的内容,实现很简单,示例如下,喜欢的朋友可以参考下
2022-11-15

PHP和JavaScrip分别获取关联数组的键值示例代码

关联数组的键值获取,有很多方法,在本文为大家介绍下PHP和JavaScrip中时如何实现的,感兴趣的朋友可以参考下
2022-11-15

python获取淘宝服务器时间的代码示例

获取淘宝服务器时间的几种方法:使用官方API:直接请求淘宝API获取服务器时间戳。使用第三方库:使用如taobao-sdk等第三方库获取时间。其他方法:使用urllib.request模块或datetime模块获取服务器时间。注意:请定期更新服务器时间,保证准确性。第三方库的使用需谨慎,taobao-sdk不建议用于生产环境。
python获取淘宝服务器时间的代码示例
2024-04-13

android如何获取手机联系人的数据库示例代码

很多人在做手机联系人的apk时会遇到,如何获取手机联系人数据库的问题,在这里我就简单的将代码写一下package com.example.song.lx_day14_contacts; import android.content.Con
2022-06-06

Mybatis-Plus中getOne方法获取最新一条数据的示例代码

这篇文章主要介绍了Mybatis-Plus中getOne方法获取最新一条数据,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
2023-05-19

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录