随着Windows操作系统的发展,Windows操作系统开机登录程序也在不断改进。在Windows Vista和Windows 7操作系统中,微软取消了Windows NT/2000中交互式登录支持的GINA(图形标识与身份验证)模型,使用了Windows Credential Provider(票据提供程序)模型接口。相对于GINA,Windows Credential Provider具有高安全性、高灵活性的特点。一些开发商在此技术上开发了一些Windows Credential Provider,如指纹Credential Provider,提高了用户登录系统的安全性。这里介绍一种使用智能卡登录操作系统的实现方式。 
1 设计方案 
实现Windows Credential Provider所使用的智能卡为自主研发的卡片,其API包括检测卡片插拔、PIN码校验、文件存储、密码运算等功能。本文的智能卡已格式化,具有存储设计方案所需的对称密钥、二进制文件等数据。 
Windows Credential Provider默认使用的是用户名和密码进行身份认证。本文以智能卡文件作为载体,加密保存计算机账户的用户名和密码。使用Windows登录必须先通过智能卡PIN码认证后才得到解密用户名和密码的权限。相对于原只用用户名密码登录方式,智能卡登录具有双因素认证的特点,大大提高了Windows操作系统登录过程的安全性。 
2 程序开发 
设计方案将程序按模块分为2部分:一是用户名密码绑定程序;二是Windows Credential Provider COM库。

2.1 绑定用户名密码程序 
  用户名密码绑定程序,完成一些智能卡登录Windows的初始化工作,即输入系统用户名密码并写入到智能卡,实现系统密码和智能卡密码的绑定操作。

  必须绑定用户名密码的智能卡才能使用智能卡登录Windows系统。完成绑定后,用户名和密码都加密保存到智能卡中,并长期有效。在系统不重装的前提下,以下情况可能导致正常的绑定无效:
必须绑定用户名密码的智能卡才能使用智能卡登录Windows系统。完成绑定后,用户名和密码都加密保存到智能卡中,并长期有效。在系统不重装的前提下,以下情况可能导致正常的绑定无效: 
  1)通过用户名密码绑定程序删除绑定。 
  2)用户在绑定后修改了原用户名密码,导致绑定无效。 
  相对地,针对用户修改密码的情况,实现GINA程序相关接口可判断并自动修改绑定关系;而Windows Credential Provider没有相关的接口,因此,安装一个用户名密码绑定程序的辅助服务,该服务轮询检查绑定的用户名和密码是否有效,当绑定关系发送变化时,服务程序调用绑定程序重新更新绑定。 
  一般的,用户名密码绑定程序作为初始化工具,必须通过授权才可使用。因此,在使用用户名密码绑定程序前需通过智能卡的PIN码校验。完成身份认证后,用户名密码绑定程序将用户录入的用户名、密码、域名加以校验。 
  用户名密码绑定程序按功能分为两个部分:第一,当打开用户名密码绑定程序时,弹出输入对话框输入PIN码,进行PIN码校验,完成用户身份认证过程;第二,校验用户身份后,弹出用户登录凭据绑定输入框。为了简单说明设计方案,用户名密码绑定程序有且只能绑定一条Windows登录凭据。Windows登录凭据信息包括用户名、密码和域名(如果已经加入域的话)。用户确定绑定信息时,用户名密码绑定程序将登录凭据信息通过智能卡API加密保存到智能卡文件系统中,其中加密密钥是智能卡初始化时写入的对称密钥。至此,用户名密码绑定程序对智能卡的初始化工作就完成了。
2.2 Windows Credential COM库 
Windows Credential Provider部分是设计方案的核心部分。它包括了自定义用户登录界面的接口以及处理和提交用户登录凭据的接口。设计方案的Windows Credential Provider通过新COM库的方式增量注册到Windows操作系统中,并不卸载Windows操作系统自带的Credential Provider。就是说,用户在登录Windows时可以选择原Windows登录方式或选择智能卡登录。
在Windows Vista的登录过程中,从界面上可区分为两个阶段:标题图片未选中阶段和标题图片被选中后显示密码输入框阶段。 标题图片未选中阶段,主要显示标题图片和登录用户名。智能卡Windows Credential Provider定制了以智能卡为图片的标题图片。 通过Windows Credential Provider可设置定制的智能卡

