- 相关推荐
软件设计中用户身份的认证方法
软件设计中用户身份的认证方法
摘要:介绍几种在计算机软件系统设计中常用的用户身份认证方法,着重阐述了采集用户硬件信息的方法,对程序设计人员设计应用程序有一定借鉴作用。
关键词:计算机软件;身份认证;用户识别;信息采集
用户身份的认证和识别,是设计计算机应用程序所必须考虑的因素,因为软件开发者需要通过识别用户来进行软件注册、升级及授权等服务。
一、几种用户认证方法
目前,获得用户身份的方法主要有以下几种。
1、由用户自己提交个人信息进行认证。一些软件通过使用者自己提交相关信息,这些信息包含用户姓名、E-mail地址等,并以此数据作为软件提供服务的关键信息。这种方法的优点是简单、易实现。但这种方法的弱点也很明显,即不能确保信息的真实性,也不能阻止使用者把获得的信息与他人共享。
即一个使用者获得了注册信息后,可以将注册信息与亲戚朋友共享,那么这些人都能使用此软件了。糟糕的情况是使用者将注册信息发布到网络上,后果更是难以预计。
2、由程序自动采集用户信息进行认证。为了防止软件被非法用户自由使用,开发者可以使用程序来采集使用者计算机的一些相关信息。这些信息是使用者的计算机所特有的、不会轻易改变的,如硬盘序列号、CPU标识号等,开发者可以把这些信息与软件绑定到使用者的机器上执行。
例如Windows XP的注册就是使用了这种方法。这种方法的优点是可以防止软件随意传播,但如果用户硬件更换,可能会使注册信息失效。
3、由特定的硬件提供信息认证用户。使用加密锁、身份认证Token、动态口令生成器等硬件产品来提供信息。利用硬件的不可复制性,把硬件和软件捆绑在一起,利用硬件里面的唯一性的识别信息来识别用户身份。这种方法安全性好,但成本相对较高。
二、用户信息的采集
在实际应用中,使用的认证方法往往不是单一的,而是混合实施。对于个人开发者而言,要设计一个软件系统,为了既提高安全性,又降低成本,主要采用第二种方法。
每台计算机的CPU ID、硬盘序列号、显卡型号、网卡的MAC地址等信息是不同的,把多种信息组合起来后,信息相同的概率就更低了,这些就是开发者需要采集的信息。
1、获取网卡的MAC地址。网卡的MAC地址是网卡的唯一标志,它是固化在网卡串行EEPROM中的物理地址,以太网交换机就是根据信息包头中的MAC源地址和目的地址实现包的交换和传递的。理论上讲,不存在2块网卡的MAC完全相同,这点非常适合用于用户的身份认证。
在Windows操作系统下,在DOS窗口中运行ipconfig/all命令,就可以查看本机的网卡MAC地址,如显示为:Physical Address:00――14――2A――6F――47――1A。
在Windows XP系统下,可以使用系统提供的NetApi32.DLL功能,实现网卡信息的采集。方法为:(1)使用NCBENUM命令获得网卡的数目和每块网卡的内部编号;(2)使用NCBASTAT命令获取每块网卡的MAC地址。下面是部分程序源码,详细信息参见相关资料。
typedef struct _ASTAT_
{
ADAPTER_STATUS adapt;
NAME_BUFFER NameBuff[30];
}ASTAT,*PASTAT;
ASTAT Adapter;
void main()
{
NCB ncb;
UCHAR uRetCode;
LANA_ENUM lenum;
//向网卡发送NCBENUM命令,以获取当前机器的网卡信息,如有多少个网卡、每张网卡的编号等。
memset(&ncb,0,sizeof(ncb));
ncb.ncb_command=NCBENUM;
ncb.ncb_buffer=(unsigned char*)&lenum;
ncb.ncb_length=sizeof(lenum);
uRetCode=Netbios(&ncb);
if(uRetCode!=0)return;
//对每一张网卡,通过其网卡编号,获取其MAC地址
//网卡编号,一般从0开始,但在Windows 2000中并不一定是连续分配的
For(int i=0;i {
//首先对选定的网卡发送一个NCBRESET命令,以便进行初始化
Memset(&ncb,0,sizeof(ncb));
ncb.ncb_command=NCBRESET;
ncb.ncb_lana_num=lenum.lana[i];//指定网卡号
uRetCode=Netbios(&ncb);
//接着,可以发送NCBASTAT命令以获取网卡的信息
Memset(&ncb,0,sizeof(ncb));
ncb.ncb_command=NCBASTAT;
ncb.ncb_lana_num=lenum.lana[i];//指定网卡号
strcpy((char *)ncb.ncb_callname,“*”);
ncb.ncb_buffer=(unsigned char *)&Adapter;//指定返回的信息存放的变量
ncb.ncb_length=sizeof(Adapter);
uRetCode = Netbios(&ncb);
}
}
此时,按F7编译直至通过,按F5运行即可。这段代码可以直接嵌入相关的应用系统之中,或封装成.DLL或COM控件,以便可以在Visual Basic、Visual Foxpro、Power Builder或Delphi等其他程序中调用。
2、获取CPU信息。以前的CPU型号有很多是相同的,但在Pentium III后,Intel公司为了安全交易和资产追踪,为每个处理器增加了一个唯一的序列号,这是我们希望获取的信息。在CPU指令集中,指令cupid被设计用来获取CPU有关的信息,关于这一指令的说明,可以参见相关资料,这里不再详细介绍。下面是用C语言编写的一段功能实现源码,用于识别CPU信息,并显示出来。
{
PROCESSOR_SIGNATURE ps;
FEATURE_FLAGS ff;
MISC_INFO mi;
_asm
{
mov eax,1
cupid
mov ps,eax
mov mi,ebx
mov ff,edx
}
printf(“Processor Type:%d\n”,ps.ProcessorType);
printf(“Model Number:%d\n”,ps.ModelNumber);
printf(“Family Code:%d\n”,ps.FamilyCode);
printf(“Extended Model:%d\n”,ps.ExtendedModel);
printf(“Extended Family:%d\n”,ps.ExtendedFamily);
printf(“Stepping ID:%d\n”,ps.SteppingID);
printf(“Brand ID:%d\n”,mi.BrandID);
if(ff.MMX) printf(“Support MMX\n”);
if(ff.SSE)printf(“Support SSE\n”);
if(ff.SSE2)printf(“Support SSE2\n”);
if(ff.PSN)printf(“Support processor serial number\n”);
}
以上功能可以获取CPU的缓存信息,显示缓存的联合多路工作状态、缓存入口和标准标签的数目等,都可以作为识别CPU的标志,而CPU的序列号(processor serial number)是每个CPU的不变标识。
3、获取硬盘序列号。大多数计算机中都配有硬盘,但由于其有损坏而被更换的可能性,所以其信息的可靠性要低于CPU信息。在网上能够找到很多获得硬盘序列号的程序,但大多数不是我们所需要的。
如果在DOS窗口下输入Dir/p命令,我们就能看到”Volume Serial Number is xxxx-xxxx”这样的信息,很多程序取得的就是这个信息,而这是格式化程序产生并保存在硬盘上的一个信息,即”逻辑硬盘序列号”,不是我们所要的,我们要获得硬盘厂商提供的信息,由于程序比较复杂,限于篇幅,就不再详细介绍了,有兴趣的朋友可以进一步研究。
【软件设计中用户身份的认证方法】相关文章:
最新电话用户真实身份信息登记规定05-27
智能终端中的应用软件设计中的光传感器10-26
科学家们认证的学习方法10-06
浅析电子商务中的身份鉴别技术论文10-08
通信工程研究生认证方法论文10-08
论语中的学习方法10-06
Maven在Eclipse中配置方法10-05
软件设计辞职报告03-16
用户报告模板04-26