发明内容
为了解决上述在同一桌面中模式对话框中输入的内容易被黑客或木马钩子病毒钩获,且在不同桌面中不能实现跨线程显示模式对话框及跨线程使用模式对话框自绘控件的问题,本发明提供了基于Windows操作系统下的一种安全输入方法,通过存储区共享的方式来实现跨线程显示模式对话框,尤其是实现对自绘控件等非标准(非缺省)的MFC控件的使用,进一步提高输入的安全性。
基于Windows操作系统下的一种安全输入方法,其特征是包括如下步骤:
一系统变量设置:在系统桌面即第一桌面当前运行的线程或进程创建第一共享存储区,在所述第一共享存储区内定义用于显示模式对话框的一个或多个参数,设置所述参数的初始值;定义模式对话框的消息映射函数及与模式对话框的控件对应的类、在所述第一共享存储区中定义所述类的实例;定义所述类的初始化方法和自定义消息映射、并在模式对话框的自绘控件对应的类中定义绘制函数;
一桌面切换:桌面当前运行的线程或进程创建第二线程,所述第二线程创建另一桌面即第二桌面和第二共享存储区,并在所述第二共享存储区中定义一个或多个数据变量,设置所述数据变量的初始值,所述第二线程设置自身工作在第二桌面中,并将程序运行环境从第一桌面切换到第二桌面;
一显示模式对话框及实现自绘控件:第二线程利用DialogBox函数显示模式对话框;并调用所述消息映射函数利用从所述第一共享存储区中读取所述参数的初始值和所述类的实例通过所述初始化方法对所述模式对话框的控件进行初始化,调用所述绘制函数实现自绘控件的绘制;
一第二线程接收通过所述模式对话框输入的数据后,更新所述第二共享存储区中的数据变量的值为接收到的数据;
一第二线程关闭第二桌面,将当前运行环境切换回第一桌面,结束自身运行,第一桌面当前运行的线程或进程获取所述第二共享存储区中更新后的数据变量。
所述第二线程接收通过所述模式对话框输入的数据具体为:所述第二线程接收利用所述绘制函数实现的绘制控件在所述模式对话框中绘制输入的数据。
定义所述类的初始化方法包括下列步骤:
将类与控件窗口进行关联;
用所述自定义消息映射代替控件的缺省消息映射。
利用SetProp函数和GetProp函数将类与控件窗口进行关联。
调用SetWindowLong函数,实现用所述自定义消息映射代替控件的缺省消息映射。
所述第一共享存储区与所述第二共享存储区可以共用一个共享存储区。
所述第一共享存储区、第二共享存储区可以通过共享内存、共享文件、共享注册表、共享先入先出队列、共享通信管道或共享系统剪切板的方法实现。
更新所述数据变量的值为接收到的数据的方法具体为:在所述第二共享存储区中改写并存储数据变量为接收到的数据。
更新所述数据变量的值为接收到的数据的方法具体为:实现一个统一的更新函数,在DialogBox函数返回时调用所述统一的更新函数在所述第二共享存储区中改写并存储数据变量为接收到的数据。
本发明的有益效果是:本发明提供的基于Windows操作系统下的一种安全输入方法,通过存储区的共享,不但可以有效避免在同一桌面中模式对话框中输入的参数易被黑客或木马钩子病毒(包括键盘钩子病毒等)钩取的危险,大大的提高了安全性;同时又解决了在不同桌面中不能实现跨线程使用和显示模式对话框的问题,更重要的是解决了跨线程使用模式对话框的自绘控件的问题,可以有效屏蔽掉可以自动寻找当前活动桌面,钩取窗口输入内容的高级钩子病毒,进一步解决了安全输入的问题。
具体实施方式
为使本发明的目的、技术方案和优点更加清楚,下面将结合附图和实施例对本发明实施方式做进一步地详细描述。
实施例1:
参见图1,为本发明实施例提供的基于Windows操作系统下的一种安全输入方法,包括:
步骤101:系统变量设置,主要包括如下内容:在系统桌面即第一桌面当前运行的线程或进程创建第一共享存储区,在该第一共享存储区内定义用于显示模式对话框的一个或多个参数,设置上述参数的初始值;定义模式对话框的消息映射函数及与模式对话框的控件对应的类、并在该第一共享存储区中定义上述类的实例;定义类的初始化方法和自定义消息映射、并在模式对话框的自绘控件对应的类中定义绘制函数;
其中定义上述类的初始化方法包括:
1)将类与控件窗口关联起来;
2)用类的自定义消息映射代替控件的缺省消息映射。
优选的,利用SetProp函数和GetProp函数将类与控件窗口关联起来。
优选的,利用SetWindowLong函数用类的自定义消息映射代替控件的缺省消息映射。
优选的,第一共享存储区可以用共享内存、文件、注册表、先入先出队列(FIFO队列)、通信管道或共享系统剪切板等实现。
步骤102:桌面切换,主要包括如下内容:第一桌面当前运行的线程或进程创建第二线程,第二线程创建另一桌面即第二桌面和第二共享存储区,在第二共享存储区中定义一个或多个数据变量,设置该数据变量的初始值,第二线程设置自身工作在第二桌面中,并将程序运行环境从第一桌面切换到第二桌面;
其中第一桌面当前运行的线程或进程创建第二线程的方法优选的可以采用:
UINT hUIThread=_beginthreadex(NULL,0,LoginUIFunc,&arg,0,&dwThreadID);
实现,也可以采用其他类似的方法实现。
第二线程创建第二桌面,设置自身工作在第二桌面中,优选的可以采用
hdesk=CreateDesktop(sDeskName,NULL,NULL,0,MAXIMUM_ALLOWED,NULL);
SetThreadDesktop(hdesk);
实现;
实际应用中,可以对第一桌面进行截屏,将获得的图片设为第二桌面的壁纸,使得用户察觉不到桌面的切换。进一步地,对图片进行加灰之类的处理再设为壁纸,就可以获得与Windows VISTA安全虚拟桌面类似的效果等等。
第二共享存储区可以用共享内存、文件、注册表、先入先出队列(FIFO队列)、通信管道或共享系统剪切板等实现。
第二线程将程序运行环境从第一桌面切换到第二桌面,优选的,可以采用
SwitchDesktop(hdesk);
实现,当然也可以采用其他类似的方法实现。
步骤103:显示模式对话框及实现自绘控件,主要包括如下内容:第二线程利用DialogBox函数显示模式对话框;并调用消息映射函数利用从第一共享存储区中读取参数的初始值和上述类的实例通过初始化方法对其控件进行初始化,调用绘制函数实现自绘控件的绘制;
其中绘制函数为用于提供对模式对话框进行自绘的操作方法,比如提供画圈的方法、画按钮的方法、画对话框的方法等等,举个网络交易的例子具体说明,在网络交易中会提醒输入帐号、密码或交易金额等,此时可以在第二桌面中采用自绘控件绘制一个软键盘,当软键盘在对应的位置收到点击操作事件时,便会在对应的位置采集到一个位置信息,当全部输入完毕后,在第二桌面中实际上是获取了一系列的位置信息,按照预先约定的映射关系映射成相应的数据即可,相对于在第二桌面中直接使用标准的模式对话框而言,可以有效屏蔽掉一些高级的钩子病毒,防止其自动查找当前活动桌面,并通过窗口枚举将在对话框中输入的信息钩取,所以,利用跨线程调用模式对话框的自绘控件功能,大大提高了信息输入的安全性。
步骤104:第二线程接收通过模式对话框输入的数据后,更新第二共享存储区中的数据变量的值为接收到的数据;
也可以实现一个统一的更新函数,在DialogBox函数返回时利用该统一的更新函数在第二共享存储区中改写并存储数据变量为接收到的数据。
优选的,第二线程接收通过所述模式对话框输入的数据具体可以是:第二线程接收的数据是利用上述绘制函数实现的绘制控件在模式对话框中通过绘制输入的。
步骤105:第二线程关闭第二桌面,将当前运行环境切换回第一桌面,结束自身运行;
比如:SwitchDesktop(hdeskCurrent);
CloseDesktop(hdesk);
步骤106:第一桌面当前运行的线程或进程获取第二共享存储区中更新后的数据变量,完成跨线程数据交互。
实施例2:
参见图2,为本发明实施例提供的基于Windows操作系统下的一种安全输入方法的一个优选实例:安全输入方法在智能密钥装置中的一种具体应用方法。
智能密钥装置目前被广泛应用在身份识别、网上银行和VPN(Virtual Private Network,虚拟专用网络)等方面,智能密钥装置是一种带有处理器和存储器的小型硬件装置,可以通过计算机的数据通讯接口与计算机连接,一般是通过USB(Universal Serial Bus,通用串行总线)接口与计算机相连,通常被称为USB KEY或USB Token(身份认证设备)。智能密钥装置可以对其内部存储的数据进行加、解密处理,即可以将智能密钥装置用于软件版权保护领域;另外可以将一些重要信息存储到智能密钥装置中,用以保证安全性或者防止遗忘,比如密码等。目前,较高端的智能密钥装置都是可编程的,即可以实现在智能密钥装置中运行预先存入其中的代码。智能密钥装置具有物理抗攻击的特性,安全性很高。
基于智能密钥装置的身份认证方式是近几年发展起来的一种方便、安全的身份认证方式:一般采用PIN(个人身份识别)码验证用户身份的合法性,在进行身份认证时将智能密钥装置与计算机相连,计算机中会显示一个模式对话框让用户输入PIN码,用户在计算机上输入PIN码,智能密钥装置会将用户输入的PIN码与其内部存储的PIN码进行比较,验证该PIN码的正确性,当用户输入的PIN码正确时,说明该用户为该智能密钥装置的合法持有者,允许该用户使用该智能密钥装置;否则,禁止用户使用该智能密钥装置。
如前所述,由于客户端一般都是用户个人计算机,安全级别一般很低,非常容易被黑客攻击或中木马钩子病毒等,所以如果客户端计算机被黑客或木马钩子病毒等远程控制,便可以在弹出的模式对话框中截获由用户在该模式对话框中输入的重要或敏感参数(PIN码等),给合法用户带来极大的安全隐患。所以,此时为了进一步的提高安全性,防止黑客或木马钩子病毒等远程截获用户的PIN码,冒用智能密钥装置,这就需要利用本发明实施例提供的跨线程显示模式对话框的方法,重新开启一个桌面,在新的桌面中开启一个模式对话框,用来输入PIN码,从而大大提高安全性,具体方法:
步骤201:将智能密钥装置与主机连接;
步骤202:系统变量设置,主要包括如下内容:在系统桌面即第一桌面当前运行的线程或进程创建第一共享存储区,在该第一共享存储区内定义用于显示模式对话框的一个或多个参数,设置上述参数的初始值;定义模式对话框的消息映射函数及与模式对话框的控件对应的类、并在该第一共享存储区中定义上述类的实例;定义类的初始化方法和自定义消息映射、并在模式对话框的自绘控件对应的类中定义绘制函数;
其中定义上述类的初始化方法包括:
1)将类与控件窗口关联起来;
2)用类的自定义消息映射代替控件的缺省消息映射。
优选的,利用SetProp函数和GetProp函数将类与控件窗口关联起来。
优选的,利用SetWindowLong函数用类的自定义消息映射代替控件的缺省消息映射。
优选的,第一共享存储区可以用共享内存、文件、注册表、先入先出队列(FIFO队列)、通信管道或共享系统剪切板等实现。
步骤203:第一桌面当前运行的线程或进程监控是否有对智能密钥装置私有区的操作,当监控到有对该私有区的操作时执行步骤204,否则继续监控;
步骤204:第一桌面当前运行的线程或进程创建第二线程;
比如可以采用
UINT hUIThread=_beginthreadex(NULL,0,LoginUIFunc,&arg,0,&dwThreadID);
实现,当然也可以采用其他类似的方法实现。
步骤205:第二线程打开/创建第二桌面和第二共享存储区,在第二共享存储区中定义一个或多个数据变量,设置该数据变量的初始值,第二线程设置自身工作在第二桌面中;
第二线程打开/创建第二桌面的方法优选的可以采用如下方法实现:
hdesk=CreateDesktop(sDeskName,NULL,NULL,0,MAXIMUM_ALLOWED,NULL);
SetThreadDesktop(hdesk);
实现,也可以采用其他类似的方法实现。
优选的,可以对第一桌面进行截屏,将获得的图片设为第二桌面的壁纸,使得用户察觉不到桌面的切换。进一步地,对图片进行加灰之类的处理再设为壁纸,就可以获得与WindowsVISTA安全虚拟桌面类似的效果。
第二共享存储区可以用共享内存、文件、注册表、先入先出队列(FIFO队列)、通信管道或共享系统剪切板等实现。
步骤206:第二线程将程序运行环境从第一桌面切换到第二桌面;
优选的,可以采用
SwitchDesktop(hdesk);
实现,也可以采用其他类似的方法实现。
步骤207:显示模式对话框、控件初始化及实现自绘控件的绘制主要包括如下内容:第二线程利用DialogBox函数显示模式对话框,消息映射函数利用从第一共享存储区中读取参数的初始值和类的实例,调用上述初始化方法对模式对话框的控件进行初始化,并调用上述绘制函数实现自绘控件的绘制;
第二线程利用DialogBox函数调用绘制函数显示可自绘的模式对话框,该模式对话框为利用绘制函数绘制有一个软键盘的模式对话框,当软键盘在对应的按键位置收到点击操作事件时,便会在对应的位置采集到一个位置信息,当数据全部输入完毕后,在第二桌面中实际上是获取了一系列的由圆组成的位置信息,按照预先约定的映射关系映射成相应的数据。
其中绘制函数为用于提供对模式对话框进行自绘的操作方法,比如提供画圈的方法、画按钮的方法、画对话框的方法等等。
其中第二线程使用DialogBox函数显示模式对话框,并在DialogBox函数中调用上述模式对话框对应的自定义消息映射。
优选的,可以采用如下方法实现:
ret=DialogBox(hInst,MAKEINTRESOURCE(IDD_DLG_LOGIN),NULL,
LoginUI_WndProc);
其中IDD_DLG_LOGIN是模式对话框的资源ID,LoginUI_WndProc是模式对话框对应的自定义消息映射。
当然也可以采用其他类似的方法实现。
步骤208:第二线程接收到用户在模式对话框的软键盘中输入的PIN码后,将该PIN码送入智能密钥装置中进行认证,并将认证结果返回到第二桌面中的第二线程;
其中,模式对话框的软键盘是利用绘制函数实现的绘制控件绘制实现的,即第二线程接收到用户利用绘制函数实现的绘制控件在模式对话框中通过绘制输入的PIN码。
步骤209:第二线程等待接收认证结果后,将认证结果存储在第二共享存储区中的数据变量中;
也可以实现一个统一的更新函数,在DialogBox函数返回时将认证结果存储在第二共享存储区中的数据变量中。
步骤210:第二线程关闭第二桌面,将当前运行环境切换回第一桌面,结束自身运行;
比如:SwitchDesktop(hdeskCurrent);
CloseDesktop(hdesk);
也可以采用其他类似的方法实现。
步骤211:第一桌面当前运行的线程或进程获取第二共享存储区中更新后的数据变量的内容后,依据认证结果确定是否允许使用智能密钥装置的私有区,完成跨线程数据交互。
具体的是,当第一桌面当前运行的线程或进程获取的第二共享存储区中更新后的数据变量的内容是认证成功(比如全局变量的结果是“真”即值为1)时,允许对智能密钥装置私有区的访问操作;当第一桌面当前运行的线程或进程获取的第二共享存储区中更新后的数据变量的内容是认证失败(比如全局变量的结果是“假”即值为0)时,不允许对智能密钥装置私有区的访问操作。
该种方法可以有效避免在同一桌面中模式对话框中输入的内容易被黑客或木马钩子病毒(包括很常见的键盘钩子病毒)截获的危险,同时又解决了在不同桌面中不能实现跨线程使用和显示模式对话框的问题,大大的提高了安全性。
当然,实际应用中,步骤208~步骤211还可以是:
步骤208′:第二线程接收到用户在模式对话框的软键盘中输入的PIN码后,将PIN码存储在第二共享存储区中的数据变量中;
也可以实现一个统一的更新函数,在DialogBox函数返回时将PIN码存储在对应的第二共享存储区中的数据变量中。
其中,模式对话框的软键盘是利用绘制函数实现的绘制控件绘制实现的,即第二线程接收到用户利用绘制函数实现的绘制控件在模式对话框中通过绘制输入的PIN码。
步骤209′:第二线程关闭第二桌面,将当前运行环境切换回第一桌面,结束自身运行;
优选的,可以用如下方法实现:
SwitchDesktop(hdeskCurrent);
CloseDesktop(hdesk);
也可以采用其他类似的方法实现。
步骤210′:第一桌面当前运行的线程或进程获取第二共享存储区中的数据变量的内容后,即获取到用户输入的PIN码后,将该PIN码送入智能密钥装置中进行认证,依据认证结果确定是否允许使用智能密钥装置的私有区,完成跨线程数据交互。
具体的是,当第一桌面当前运行的线程或进程获取的第二共享存储区中的数据变量的内容即PIN码为正确时,允许对智能密钥装置私有区的访问操作;当第一桌面当前运行的线程或进程获取的第二共享存储区中的数据变量的内容即PIN码为错误时,不允许对智能密钥装置私有区的访问操作。
该种方法可以有效避免键盘钩子程序对PIN码内容的截获,提高智能密钥装置使用时的安全性。
另外,除了利用本发明实施例提供的跨线程显示模式对话框的方法实现智能密钥装置PIN码安全输入之外,还可以将本发明实施例提供的跨线程显示模式对话框的方法应用在利用智能密钥装置进行敏感信息输入的场合,如在网络交易中网银帐号的输入、交易金额的输入等。
当然,实际应用中,除了智能密钥装置外的其他装置,比如U盘、移动硬盘、HUB、读卡器、智能卡等等,均可以使用本发明实施例提供的安全输入方法的原理通过主机进行安全输入;本发明实施例提供的安全输入的方法,还可以应用在软件登录等场合,比如远程登录服务器、远程登录论坛等或本机登录、客户管理系统(CRM)的登录或财务管理软件的登录等其他需要在模式对话框中进行输入的场合。
本发明实施例提供的基于Windows操作系统下的一种安全输入方法,通过存储区的共享,不但可以有效避免在同一桌面中模式对话框中输入的参数易被黑客或木马钩子病毒(包括键盘钩子病毒等)钩取的危险,大大的提高了安全性;同时又解决了在不同桌面中不能实现跨线程使用和显示模式对话框的问题,更重要的是解决了跨线程使用模式对话框的自绘控件的问题,可以有效屏蔽掉可以自动寻找当前活动桌面,钩取窗口输入内容的高级钩子病毒,进一步提高了安全输入的问题。
以上所述仅为本发明的较佳实施例,并不用以限制本发明,凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。