登录凭据的按钮,用户点击智能卡图片的按钮即可使用智能卡登录计算机。 
  智能卡图片以资源方式插入到DLL中,资源ID为IDB_TILE_IMAGE,在ICredentialProviderCredential接口中的GetBitmapValue函数添加代码: 
  HBITMAP hbmp = LoadBitmap(HINST_THISDLL, MAKEINTRESOURCE(IDB_TILE_IMAGE)); 
  *phbmp = hbmp; 
  默认的Windows Credential Provider标题图片下方为显示登录用户名,智能卡Windows Credential Provider将登录用户名修改了智能卡是否插入提示信息。static const FIELD_STATE_PAIR s_rgMessageFieldStatePairs[] = 
  { 
  { CPFS_DISPLAY_IN_BOTH, CPFIS_NONE }, // SMFI_TILEIMAGE 
  { CPFS_DISPLAY_IN_BOTH, CPFIS_NONE }, // SMFI_MESSAGE 
  { CPFS_DISPLAY_IN_DESELECTED_TILE, CPFIS_NONE },// SMFI_STATUS 
  }; 
  标题图片未选中阶段将原用户名输入的界面枚举信息替换为PIN码输入框,并添加PIN码输入提示文本(如PIN码输入错误等信息)。 PIN码输入框使用原Windows输入框的类型和风格。 
  static const CREDENTIAL_PROVIDER_FIELD_DEscriptOR s_rgCredProvFieldDescriptors[] = 
  { 
  { SFI_TILEIMAGE, CPFT_TILE_IMAGE, L"Image" }, 
  { SFI_USERNAME, CPFT_LARGE_TEXT, L"Username" }, 
  { SFI_STATUS, CPFT_SMALL_TEXT, L"States" }, 
  { SFI_PIN, CPFT_PASSWORD_TEXT, L"Pin" }, 
  { SFI_TIP_TEXT, CPFT_SMALL_TEXT, L"Tip" }, 
  { SFI_SUBMIT_BUTTON, CPFT_SUBMIT_BUTTON, L"Submit" }, 
  }; 
  用户在登录时选中智能卡标题图片时,即可调用智能卡登录对应的Windows Credential Provider接口函数,并调用ICredentialProviderCredential:: SetSelected函数,在SetSelected函数中判断智能卡是否已经插入,若插入则允许切换到输入PIN码框界面。 
  if(CheckKeyIsInsert() == true) 
  {SetConnect(); 
  } 
  用户在PIN码输入框完成PIN码键入后,智能卡Windows Credential Provider调用ICredentialProviderCredential:: GetSerialization函数。在GetSerialization函数中调用智能卡API校验SFI_PIN对应控件的PIN码是否正确,若检验失败,设置SFI_TIP_TEXT对应的提示文字为PIN码校验结果提示信息。若校验成功,则读取和解密文件系统中加密保存的用户登录信息,并返回到GetSerialization函数的输出参数中。返回的用户登录信息将被Windows登录应用程序验证,若结果匹配则结束登录界面现在Windows桌面,否则提示错误信息。 
  完成Windows Credential Provider后,需将Windows Credential Provider库拷贝到系统盘System32目录,并通过注册表注册到Windows系统。 
  [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Authentication\Credential Providers\{ed756d7f-139d-403f-aea8-82e97a83d184}] 
  @="SMARTCARD_CredentialProvider" 
  [HKEY_CLASSES_ROOT\CLSID\{ad7a7d7f-139d-403f-aea8-82e97a83d184}] 
  @=" SMARTCARD _CredentialProvider" 
  [HKEY_CLASSES_ROOT\CLSID\{ad7a7d7f-139d-403f-aea8-82e97a83d184}\InprocServer32] 
  @=" SMARTCARD _CredentialProvider.dll" 
  "ThreadingModel"="Apartment" 
  3 结束语 
  至此,我们介绍了一种通过智能卡登录Windows操作系统的方式,并简单介绍了Windows Credential Provider的关键函数。通过上述方法,还得到了一种将用户名密码登录方式转换为另一种登录方式的思路(如指纹登录、证书登录等)。为定制更安全、更方便、更友好的Windows登录程序打下了基础。 
  参考文献: 
  [1] Windows Vista Sample Credential Providers Overview.doc[EB]. 
  [2] Credential Providers for PDC - Final.doc[EB]. 
  [3] 陈锐,蒋泽军,陈福,等.基于Credential Provider的身份认证模型的研究与实现[J].航空计算技术,2010(3):1-4.

