您的位置:首页 > 运维架构 > 网站架构

使用iKey 1000进行网站登录

2012-11-27 16:48 211 查看
1. 使用iKey 1000进行网站登录

iKey 1000是全球市场占有率最高的身份认证令牌产品。将iKey 1000与各种应用相结合,将为用户提供安全、可靠、简单、方便的身份认证和登录体验。

传统的身份认证主要是通过“用户名/口令”的验证方式,这种验证方式存在着易于扩散、易被窃取以及难以记忆等缺点。尤其是在公共场所和公用计算机上,使用口令有可能带来非常严重的安全隐患。使用过的口令既有可能被其它人看到,也容易被木马程序窃取。使用iKey 1000替代“用户名/口令”方式的身份认证方案,所需的成本不高,却可以极大地提高用户登录的安全性和方便性。

本文档将为使用iKey 1000进行网站登录提供详细的说明和指导。根据说明,开发商可以利用随文档发布的iKey 1000初始化工具、iKey客户端、网站登录客户端控件以及网站演示例程等配套模块轻松地将iKey 1000与自己的网站相集成。

2. 方案的过程

为了尽量与开发商过去的身份认证方案(用户名/口令方式)兼容、减少引入iKey 1000认证方案的难度,本文档提供的方案同样以用户名和口令为基础,但集成了iKey 1000的安全特性。因此,开发商无需对目前的用户数据库做任何改变,就可以将现在的用户名/口令认证方式平滑转移到基于iKey 1000的挑战/响应认证方式,甚至让这两种方式并存。

整个过程中,开发商唯一需要做的仅仅是按方案提供的网站登录例程修改现有的认证网页。

为了实现兼容的目的,本方案实际上是把某个最终用户的用户名、口令以文件的方式存入了iKey 1000硬件内部的安全存储区中。存入的口令并不以明文的方式存在,而是被转化为HMAC-MD5密钥文件。由于iKey 1000的密钥文件是硬件不可读的,而且硬件本身支持HMAC-MD5认证算法,因此在整个认证过程中用户口令都只会存在于iKey 1000内部。

认证时,网站的认证服务器对iKey 1000硬件进行挑战/响应认证。
3. 方案的组成

在新的认证方式中,开发商需要用到iKey 1000初始化工具、客户端控件、服务端控件以及iKey 1000的客户端安装包。以下进行分别的说明。

a) iKey 1000初始化工具

在方案附带的InitTool目录下,包含了一个VC6的工程源文件。并且在Release子目录下包含一个编译好的InitTool.Exe可执行文件。这个工程可以实现对iKey 1000的初始化。

初始化的过程非常简单,初始化工具将输入的用户名和用户口令以文件的形式写入iKey 1000的存储区内,这两个文件的运行权限都是USER PIN,也就是说,只有通过了PIN码校验的最终用户才可以操作这两个文件。其中,用户名以数据文件的形式存在,可以对其进行读写;用户口令以MD5密钥文件的形式存在,只能使用它对输入数据进行签名。

注:开发商可以在InitTool的基础上进行个性化开发,以更方便地实现批量用户的初始化工作。比如说,已经具有用户数据库的开发商可以将初始化工具与现有的用户数据库联系起来,每次从数据库内读出一个用户的信息,然后自动将它写入iKey 1000中。

由于初始化工具只是一个简单的示例,示例中固定iKey的用户口令是“12345678”,如果口令改变,初始化会失败。另外初始化的用户名和口令,要和用户名/口令数据库中的用户名口令相同,才能够认证成功。

b) iKey 1000客户端控件

iKey 1000的客户端控件是一个经过签名的ActiveX形式的COM控件,它的文件名是iKeyClient.dll,存储在“Sample\Components”目录下。客户端控件与初始化工具相对应,向网页开发者提供了一组可以利用iKey 1000内部的用户名文件和用户口令文件进行身份认证的函数接口。

iKey 1000客户端控件的CLSID为“2669C745-AF54-4B50-B97C-7683123FEBA2”,并能够响应iKey 1000的硬件插拨消息。在网页中,可以这样对它定义:

<OBJECT ID=iKeyClient CLASSID=clsid:2669C745-AF54-4B50-B97C-7683123FEBA2 codebase='Components/ikeyclient.dll#version=1,0,0,6' events='true' width=0 height=0> </OBJECT>

其中,events=’true’表示它会向网页发送事件。

下面对iKey 1000客户端控件的所有的接口函数进行说明:

 HRESULT Open()

说明:打开目前系统中的第一个iKey 1000设备。iKey 1000不支持多个设备共存,在这种情况下,只有第一个找到的设备会被打开。

VB Script调用示例:iKeyClient.Open

JavsScript调用示例:iKeyClient.Open();

注:这里的iKeyClient是网页内定义的iKey 1000客户端控件的名称(ID),开发中应根据实际命名进行改变。下同。

 HRESULT Close()

说明:关闭打开的iKey 1000设备。并不要求必须调用此函数来并闭设备。在iKey 1000客户端控件关闭时,打开的设备会自动关闭。

VB Script调用示例:iKeyClient.Close

JavsScript调用示例:iKeyClient.Close();

 HRESULT VerifyPin([in]BSTR strPin)

说明:校验iKey 1000的用户PIN码。

输入数据:

strPin:用户PIN字符串

VB Script调用示例:iKeyClient.VerifyPin PIN

JavsScript调用示例:iKeyClient.VerifyPin (PIN);

 HRESULT ChangeDirByName([in]BSTR strDirName)

说明:改变iKey 1000文件系统的当前目录。iKey 1000内部存在着一个简单的文件系统,默认地,在iKey 1000刚刚插入计算机时,其当前目录指向根目录。使用本函数可以改变当前目录至所需的目录。使用InitTool初始化的iKey 1000,文件存储在“Web Office”目录下。

输入数据:

strDirName:要改变的目标目录名字符串

VB Script调用示例:iKeyClient.ChangeDirByName NEWDIRNAME

JavsScript调用示例:iKeyClient.ChangeDirByName (NEWDIRNAME);

 HRESULT GetUsername([in]ULONG ulFileID, [out, retval]BSTR * pUsername)

说明:获取iKey 1000硬件内的对应数据文件所存储的用户名字符串。使用InitTool初始化的用户名数据文件的文件ID为2。

注意,如果开发商将用户名文件存储在特殊的目录下,调用这个函数前必须首先调用ChangeDirByName函数改变当前目录至文件存储目录。

输入数据:

ulFileID:存储用户名的数据文件的文件ID

返回数据:

取得的用户名字符串

VB Script调用示例:USERNAME = iKeyClient.GetUsername(2)

JavsScript调用示例:USERNAME = iKeyClient.GetUsername(2);

 HRESULT Authenticate([in]ULONG ulFID1, [in]ULONG ulFID2, [in]BSTR pDigest, [out, retval]BSTR * pResult)

说明:对打开的iKey 1000进行认证,即使用用户口令密钥文件对输入字符串进行签名。要注意的是,用户口令经过转换后将会存储在两个密钥文件中,本函数必须同时输入这两个文件的ID。使用InitTool初始化的用户口令密钥文件的文件ID分别为3和4。

注意,如果开发商将用户口令文件存储在特殊的目录下,调用这个函数前必须首先调用ChangeDirByName函数改变当前目录至文件存储目录。

输入数据:

ulFID1:存储用户口令密钥文件第一部分的文件ID

ulFID2:存储用户口令密钥文件第二部分的文件ID

pDigest:要进行签名的数据字符串。即从服务器端发出的挑战数据

返回数据:

产生的签名结果串

VB Script调用示例:RESULT = iKeyClient.Authenticate(3, 4, CHALLENGE)

JavsScript调用示例:RESULT = iKeyClient.Authenticate(3, 4, CHALLENGE);

 HRESULT CheckToken([out, retval] VARIANT_BOOL * haveToken)

说明:判断当前系统中是否插有iKey 1000硬件。

返回数据:

如果找到硬件,返回true;否则返回false

VB Script调用示例:RESULT = iKeyClient.CheckToken

JavsScript调用示例:RESULT = iKeyClient.CheckToken();

c) iKey 1000客户端检查控件

