< 返回
Internet上销售软件的用户身份认证

internet日益普及,电子货币逐渐流行,在网上销售软件产品,给软件开发商和销售商带来了新的利润空间,这也为软件盗版者提供了方便之门。利用计算机指纹信息实现用户身份认证就是一种可以保护软件、防止盗版、成本低廉的有效方法。

一、用户身份认证方法简介

用户身份认证的目的是证实用户的真正身份,防止入侵者伪装,是一种主动安全防御策略。用户身份认证通常所采用的技术是密码技术,因为密码技术可以保证信息的机密性、认证性、完整性、不可抵赖性等。

密码技术是以研究数据保密为目的,对存储或者传输的信息采取秘密的交换以防止第三者对信息的窃取的技术。密码技术通常分为软加密法和硬加密法。其中,硬加密法就是将加密信息固化在硬件上,如软件狗,软件在每次启动时,先检测硬件上的相应信息,如果通过检测,则启动软件,否则不能正常启动软件。硬加密法的特点是成本高,但安全性高,适用于开发费用较高,而且难以依靠扩大发行量来获取利润的大型专用软件。而软加密法就是用软件方法而不依靠特殊硬件来实现对用户信息的加密,软加密的最大优势在于极低的加密成本。大部分价格低廉的通用软件采用的是软加密法,如常用的序列号法。序列号是软件开发者根据用户提交的信息(如用户名),通过某一种加密算法生成的一组数据,用此序列号可以完成用户合法身份认证和应用软件的安装。序列号的弱点是:如果知道一个序列号就可以不受限制地在任意一台计算机上安装使用此软件,从而难以防止正版用户将软件分发给他人使用,甚至给盗版者留下了可乘之机。

二、基于计算机指纹信息的用户身份认证

计算机指纹信息是一种计算机本身所固有的,能唯一标识一台计算机的标志信息。例如,计算机的cpu id是全球唯一的,计算机硬盘的序列号是全球惟一的,计算机网卡的物理地址是全球惟一的。

利用计算机指纹信息进行用户身份认证的方法综合了软加密法和硬加密法二者的优点,即成本较低,安全性教高;其特点是软件用计算机指纹信息进行用户身份认证,而计算机指纹信息确保了软件只能合法地安装在唯一的一台相应的计算机上,这是利用了计算机指纹信息与计算机一一对应的特征,从而防止了正版用户将软件分发给他人使用,也防止了盗版软件的产生。

1.获取计算机指纹信息

计算机指纹信息的获得方法有多种。例如,硬盘序列号的计算机指纹信息的获取方法就有:⑴用vb获取法;⑵用power build获取法;⑶用vc++获取法等。为了表述方便,下面列出了读取硬盘序列号的c程序代码:

//读取硬盘序列号的c语言程序,结果保存在数组diskdata中

void getharddiskdata(unsigned int diskdata[])

{unsigned int temp[];

unsigned int dd—off;while (inp (0x1f7) ! = 0x50) ;/*如果硬盘控制器忙,则等待*/outp (0x1f6, 0xa0); /*读取驱动器信息*/outp (0x1f7, 0xec);while (inp (0x1f7) ! = 0x58); /*等待成功读取数据*/for (dd—off = 0; dd—off ! = 256; dd—off ++)temp [dd—off] = inpw (0x1f0);int loop, loop1;for (loop = 10, loop1 = 0; loop <= 19; loop ++)/*temp[10-19]中的数据就是硬盘序列号*/diskdata [loop1 ++] = temp [loop];return;}

用户将获取的硬盘序列号这个计算机指纹信息发送给软件商,从而完成获取计算机指纹信息的第一步工作。例如,在笔者的计算机上,c盘的序列号是009f-be96,将其转换成十制就是10469014。

2.对计算机指纹信息进行加密

对计算机指纹信息进行加密就必须采用一种加密模型。密码技术的加密模型通常有两种:一种是对称密钥加密模型,即加密和解密采用的是同一密钥,传统加密方法常采用此加密模型,对称密钥加密模型的常用算法有des,idea等。另一种是非对称密钥加密模型,即加密和解密采用的是不同密钥,现代加密方法常采用此加密模型,非对称密钥加密模型的常用算法有rsa,dss等。在这里采用rsa公钥算法。

