c# 获取机器唯一识别码的示例
前言
在客户端认证的过程中,我们总要获取客户机的唯一识别信息,曾经以为MAC地址是不会变的,但是现在各种改,特别是使用无线上网卡,MAC地址插一次变一次,所以这样使用MAC就没有什么意义了,怎么办,又开始求助Google,最后找到一个折中的方案
原理
通过获取主板、处理器、BIOS、mac、显卡、硬盘等的ID生成唯一识别码
建议
1、使用那些不经常更换的模块来生成识别码。
2、如果经常更换MAC,显卡,硬盘,则不要使用这些ID。
3、确保使用static变量在整个应用来保存唯一识别码。
实现
注意引用System.Management
usingSystem; usingSystem.Management; usingSystem.Security.Cryptography; usingSystem.Security; usingSystem.Collections; usingSystem.Text; namespaceSecurity { //////Generatesa16byteUniqueIdentificationcodeofacomputer ///Example:4876-8DB5-EE85-69D3-FE52-8CF7-395D-2EA9 /// publicclassFingerPrint { privatestaticstringfingerPrint=string.Empty; publicstaticstringValue() { if(string.IsNullOrEmpty(fingerPrint)) { fingerPrint=GetHash("CPU>>"+cpuId()+"\nBIOS>>"+ biosId()+"\nBASE>>"+baseId() //+"\nDISK>>"+diskId()+"\nVIDEO>>"+ videoId()+"\nMAC>>"+macId() ); } returnfingerPrint; } privatestaticstringGetHash(strings) { MD5sec=newMD5CryptoServiceProvider(); ASCIIEncodingenc=newASCIIEncoding(); byte[]bt=enc.GetBytes(s); returnGetHexString(sec.ComputeHash(bt)); } privatestaticstringGetHexString(byte[]bt) { strings=string.Empty; for(inti=0;i>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+="-"; } returns; } #regionOriginalDeviceIDGettingCode //Returnahardwareidentifier privatestaticstringidentifier (stringwmiClass,stringwmiProperty,stringwmiMustBeTrue) { stringresult=""; System.Management.ManagementClassmc= newSystem.Management.ManagementClass(wmiClass); System.Management.ManagementObjectCollectionmoc=mc.GetInstances(); foreach(System.Management.ManagementObjectmoinmoc) { if(mo[wmiMustBeTrue].ToString()=="True") { //Onlygetthefirstone if(result=="") { try { result=mo[wmiProperty].ToString(); break; } catch { } } } } returnresult; } //Returnahardwareidentifier privatestaticstringidentifier(stringwmiClass,stringwmiProperty) { stringresult=""; System.Management.ManagementClassmc= newSystem.Management.ManagementClass(wmiClass); System.Management.ManagementObjectCollectionmoc=mc.GetInstances(); foreach(System.Management.ManagementObjectmoinmoc) { //Onlygetthefirstone if(result=="") { try { result=mo[wmiProperty].ToString(); break; } catch { } } } returnresult; } privatestaticstringcpuId() { //UsesfirstCPUidentifieravailableinorderofpreference //Don'tgetallidentifiers,asitisverytimeconsuming stringretVal=identifier("Win32_Processor","UniqueId"); if(retVal=="")//IfnoUniqueID,useProcessorID { retVal=identifier("Win32_Processor","ProcessorId"); if(retVal=="")//IfnoProcessorId,useName { retVal=identifier("Win32_Processor","Name"); if(retVal=="")//IfnoName,useManufacturer { retVal=identifier("Win32_Processor","Manufacturer"); } //Addclockspeedforextrasecurity retVal+=identifier("Win32_Processor","MaxClockSpeed"); } } returnretVal; } //BIOSIdentifier privatestaticstringbiosId() { returnidentifier("Win32_BIOS","Manufacturer") +identifier("Win32_BIOS","SMBIOSBIOSVersion") +identifier("Win32_BIOS","IdentificationCode") +identifier("Win32_BIOS","SerialNumber") +identifier("Win32_BIOS","ReleaseDate") +identifier("Win32_BIOS","Version"); } //MainphysicalharddriveID privatestaticstringdiskId() { returnidentifier("Win32_DiskDrive","Model") +identifier("Win32_DiskDrive","Manufacturer") +identifier("Win32_DiskDrive","Signature") +identifier("Win32_DiskDrive","TotalHeads"); } //MotherboardID privatestaticstringbaseId() { returnidentifier("Win32_BaseBoard","Model") +identifier("Win32_BaseBoard","Manufacturer") +identifier("Win32_BaseBoard","Name") +identifier("Win32_BaseBoard","SerialNumber"); } //PrimaryvideocontrollerID privatestaticstringvideoId() { returnidentifier("Win32_VideoController","DriverVersion") +identifier("Win32_VideoController","Name"); } //FirstenablednetworkcardID privatestaticstringmacId() { returnidentifier("Win32_NetworkAdapterConfiguration", "MACAddress","IPEnabled"); } #endregion } }
补充
现在遇到一些平板等简陋的机型,竟然获取到的所有设备标识都一样(除了mac),最后只好在本地再生成一个软件自身的标识,然后每次在计算标识的时候附带上,这样不会再重复了吧。
代码如下:
privatestaticstringlocalkey() { stringpath=Environment.CurrentDirectory+"client.key"; if(File.Exists(path)) { StreamReadersr=newStreamReader(path); stringkey=sr.ReadLine(); sr.Close(); returnkey; } else { StreamWritersw=File.CreateText(path); stringkey=Guid.NewGuid().ToString(); sw.WriteLine(key); sw.Close(); returnkey; } }
可以再把该文件设为隐藏等手段,防止用户误操作。
补充2
文件容易被误删,还可以写入注册表,除非系统重装,但是需要以管理员权限运行
classRegistryHelper { conststring_uriDeviecId="SOFTWARE\\YourCompany\\YouApp"; publicstaticstringGetDeviceId() { stringret=string.Empty; using(varobj=Registry.LocalMachine.OpenSubKey(_uriDeviecId,false)) { if(obj!=null) { varvalue=obj.GetValue("DeviceId"); if(value!=null) ret=Convert.ToString(value); } } returnret; } publicstaticvoidSetDeviceId() { using(MD5md5Hash=MD5.Create()) { byte[]data=md5Hash.ComputeHash(Encoding.UTF8.GetBytes(DateTime.Now.ToString())); StringBuildersBuilder=newStringBuilder(); for(inti=0;i以上就是c#获取机器唯一识别码的示例的详细内容,更多关于c#获取机器识别码的资料请关注毛票票其它相关文章!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。