起步软件技术论坛-X3

 找回密码
 立即注册
搜索
查看: 1277|回复: 6

[分享]USB KEY 身份认证简介**

[复制链接]
发表于 2007-10-18 15:16:33 | 显示全部楼层 |阅读模式
参考 http://www.softexam.cn/eschool/details.asp?id=10272
=========================
USB KEY 身份认证简介

    目前常见的身份认证方式主要有三种,最常见的是使用用户名加口令的方式,但这也是最原始、最不安全的身份确认方式,非常容易由于外部泄漏等原因或通过口令猜测、线路窃听、重放攻击等手段导致合法用户身份被伪造;第二种是生物特征识别技术(包括指纹、声音、手迹、虹膜等),该技术以人体唯一的生物特征为依据,具有很好的安全性和有效性,但实现的技术复杂,技术不成熟,实施成本昂贵,在应用推广中不具有现实意义;第三种也是现在电子政务和电子商务领域最流行的身份认证方式--基于USB Key的身份认证。

    USB KEY结合了现代密码学技术、智能卡技术和USB技术,是新一代身份认证产品,它具有以下特点:

    1、 双因子认证

    每一个USB Key都具有硬件PIN码保护,PIN码和硬件构成了用户使用USB Key的两个必要因素,即所谓"双因子认证"。用户只有同时取得了USB Key和用户PIN码,才可以登录系统。即使用户的PIN码被泄漏,只要用户持有的USB Key不被盗取,合法用户的身份就不会被仿冒;如果用户的USB Key遗失,拾到者由于不知道用户PIN码,也无法仿冒合法用户的身份。

    2、 带有安全存储空间

    USB Key具有8K-128K的安全数据存储空间,可以存储数字证书、用户密钥等秘密数据,对该存储空间的读写操作必须通过程序实现,用户无法直接读取,其中用户私钥是不可导出的,杜绝了复制用户数字证书或身份信息的可能性。

    3、 硬件实现加密算法

    USB Key 内置CPU或智能卡芯片,可以实现PKI体系中使用的数据摘要、数据加解密和签名的各种算法,加解密运算在USB Key内进行,保证了用户密钥不会出现在计算机内存中,从而杜绝了用户密钥被黑客截取的可能性。支持RSA,DES ,SSF33和3DES算法。

    4、便于携带,安全可靠

    如拇指般大的USB Key非常方便随身携带,并且密钥和证书不可导出,Key的硬件不可复制,更显安全可靠。

    USB Key身份认证系统的应用方式:

    1、基于冲击-响应的双因子认证方式

    当需要在网络上验证用户身份时,先由客户端向服务器发出一个验证请求。服务器接到此请求后生成一个随机数并通过网络传输给客户端(此为冲击)。客户端将收到的随机数通过USB接口提供给ePass,由ePass使用该随机数与存储在ePass中的密钥进行MD5-HMAC运算并得到一个结果作为认证证据传给服务器(此为响应)。与此同时,服务器也使用该随机数与存储在服务器数据库中的该客户密钥进行MD5-HMAC运算,如果服务器的运算结果与客户端传回的响应结果相同,则认为客户端是一个合法用户。

    密钥运算分别在ePass硬件和服务器中运行,不出现在客户端内存中,也不在网络上传输,由于MD5-HMAC算法是一个不可逆的算法,就是说知道密钥和运算用随机数就可以得到运算结果,而知道随机数和运算结果却无法计算出密钥,从而保护了密钥的安全,也就保护了用户身份的安全。

    2、基于数字证书的认证方式

    随着PKI技术日趋成熟,许多应用中开始使用数字证书进行身份认证与数字加密。数字证书是由权威公正的第三方机构即CA中心签发的,以数字证书为核心的加密技术,可以对网络上传输的信息进行加密和解密、数字签名和签名验证,确保网上传递信息的机密性、完整性,以及交易实体身份的真实性,签名信息的不可否认性,从而保障网络应用的安全性。

    PKI即公共密钥体系,即利用一对互相匹配的密钥进行加密、解密。每个用户拥有一个仅为本人所掌握的私有密钥(私钥),用它进行解密和签名;同时拥有一个公开密钥(公钥)用于文件发送者加密和接收者验证签名。当发送一份保密文件时,发送方使用接收方的公钥对数据加密,而接收方则使用自己的私钥解密,这样,信息就可以安全无误地到达目的地了,即使被第三方截获,由于没有相应的私钥,也无法进行解密。

    用户也可以采用自己的私钥对信息进行加密,接收者用发送者的公钥解密,由于私钥仅为用户本人所有,所以就能够确认该信息确实是由该用户发送的,此过程称之为数字签名。

    USB Key作为数字证书的存储介质,可以保证数字证书不被复制,并可以实现所有数字证书的功能。

    USB Key在电力行业的应用

    电力行业是国民经济的基础产业,是关系到国计民生的行业。电力行业的信息化从 60-70年代开始的电厂自动化监控开始,到现在已经有30多年。随着电力行业的不断发展,电力的关键业务不断增长,因此信息化应用也不断增强,网络系统中的应用越来越多。同时,随着Internet技术的发展,建立在Internet架构上的跨地区、全行业系统内部信息网开始逐步建立,网上应用着各种电力业务及办公系统。显而易见,电力信息网络系统的网络安全问题愈来愈显得重要。

    随着电力行业全面的信息化,信息安全也成为了当今不可忽视的课题。为了保证信息安全,决策者在网络建设之初,常常就会不惜重金花在购买防火墙,防病毒软件,等相关的软硬件设施。这一切措施旨在保护电力信息系统的数据安全,所谓安全,就是指有相应权限的人员可以接触和操作相应的数据,任何人无法接触到未被授权给他的数据。然而,信息系统中的数据终归要为人所用,如果有人伪造了相应权限人的身份,那么投入再多的安全防护体系一样形同虚设。因此用户身份认证系统是信息安全体系的第一道关。

    USB KEY在电力企业实现的功能分析:

    1. 企业内网

    ☆  Windows智能卡登陆

    ☆  企业OA

    ☆  文件、硬盘等数据加密

    ☆  邮件加密

    ☆  数字签名

    2. 电力专网

    ☆  SSL VPN(虚拟专用网)

    ☆  电子印章

    ☆  数字证书

    ☆  数据签名

    3. 互联网

    ☆ 网上身份认证

    ☆ 访问安全站点

    ☆ 邮件安全与签名

    身份认证技术能够广泛应用于电力企业的多种应用系统,如电力OA系统、电力营销业务系统、电力客户服务系统、电力银行联网系统、电力网上营业厅系统等。通过使用身份认证技术不仅使得企业的安全认证得到有效保障,而且极大的提升了企业的管理效率。