要在客户的计算机上操作iKey 1000硬件,需要首先安装硬件驱动程序及基础运行库。因此一个网页要使用iKey 1000进行身份认证之前,首先要做的应该是检查客户端是否安装了驱动及基础运行库。进行这个检查工作的是客户端检查控件。

iKey 1000的客户端检查控件同样是一个经过签名的ActiveX形式的COM控件,其文件名是ikChkClient.dll,存储在“Sample\Components”目录下。

客户端检查控件的CLSID为“0C9D30AB-1840-463F-BD45-E4BB5AAD4342”。在网页中,可以这样对它定义:

<OBJECT ID="IkeyCheckClient" CLASSID="CLSID:0C9D30AB-1840-463F-BD45-E4BB5AAD4342" codebase="Components/ikChkClient.dll#version=1,0,0,5" width=0 height=0> </OBJECT>

iKey 1000客户端检查控件只包含一个用于检查客户端是否存在的接口。其说明如下:

 HRESULT CheckClient([out, retval] VARIANT_BOOL * haveClient)

说明:判断当前系统是否安装过iKey 1000硬件驱动及其它基础运行库。

返回数据:

如果发现已经安装,返回true;否则返回false

VB Script调用示例:RESULT = iKeyClient.CheckClient

JavsScript调用示例:RESULT = iKeyClient.CheckClient();

d) iK
c8f6
ey 1000服务端控件

iKey 1000的服务端控件运行在认证服务器上,是一个COM控件,用于完成服务器端的MD5签名运算。其文件名是iKeyMd5.dll,存储在“Sample\Components”目录下。

服务端控件的ProgID是iKeyMd5.crypt,在网页上,可以这样对它进行定义:

set iKeyServer = Server.CreateObject( "iKeyMd5.crypt" )

服务端控件也只有一个函数,下面给出使用VB Script的调用示例:

RESULT = iKeyServer.Md5HMAC(CHALLENGE, PASSWORD, "", "" )

其中,RESULT是签名结果、CHALLENGE是服务端产生的挑战数据、PASSWORD是所认证的最终用户的用户口令。

e) 其它

在“Sample\Components”目录下还有几个其它文件,用于协助完成登录认证。其中IKEYALL.rar文件是一个单独的iKey 1000客户端驱动及基础库安装文件,用于最终客户的下载安装;iKeyClient.cab文件是一个经过签名的安装包,它包含了IKEYALL.rar及iKeyClient.dll,但可以自动下载并安装。

所有上面提到的模块及接口,都可以在登录演示中找到对应的实例及调用方法。

注意:正常情况下iKeyClient.dll可以自动注册,但当某种情况下注册不成功的时候,可以手工注册iKeyClient.dll和ikChkClient.dll,手工注册方法是:

点击Strat->run,输入 regsvr32 “文件路径”,比如:

regsvr32 "E:\product\ ASP sample\Sample \Components\iKeyClient.dll"

regsvr32 "E:\product\ ASP sample\Sample \Components\ikChkClient.dll"

4. 登录演示网页

在Sample目录下,包含了一个完整的使用iKey 1000进行客户端认证登录的网站演示。

要使用这个演示,开发商的计算机上必须安装IIS服务5.0及以上版本,并设置一个新的虚拟目录至Sample目录。演示网站的入口网页是login.asp。

Sample目录下,data目录中存储着一个简单的用户数据库。对于每一个用户,都存储了他的用户名、口令及用户类型信息。演示网页支持3种用户类型:管理员(ID为1)、系统用户(ID为2)以及游客(ID为3)。

此外,在Sample目录的conn子目录下,conn.asp提供了打开用户数据库的命令语句。

在Sample目录的根目录下存放着本演示的主要网页。login.asp用于产生随机数、检查客户端安装情况、输入用户PIN并调用客户端控件的相应接口对挑战数据签名。如果所有的执行都正确,login.asp会把客户端签名结果和用户名传回给服务器端进行处理,处理网页是ChkLogin.asp。ChkLogin.asp首先在用户数据库中检查对应的用户名是否存在,如存在则取出该用户的用户口令,并调用服务端控件对挑战数据进行签名。最后比较两个签名结果。如果结果相同,客户通过认证,ChkLogin.asp将设置Session,并将处理权转向网站的主运行页面main.asp;否则,当客户未能通过认证时,网页转回来login.asp重新认证过程。