一种基于智能卡登录Windows系统的实现方式相关推荐

  1. linux 轮巡监控进程,一种基于云平台的系统监控方法专利_专利申请于2015-01-06_专利查询 - 天眼查...

    1. 一种基于云平台的系统监控方法,其特征在于含有以下步骤: 步骤1.数据信息采集步骤: 对被管资源的数据采集支持"自动发现"和手工输入两种方式配置被监测对象的配置 参数,并通过主 ...

  2. 应用linux系统的机器人,一种基于linux的机器人系统及方法与流程

    技术特征: 1.一种基于linux的ros+android+移动底盘rtos深度融合的机器人系统,其特征在于,包括器人主板.移动底盘以及云端,所述机器人主板为linux系统.ros系统以及androi ...

  3. Linux系统和Windows系统打开文件方式

    这里以".bmp"文件为例: 1.Windows系统中新建".bmp"文件,系统就会默认以对应格式工具打开该文件: 2.Linux系统中新建".bmp ...

  4. arm板telnetd为什么运行不了_一种基于ARM的嵌入式系统开发的方案详细讲解

    背景介绍 在日益信息化的社会中,各种各样的嵌入式系统已经全面渗透到日常生活的每一个角落.嵌入式系统的功能越来越复杂,这就使得一个嵌入式系统产品从市场需求立项到方案选择.样机研制.定型量产所需要的开发费 ...

  5. 一种基于Android、iOS系统的移动端车牌识别方法,实现手机拍照识别车牌

    随着移动行业的爆发式发展,手机配置不断提高,基于手机平台的信息采集.图像处理.数据传输等方面的研究也成为了热点,这使得基于手机平台上的车牌识别成为可能.传统的车牌识别系统一般都基于固定的桌面平台.图像 ...

  6. android 银行卡绑定银行卡,一种基于Android、iOS系统的移动端银行卡识别方法,让银行卡绑定这一行为变得更轻松...

    迅猛发展的移动互联网产业,类似手机支付宝的移动商业应用琳琅满目,网络购物.理财.商旅应用.打车软件等的兴起,让用户的习惯开始慢慢倾斜,移动支付的场景也愈加丰富起来,给人们带来了丰富多彩且方便快捷的数字 ...

  7. 一些获取当前登录Windows系统用户信息的命令

    set u 查看当前用户的域名, 帐户名 set l 查看这个账户登录的DC的名字 nltest /dcname:NameOfDomain 查看域中主DC的名字.

  8. java jcr_java – 通过JCR实现基于标签的搜索系统的最佳方式,如Modeshape

    有几种方法可以在JCR中实现标记.您选择哪个选项取决于您自己的应用程序的需求.以下是我所知道的四个选项. 选项1:使用Mixins 为每个标记定义一个mixin节点类型定义,它是一个标记mixin(它 ...

  9. 深入解析Windows系统两大进程

    在这将着重介绍一下Windows系统的Svchost.exe和Explorer.exe两种进程,作为Windows系统中两种重要的进程,下面我们就来看看他们的特点以及在各个操作系统中的应用.  Exp ...

最新文章

  1. 创建三维建筑可视化和虚拟现实的最快和最简单的方法
  2. ANDROID开发之SQLite详解
  3. [转]chroot的使用
  4. 编程书单:十本Python编程语言的入门书籍
  5. 基于知识图谱的直升机飞行指挥模型研究
  6. php 远程图片合拼,php获取远程图片的三种方式
  7. 信息论与编码_庆祝中山大学计算机科学系成立40周年系列活动 | 第四届“信息论与编码中大论坛”...
  8. windows winrar 指令_Windows上WinRAR.exe命令行参数说明(转载) .
  9. 手机系统一般是用Java写的吗_三大操作系统比较,为什么java开发一般用Linux系统?...
  10. java mail header_java使用mail发送邮件时出现乱码如何解决
  11. C语言之“#“和“##“用法(十四)
  12. plsql使用存储过程添加数据
  13. 一键自动下载百度美女图片
  14. 河南省邓州市计算机学校,2019年邓州市职业技术学校招生简章及招生专业
  15. 新手入门吉他买什么好?十年吉他老司机教你如何远离烧火棍,附上靠谱吉他品牌推荐!
  16. Django—CRM项目练习
  17. 接入支付宝电脑网站支付实现JAVA版
  18. Zabbix-agent部署
  19. A*算法:启发式(heuristic)算法
  20. 【大学物理·恒定电流的磁场】磁场对载流导线的作用

热门文章

  1. 快捷键-Windows快捷键
  2. 电子商务设计师书籍的记录
  3. 鸿蒙系统明年上市巧,华为:智能手表及笔记本电脑将搭载鸿蒙系统 手机明年上市...
  4. Python 神仙姐姐图像手绘效果实现
  5. 堪比魔法水晶球!人工智能变身“占卜师”
  6. 苹果设计团队正在经历重大变革:三名核心元老离职
  7. 01.14第65期短中线黑马推荐!
  8. 非洲勒索软件、僵尸网络攻击有所增加——但在线诈骗仍构成最大威胁
  9. String知识点-这一篇全部了解
  10. Go in Practice-Manning 2016(读书笔记)