回复

使用道具 举报

 楼主| 发表于 2007-10-18 15:21:55 | 显示全部楼层
一般USBKEY都提供了相关的函数供调用,一般通过dll函数库,或者ActiveX控件的方式提供
按照《如何在平台上导入第三方控件》,在平台上就可以调用USBKEY做认证了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-10-26 16:58:00 | 显示全部楼层
一般USBKEY为了节省空间,通常函数中会传递指针,根据某个flag参数来确定这个指针是指向一个整数,还是一个字符串或者是一个结构体。
在平台上不支持指针,因此,通常这样的情况,需要在Delphi中包装成多个函数在平台上调用,不能直接把这样的函数在平台上使用。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-10-26 17:01:43 | 显示全部楼层
例如:SafeNet iKey 1000中,UserPin是通过LongInt表示的,而So Pin是通过字符串表示的
iKey_ChangeCode函数中有一个flag参数,修改User Pin,则某个参数传递的是LongInt的指针,如果是SoPin,则传递的是字符串的指针。
这时候就要包装成两个函数
iKey_ChangeUserPin
iKey_ChangeSoPin
在这两个函数的实现部分调用USBKEY驱动提供的iKey_ChangeCode函数,在平台上调用这两个函数来,不能直接调用iKey_ChangeCode函数了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-11-20 12:01:02 | 显示全部楼层
一般,USB Key可以创建目录和文件,创建文件可以设置文件的密级
文件密级有三个:管理员 用户 普通
管理员有密码,用户有密码,普通就是不需要任何密码

通常跟平台绑定登陆时候,可以在USB Key中创建一个文件,保存用户ID,设置这个文件为用户密级,只要访问这个文件,就会提示输入USB Key的用户密码
在登陆平台时候,读取这个文件,如果不存在就不允许进入平台。读取这个文件,就会验证USB Key的用户密码,只有这个Key的合法用户才可以用这个Key登陆了

做登陆时候,一般修改 系统空间\系统运行库\系统初始化 的TINIT.InternalLogon 方法

static function TINIT.InternalLogon(AParam: String): Boolean;
const
  MaxLogonFailCount = 3;
  LogonErrorMsg01 = '登录失败';
  LogonErrorMsg02 = '用户不存在或者密码错误,请注意大小写,密码是区分大小写的。';
  LogonErrorMsg03 = '对不起,您已经 %d 次登录失败,将退出系统。';
var
  I: Integer;
  lAccept: Boolean;
  sUser, sPass, lAccountID, lUserID, lMessage: String;
  lPerson: Org.TPerson;
  lLogonPerson: Org.TPersonMember;
begin
  if not FInternalDisableAutoLogon then
  begin
    if UseAD and LoginUseAD then
    begin
      Result := True;
      Exit;
    end;

    //这个LoginUseUSBKey可以模仿LoginUseAD方法
  if LoginUseUSBKey then
    begin
     Result := True;
    Exit;
    end;


    if AParam <> '' then
    begin
。。。

static function TINIT.LoginUseUSBKey: Boolean;
var
  s: String;
  person: Org.TPerson;
begin
  s := 读取USBKey,获得人员ID;
  if s = '' then
    Exit;

  person := Org.OrgSys.OrgSystem.FindPerson(s);

  if person = nil then
    Exit;

  Result := TSystemCore.Logon(person.ID, person.Password);
end;
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-11-20 13:45:45 | 显示全部楼层
因此,一般USB Key提供的函数很多,但是不需要全部导入平台使用
只要把以下函数导入使用就可以了
1  设备准备相关函数,比如打开设备、关闭设备
2  文件访问相关函数,比如创建文件、写文件、打开文件、读文件
3  密码相关函数,比如修改密码、验证密码、管理员重置密码等
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-1-3 14:00:46 | 显示全部楼层

更安全的方案

增加一个CA服务器颁发证书,把证书文件写到USBKey上
登陆时候,从USBKey中取出证书文件,用私人密钥加密一个字符串,传递给CA服务器,证书服务器解密后得到这是哪个客户,返回这个客户的ID,客户端用这个ID登陆平台
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Justep Inc.

GMT+8, 2024-11-1 07:57 , Processed in 0.041410 second(s), 16 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表