




已阅读5页,还剩24页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
JavaScript通过WMI获取根据盘符获取U盘物理序列号一:达到的效果根据UKeyTool生成的U盘文件xxxx_private.ukey内的md5与U盘物理序列号+ xxxx_uKey+界面读取文件自由串(50*10)计算的md5对比,如果一样,则允许登录,否则不允许登录二:加密工具1 原理 U盘序列号信息格式:vid_0537&pid_a703#192b0c00048a,其中192b0c00048a为U盘的物理序列号(唯一);U盘中的验证文件名为xxxx_private.ukey;将U盘的物理序列号加工后保存在文件xxxx_private.ukey中,使U盘和文件一一对应。2 加密步骤1.把U盘的物理序列号中的所有字母转换成大写,如192B0C00048A,标为串1;2.固定串xxxx_uKey,标为串2;3.随机生成50*10个的可见字符:ASCII范围33-126,标为串3;4.串1、串2、串3顺序合并,计算32位MD5(字母大写);5.创建文件ipbc_private.ukey,写入字符串:File:xxxx_V3 USB Private key;6.换行,写入版本号,格式:Version:7.换行,写入MD5值;8.换行,写入串3,每50个字符换行;三:JavaScript解密1 解密步骤1.把U盘的物理序列号中的所有字母转换成大写,如192B0C00048A,标为串1;2.固定串xxxx_uKey,标为串2;3.打开文件xxxx_private.ukey,读入50*10个可见字符,标为串3;4.串1、串2、串3顺序合并,计算32位MD5(字母大写);5.打开文件xxxx_private.ukey,读取MD5值;6.比较计算的和读取的MD5值是否相同,相同则通过验证,否则失败。2 JavaScript读取U盘物理序列号(推荐方案3)准备1 读取U盘盘符/* * 判断是否有U盘并获取U盘盘符,只适用于IE? * returns string 返回U盘盘符 * constructor */function CheckUsb() var e, x; var ForReading = 1, RorWriting = 2; var bfResult = ; try var fso = new ActiveXObject(Scripting.FileSystemObject); catch(err) return bfResult; e = new Enumerator(fso.Drives); for (; ! e.atEnd(); e.moveNext() x = e.item(); if (x.DriveType = 1) if (x.Path != A:) bfResult += x.Path + ,; return bfResult;方案1:根据WMI的Win32_USBHub读取U盘物理序列号缺陷:无法根据盘符一对一获取U盘物理序列号缺陷说明:此方法获取的intCount,及U盘迭代index跟注册表中的键对应注册表键地址:HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesDiskEnum+(intCount+1)次部分键对应的值的注册表地址为:HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesEnumUSBSTOR+值在此处可以查看U盘的物理序列号,可验证获取的是否正确。点击物理序列号会出现右侧:其键ParentIdPrefix对应的即盘符信息。盘符信息注册表地址:HKEY_LOCAL_MACHINESYSTEMMountedDevices 需要将ParentIdPrefix转换成十六进制,并在此处与值查询,获得的键即盘符信息。参考地址:/s/blog_54762b4b0100kodd.html/p-075309298295.html出错场景:当有多个U盘,第一次可能会通过,比如有G,I,H三个盘,此时根据注册顺序分别为1,2,3;如果在验证过程中将G盘拔出,此时I,H盘的顺序为1,2;再插入G盘进行验证,此时G盘顺序为3;但是准备部分获取的U盘盘符顺序为G,I,H,此时迭代的盘符index或获取到I盘的物理序列号,导致验证失败。读取U盘物理序列号迭代准备部分获取的U盘盘符,并将盘符和迭代index传入此方法,获取物理序列号/* * 根据盘符获取物理序列号 * param drivepath 盘符 * param intCount 轮询获取次数 * returns * 返回盘符与物理序列号字符串,格式:G:XXXXXXXXXXXXXX * constructor */function ReadUsbSnEach(drivepath, intCount) var properties = service.ExecQuery(SELECT * FROM Win32_USBHub); /Win32_USBHub所有属性说明:/en-us/library/aa394506(v=vs.85).aspx#properties var e = new Enumerator(properties); var count = 0; for (; ! e.atEnd(); e.moveNext() var p = e.item(); var sn = p.DeviceID; /1:Generic USB Hub;2:USB Root Hub;3:USB Mass Storage Device USB大容量存储设备 /ConfigManagerErrorCode=0 Device is working properly. /因每个盘的Name不同,这里只判断英文和中文两种,超过的U盘将不被验证通过 if (p.Name = USB Mass Storage Device | p.Name = USB 大容量存储设备) count = count + 1; if (count = intCount + 1) / & p.ConfigManagerErrorCode = 0 if (p.Name = USB Mass Storage Device | p.Name = USB 大容量存储设备) strSN += GetUsbSN(sn); /alert(drivepath + - + count + - + p.Name + - + strSN); return strSN; Win32参考地址:/en-us/library/aa394173(v=vs.85).aspx/en-us/library/aa394592(v=vs.85).aspx/b/powershell/archive/2007/02/24/displaying-usb-devices-using-wmi.aspx物理序列号处理:/* * 分解通过注册表获取的值或其他方式获取同样的值,只取物理序列号即可 * param sn 通过注册表获取的值或其他方式获取的同格式的值 * returns * 物理序列号 * constructor */function GetUsbSNByReg(sn) var UsbSN; var strSN = sn; var arraySN = new Array(); if (strSN.indexOf(&) 0) arraySN = strSN.split(); if (arraySN.length 2) UsbSN = arraySN2.split(&)0; else UsbSN = ; else UsbSN = ; return UsbSN;方案3:根据注册表读取U盘物理序列号缺陷:无法根据盘符一对一获取U盘物理序列号缺陷说明:参考方案1 缺陷对应部分参考地址:参考方案1 缺陷对应部分出错场景:参考方案1 缺陷对应部分读取U盘物理序列号迭代准备部分获取的U盘盘符,并将盘符和迭代index传入此方法,获取物理序列号/* * 通过注册表获取物理序列号 * param drivepath 盘符 * param intCount 盘符index * returns string * constructor */function ReadUsbSnEachByReg(drivepath, intCount) var sn = ; var obj = new ActiveXObject(WScript.Shell); try var s = HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesDiskEnum+(intCount+1); var sNic = obj.RegRead(s);/USBSTORDisk&Ven_Kingston&Prod_DT_101_G2&Rev_5.001401051502351655498409&0 sn = drivepath+GetUsbSNByReg(sNic); catch(e) return sn;物理序列号处理:参考方案1 缺陷对应部分方案2:根据WMI的其他Win32方法读取U盘物理序列号其他Win32方法(Win32_LogicalDisk,Win32_LogicalDiskToPartition,Win32_DiskDriveToDiskPartition,Win32_DiskDrive)读取U盘物理序列号/* * 根据盘符获取物理序列号 * param drivepath 盘符 * param intCount 轮询获取次数 目前无用,保留,注释的Win32_USBHub方式获取有使用到 * returns * 返回盘符与物理序列号字符串,格式:G:XXXXXXXXXXXXXX * constructor */function ReadUsbSnEach(drivepath, intCount) var strSN = drivepath; /存放序列号 var locator = new ActiveXObject(WbemScripting.SWbemLocator); var service = locator.ConnectServer(.); var logical_disk_query = select DeviceId,CreationClassName,SystemName from Win32_LogicalDisk where Caption = + drivepath + ; var logical_disk_property = service.ExecQuery(logical_disk_query); var logical_disk_Enum = new Enumerator(logical_disk_property); for (; ! logical_disk_Enum.atEnd(); logical_disk_Enum.moveNext() var logical_disk_item = logical_disk_Enum.item(); var dependent = / + logical_disk_item.SystemName + /root/cimv2: + logical_disk_item.CreationClassName + .DeviceID= + logical_disk_item.DeviceId + ; var logical_disk_to_part_query = select Antecedent,Dependent from Win32_LogicalDiskToPartition where Dependent= + dependent + ; var logical_disk_to_part_property = service.ExecQuery(logical_disk_to_part_query); var logical_disk_to_part_Enum = new Enumerator(logical_disk_to_part_property); for (; ! logical_disk_to_part_Enum.atEnd(); logical_disk_to_part_Enum.moveNext() var logical_disk_to_part_item = logical_disk_to_part_Enum.item(); var dependent = logical_disk_to_part_item.Antecedent.replace(/g, /); var disk_drive_to_part_query = select Antecedent,Dependent from Win32_DiskDriveToDiskPartition where Dependent= + dependent + ; var disk_drive_to_part_property = service.ExecQuery(disk_drive_to_part_query); var disk_drive_to_part_Enum = new Enumerator(disk_drive_to_part_property); for (; ! disk_drive_to_part_Enum.atEnd(); disk_drive_to_part_Enum.moveNext() var disk_drive_to_part_item = disk_drive_to_part_Enum.item(); var disk_drive_query = select SystemName,CreationClassName,DeviceID,PNPDeviceID from Win32_DiskDrive where interfaceType = USB; var disk_drive_property = service.ExecQuery(disk_drive_query); var disk_drive_Enum = new Enumerator(disk_drive_property); for (; ! disk_drive_Enum.atEnd(); disk_drive_Enum.moveNext() var disk_drive_item = disk_drive_Enum.item(); var dependent = + disk_drive_item.SystemName + rootcimv2: + disk_drive_item.CreationClassName + .DeviceID= + disk_drive_item.DeviceId.replace(/g, ) + ; if (disk_drive_to_part_item.Antecedent = dependent) var sn = GetUsbSNByReg(disk_drive_item.PNPDeviceID); return strSN + sn; return strSN;代码解析:此处使用WMI 资源浏览器.exe显示查看个方法获取的数据下载地址:/soft/down/soft_22980.html步骤1:1 通过盘符在Win32_LogicalDisk中获取三个字段DeviceId,CreationClassName,SystemNameselect DeviceId,CreationClassName,SystemName from Win32_LogicalDisk where Caption = + drivepath + ;2 处理此三个字段为符合Win32_LogicalDiskToPartition格式的串/ + logical_disk_item.SystemName + /root/cimv2: + logical_disk_item.CreationClassName + .DeviceID= + logical_disk_item.DeviceId + ;步骤2:1 将步骤1中处理的串当成步骤2Dependent的值查询两个字段Antecedent,Dependentselect Antecedent,Dependent from Win32_LogicalDiskToPartition where Dependent= + dependent + 2 处理字段Antecedent为Win32_DiskDriveToDiskPartition合适的串logical_disk_to_part_item.Antecedent.replace(/g, /);步骤3:1将步骤2中处理的串当成步骤3 Dependent的值查询两个字段Antecedent,Dependentselect Antecedent,Dependent from Win32_DiskDriveToDiskPartition where Dependent= + dependent + 步骤4:1 查询Win32_DiskDrive出四个字段SystemName,CreationClassName,DeviceID,PNPDeviceIDselect SystemName,CreationClassName,DeviceID,PNPDeviceID from Win32_DiskDrive where interfaceType = USB2 将此四个字段按照步骤3中Antecedent的值的格式拼接 + disk_drive_item.SystemName + rootcimv2: + disk_drive_item.CreationClassName + .DeviceID= + disk_drive_item.DeviceId.replace(/g, ) + 3 如果两个值相同,则取出步骤3中的Antecedent的值进行处理,处理方法见方案1中的物理序列号处理4 处理后的即根据盘符得到的U盘物理序列号3 按照加密工具加密的步骤进行加密4 与加密工具加密读取出的MD5值比较5 验证成功或失败四:完整的JavaScript代码function include(path) var a = document.createElement(script); a.type = text/javascript; a.src = path; var head = document.getElementsByTagName(head)0; head.appendChild(a);/include(./jquery1.3.2.js);document.write();/* * 判断是否有U盘并获取U盘盘符,只适用于IE? * returns string 返回U盘盘符 * constructor */function CheckUsb() var e, x; var ForReading = 1, RorWriting = 2; var bfResult = ; try var fso = new ActiveXObject(Scripting.FileSystemObject); catch(err) return bfResult; e = new Enumerator(fso.Drives); for (; ! e.atEnd(); e.moveNext() x = e.item(); if (x.DriveType = 1) if (x.Path != A:) bfResult += x.Path + ,; return bfResult;/* * 读取U盘内文件ipbc_private.ukey内的MD5值和随机串 FF存在问题 * param pathfile 文件路径 * returns * 返回content_array数组 * 0为md5值 * 1为50*10随机串 */function read(pathfile) var content_array = new Array(); if (typeof window.ActiveXObject != undefined) try var fso = new ActiveXObject(Scripting.FileSystemObject); var reader = fso.openTextFile(pathfile, 1); var i = 0; var content = ; while (!reader.AtEndofStream) if (parseInt(i) parseInt(2) i+; reader.readline(); continue; else if (parseInt(i) = parseInt(2) i+; content_array0 = reader.readline().split(:)1; continue; else if (parseInt(i) parseInt(3) i+; reader.readline(); continue; else content += reader.readline(); i+; content_array1 = content; reader.close(); catch(e) return content_array; return content_array; else if (document.implementation & document.implementation.createDocument) try netscape.security.PrivilegeManager.enablePrivilege(UniversalXPConnect); var lf = C/file/local;1.createInstance(Cerfaces.nsILocalFile); lf.initWithPath(file); if (lf.exists() = false) alert(File does not exist); var fis = C/network/file-input-stream;1.createInstance(Cerfaces.nsIFileInputStream); fis.init(lf, 0x01, 00004, null); var sis = C/scriptableinputstream;1.createInstance(Cerfaces.nsIScriptableInputStream); sis.init(fis); var converter = C/intl/scriptableunicodeconverter.createInstance(Cerfaces.nsIScriptableUnicodeConverter); converter.charset = UTF-8; content = converter.ConvertToUnicode(sis.read(sis.available(); catch(e) alert(Mozilla Firefox read local file error: n + e); return content; function usb_key_alert() document.body.innerHTML = 使用本系统,以下设置需全部满足:n1)插入有效的USB KEY访问本系统(U盘内含有正确的KEY)n2)使用IE内核浏览器(如IE8,360安全浏览器等)n3)将本系统加入浏览器的信任站点,并调整可信站点的区域级别:n “对未标记为可安全执行脚本的ActiveX控件初始化并执行脚本”n 设置为启用;function usb_key_quit() alert(请插入有效的USB KEY!); document.body.innerHTML = ; anchors = document.getElementsByTagName(a); var anchor = anchors0; anc
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025至2030全球及中国汽车冲压件行业产业运行态势及投资规划深度研究报告
- 2025至2030农用器械市场产业运行态势及投资规划深度研究报告
- 2025至2030中国单偏心蝶阀行业发展趋势分析与未来投资战略咨询研究报告
- 2025至2030中国仲钨酸铵行业市场现状分析及竞争格局与投资发展报告
- 2025至2030中国LED街道照明行业发展趋势分析与未来投资战略咨询研究报告
- 2025-2030年防晒霜行业市场现状供需分析及投资评估规划分析研究报告
- 2025-2030年美体内衣行业市场深度调研及竞争格局与投资研究报告
- 高端企业保密参观合作协议范本
- 成都高新技术开发区企业股权转让与人才引进协议
- 贝柔与伴侣双方财产分割及子女抚养权明确离婚协议书
- 国家开放大学电大22270资源与运营管理(统设课)期末终考题库参考答案
- 《口腔固定修复工艺技术》期末考试复习题库(含答案)
- 酒店养生药膳培训课件
- 中职语文高二上学期拓展模块上册期末模拟卷1原卷版
- 《常用法兰垫片特性》课件
- 幼小衔接亲子活动策划方案
- 物业防汛演练培训
- 岭南师范学院《高等数学(二)》2021-2022学年第一学期期末试卷
- 事业单位考试职业能力倾向测验(医疗卫生类E类)试卷与参考答案(2025年)
- 厂区规划设计方案
- 上海市市辖区(2024年-2025年小学四年级语文)部编版期末考试((上下)学期)试卷及答案
评论
0/150
提交评论