随着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加密保存到智能卡文件系统中,其中加密密钥是智能卡初始化时写入的对称密钥。至此,用户名密码绑定程序对智能卡的初始化工作就完成了。
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 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.