login.asp和main.asp都可以监视iKey 1000的插拨过程。对于main.asp,只要发现用户拨出了iKey硬件,就会调用logout.asp,使该用户退出系统。因此,该演示网站具有极高的使用安全性。

更多的网站实现细节,请参看演示网页的源文件。

5. 方案的实施过程

当开发商准备将iKey 1000集成到自己的网站认证中的时候,需要做的工作是非常少的。下面的步骤给出了简单的实施指引:

a) 参照演示网页,修改开发商网站

开发商可以针对自己的实际情况,参照演示,在自己的网站中添加iKey 1000认证支持。这里面涉及到网页的设计、如何集成开发商自己的用户数据库等。但总得来说,需要的工作量并不大。

b) 安装认证网站

开发商可以将修改后的认证网页上传至认证服务器中。关键地,必须注册服务端控件。服务端控件是一个COM控件,可以在服务器上使用“regsvr32 目录名\控件名”命令完成注册。

注意:正常情况下iKeyClient.dll可以自动注册,但当某种情况下注册不成功的时候,可以手工注册iKeyClient.dll和ikChkClient.dll,手工注册方法是:

点击Strat->run,输入 regsvr32 “文件路径”,比如:

regsvr32 "E:\product\ ASP sample\Sample \Components\iKeyClient.dll"

regsvr32 "E:\product\ ASP sample\Sample \Components\ikChkClient.dll"

对于服务端控件,如果和客户端不在同一个机器的话,服务器iKeyMD5.dll需要iKey驱动支持,服务器需要安装iKey驱动。如果服务器不是Windows平台,请使用第三方MD5-HMAC库。

c) 初始化用户iKey 1000

使用InitTool(开发商可以根据需要进行修改),和现有的用户数据库,开发商可以初始化所有用于登录的iKey 1000硬件。并将它们发送给相应的最终用户。

由于初始化工具只是一个简单的示例,示例中固定iKey的用户口令是“12345678”,如果口令改变,初始化会失败。另外初始化的用户名和口令,要和用户名/口令数据库中的用户名口令相同,才能够认证成功。

d) iKey认证运算

本示例中iKey1000和服务器控件中进行的运算是MD5-HMAC运算,当某种情况下,服务器控件注册不上,比如服务器是Linux,那么客户可以使用第三方的MD5-HMAC运算库,比如PHP就带这个MD5-HMAC库。这个时候要注意:

客户端和服务端算法是一样的,但输入参数的格式要注意,挑战数到客户端是经过了编码再输入到iKey中的。比如,挑战数是 “HIJK”,那么编码后的结果是“48494a4b”,可以看到这个是HIJK的ASCII编码的十六进制表示。

如果使用iKeyEdit,产生MD5-HMAC密钥并进行运算,那么输入就是源数据,不是编码后的结果,因此要注意输入,才能够产生一致的结果。

由上可见,本方案的实施过程是非常简单、快捷的。

 

首先,认证网页生成一个挑战数据(随机数)并传给客户端。客户端控件会寻找客户的计算机上是否有iKey 1000硬件,并试图打开用户名文件和用户口令密钥文件。当这些操作都成功后,客户端控件会使用用户口令密钥文件对挑战数据签名,并将签名结果连同用户名一起发还给认证服务器。

当认证服务器收到返回数据,首先会在用户数据库中寻找是否有相同用户名的用户存在,如果存在则取出对应的用户口令,以它为密钥,调用服务端控件的HMAC-MD5签名算法对原始的挑战数据进行签名。

最后,服务器将比较由客户处传回的签名数据与服务器自己产生的签名数据是否相同。如果相同则意味着用户数据库中存储的用户口令与iKey 1000硬件内存储的用户口令完全相同,该用户是合法用户;否则无法通过认证。

可以看到,这种认证方式所用的数据也是用户名、口令,但其实现过程完全不同于传统的认证方式。基于高强度安全硬件的签名算法和挑战/响应的认证方式使得集成iKey 1000的认证过程极为安全、可靠。从理论上来说,只要服务器的安全性得以保障,iKey 1000的认证过程是绝对安全的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  服务器 网站登录