基于数论中大数分解问题的rsa公钥算法曾被iso/tc97的数据加密技术委员会sc20推荐为公开密钥数据加密标准,是一种比较安全的加密算法。下面以c盘的十进制序列号10469014为例,选取简单公钥e和私钥d,说明使用rsa公钥算法进行计算机指纹信息加密的过程。

(1)选择两个密钥,即公钥e和私钥d

选择公钥e和私钥d应满足下列条件:

select p, qp and q both prime,p != q

calculate n n = pq

calculate f(n)f(n)=(p–1)(q–1)

select integer e gcd(f(n),e)=1;e∈(1,f(n))

calculate dd=e-1 mod f(n)等价于de=1 mod f(n)

例如,选择素数p=5,q=11,则n=pq=5×11=55,f(n)=(p-1)(q-1)=(5-1)(11-1)=40;选择e=3,则满足:gcd(f(n),e)=gcd(40,3)=1,且e=3∈(1,40);而27×3=1 mod(40),则d=27;所以公钥e=3,私钥d=27,两个素数乘积的值n=55。

(2)用公钥e=3,对计算机指纹信息10469014进行加密

加密的明文数据m与获得密文数据c应满足下列条件:

明文数据m:m<n(n是两个素数p,q的乘积)

密文数据c:c=me(mod n)

例如,先将计算机指纹信息10469014分成数据组:m1=10,m2=46,m3=9,m4=0,m5=14(且满足m1、m2、m3、m4、m5<55);再将明文m1、m2、m3、m4、m5分别加密,得到的相应密文分别是:c1、c2、c3、c4、c5(且满足c1=m13mod 55,c2=m23mod 55,c3=m33mod 55,c4=m43mod 55,c5=m53mod 55)。因此,可以计算出个分组密文分别是:c1=m13mod 55=103mod 55=10,c2=m23mod 55=463mod 55=41,c3=m33mod 55=93mod 55=14,c4=m43mod 55=03mod 55=0,c5=m53mod 55=143mod 55=49。最后将c1、c2、c3、c4、c5顺次连起来,就得到密文104114049,这个密文就是计算机指纹信息10469014的密文。

为了表述方便,下面列出了用公钥e=3,对计算机指纹信息10469014进行加密的c程序代码:

//对计算机指纹信息10469014加密的c语言程序,结果保存在c1、c2、c3、c4、c5中

#include

#include

main()

{charm[16]="10469014";

int m1=10,m2=46,m3=9,m4=0,m5=14;

int e=3,n=55;

long c1,c2,c3,c4,c5;

c1=pow(m1,e); c1=c1 % n;

c2=pow(m2,e); c2=c2 % n;

c3=pow(m3,e); c3=c3 % n;

c4=pow(m4,e); c4=c4 % n;

c5=pow(m5,e); c5=c5 % n;

printf(" m=%s c1=%ld c2=%ld ",m,c1,c2);

printf(" c3=%ld c4=%ld c5=%ld ",c3,c4,c5);

}

在实际应用中,为了增大破解难度,使破解成为不可能,通常公钥e值一般都取的比较大,如取64位。这时,加密算法就必须使用模运算性质:

(a*b)mod n=((a mod n)*(b mod n))mod n

来进行化简运算。例如,1417 mod 55=((1410 mod 55)*(147 mod 55))mod 55。

3.向用户提供授权信息

软件商将计算机指纹信息加密后所得到的全部数据或部分数据作为安装序列号,提供给用户。用户在安装软件时,根据安装提示信息,输入安装序列号,软件将其写入注册表中。以后,软件每次启动,先检测获取硬盘序列号,并对其加密,再将加密后的数据与注册表中的相应数据进行比较,如果相同则继续运行,否则,就停止,从而达到了用户身份认证的目的。

(作者单位:陕西省咸阳师范学院计算机科学系)