本发明涉及通信领域,尤其涉及一种实现浏览器访问智能密钥设备的方法及系统。
背景技术:
NPAPI技术作为上一个世纪的技术架构,已经无法满足当下的需求,2014年,Mozilla宣布了NPAPI的死亡,各大厂商也都宣布不再支持NPAPI技术。Chrome浏览器,作为主流的浏览器,从2015年1月开始默认屏蔽NPAPI插件,所以Chrome浏览器已经无法访问使用NPAPI技术开发的插件。
尤其是NPAPI技术存在以下缺陷:NPAPI技术实现的插件无法支持移动平台;使用NPAPI技术实现的NPAPI插件在浏览器外部运行,因此拥有当前用户访问本地计算机的最高权限,黑客可以通过NPAPI插件的漏洞在本地计算机上执行恶意程序,使系统存在安全隐患;与此同时,NPAPI插件的稳定性、以及NPAPI插件向浏览器输出数据的稳定性不可控,容易引起浏览器崩溃。
因此,在浏览器访问本地计算机的过程中,业界亟需一种能够替代NPAPI技术,同时具有应用范围广、安全、稳定的通讯方法。
技术实现要素:
本发明为解决上述现有技术中存在的技术问题提供一种实现浏览器访问智能密钥设备的方法及系统。
本发明提供了一种实现浏览器访问智能密钥设备的方法,包括以下步骤:
步骤S1:扩展程序接收来自浏览器的第一数据,并将所述第一数据发送给本地应用程序;
步骤S2:所述本地应用程序解析所述第一数据得到通讯参数,根据所述通讯参数调用智能密钥设备的驱动接口,向所述智能密钥设备发送相应指令,并接收所述智能密钥设备返回的操作结果;
步骤S3:所述本地应用程序根据接收的操作结果组织第二数据,并将所述第二数据发送给所述扩展程序;
步骤S4:所述扩展程序接收所述第二数据,并将所述第二数据发送给所述浏览器。
本发明还提供了一种实现浏览器访问智能密钥设备的系统,包括扩展程序和本地应用程序;
所述扩展程序包括:
第一接收模块,用于接收来自浏览器的第一数据;
第一发送模块,用于将所述第一接收模块接收的所述第一数据发送给所述本地应用程序;
第二接收模块,用于接收来自所述本地应用程序的第二数据;
第二发送模块,用于将所述第二接收模块接收的所述第二数据发送给所述浏览器;
所述本地应用程序包括:
第三接收模块:用于接收来自所述扩展程序的所述第一数据;
解析模块,用于解析所述第一数据得到通讯参数;
第三发送模块,用于根据所述解析模块得到的所述通讯参数调用智能密钥设备的驱动接口,向所述智能密钥设备发送相应指令;
第四接收模块,用于接收所述智能密钥设备返回的操作结果;
组织模块,用于根据所述第四接收模块接收的操作结果组织第二数据;
第四发送模块,用于将所述组织模块组织的所述第二数据发送给所述扩展程序。
本发明与现有技术相比的有益效果是:本发明中,浏览器通过扩展程序实现访问本地计算机中的智能密钥设备,从而代替浏览器通过NPAPI技术访问本地计算机的通讯方式。与NPAPI技术相比,本发明提供的方法还具有以下优势:本发明中浏览器可以支持PC平台和移动平台,与只能支持PC平台的NPAPI技术相比具有更广的应用范围;扩展程序在浏览器中运行,对当前用户的本地计算机拥有较低的访问权限,黑客很难通过扩展程序访问到本地计算机,因此本发明提供的通讯方法具有较高的安全性;同时,扩展程序具有较好的稳定性,不会引起浏览器的崩溃。
附图说明
图1所示为本发明实施例1中一种实现浏览器访问智能密钥设备的方法流程图。
图2所示为本发明实施例2中一种实现浏览器访问智能密钥设备的方法流程图。
图3所示为本发明实施例3中一种实现浏览器访问智能密钥设备的方法流程图。
图4所示为本发明实施例4中一种实现浏览器访问智能密钥设备的系统模块组成框图。
具体实施方式
为使本发明的目的、技术方案和优点更加清楚,下面将结合附图对本发明实施方式作进一步地详细描述。
实施例1
本实施例提供一种实现浏览器访问智能密钥设备的方法,如图1所示,包括以下步骤:
步骤S1:扩展程序接收来自浏览器的第一数据,并将第一数据发送给本地应用程序;
步骤S2:本地应用程序解析第一数据得到通讯参数,根据通讯参数调用智能密钥设备的驱动接口,向智能密钥设备发送相应指令,并接收智能密钥设备返回的操作结果;
步骤S3:本地应用程序根据接收的操作结果组织第二数据,并将第二数据发送给扩展程序;
步骤S4:扩展程序接收第二数据,并将第二数据发送给浏览器。
本实施例上述步骤S1中,扩展程序将第一数据发送给本地应用程序之前,还包括:扩展程序与本地应用程序建立连接。
进一步地,上述扩展程序与本地应用程序建立连接之前,还包括:
扩展程序判断与本地应用程序的连接是否有效,是则将第一数据发送给本地应用程序,否则与本地应用程序建立连接。
本实施例中,上述步骤S1之前,还包括:扩展程序注册浏览器监听接口;
相应地,步骤S1中,扩展程序接收来自浏览器的第一数据,具体为:扩展程序通过浏览器监听接口接收来自浏览器的第一数据。
具体地,扩展程序注册浏览器监听接口,具体为:扩展程序根据长链接的第二端口类注册浏览器监听接口。
进一步地,扩展程序根据长链接的第二端口类注册浏览器监听接口之前,还包括:
步骤N1:扩展程序通过长链接请求监听接口监听来自浏览器的长链接请求,获取长链接的第二端口类;
相应地,上述步骤S4具体为:扩展程序根据长链接的第二端口类将第二数据返回浏览器。
进一步地,上述扩展程序根据长链接的第二端口类注册浏览器监听接口之后、步骤S1之前,或者扩展程序接收来自浏览器的第一数据之后、扩展程序将第一数据发送给本地应用程序之前,还包括:扩展程序与本地应用程序建立连接。
进一步地,上述扩展程序与本地应用程序建立连接之前,还包括:
扩展程序判断与本地应用程序的连接是否有效;
相应地,扩展程序与本地应用程序建立连接,具体为:当扩展程序判断与本地应用程序的连接无效时,扩展程序与本地应用程序建立连接。
本实施例中,上述扩展程序判断与本地应用程序的连接是否有效,具体为:
扩展程序判断端口类是否为空,如果是,则扩展程序与本地应用程序的连接无效;否则,扩展程序与本地应用程序的连接有效。
本实施例中,上述扩展程序与本地应用程序建立连接,具体为:
扩展程序根据自身保存的位置标识建立与本地应用程序的通讯管道,连接到本地应用程序。
具体地,扩展程序根据自身保存的位置标识建立与本地应用程序的通讯管道,连接到本地应用程序,具体包括:
步骤a1:扩展程序根据自身保存的位置标识找到本地应用程序的配置文件,并解析配置文件,得到本地应用程序的路径;
步骤a2:扩展程序根据本地应用程序的路径建立与本地应用程序的通讯管道;
相应地,步骤S1中,扩展程序将第一数据发送给本地应用程序,具体为:扩展程序通过通讯管道将第一数据发送给本地应用程序;
步骤S3中,本地应用程序将第二数据发送给扩展程序,具体为:本地应用程序通过通讯管道将第二数据发送给扩展程序。
进一步地,上述步骤a2还包括:扩展程序获取端口类,并根据端口类注册本地应用程序监听接口;
相应地,步骤S4中,扩展程序接收第二数据,具体为:扩展程序通过本地应用程序监听接口接收本地应用程序通过通讯管道发送的第二数据。
具体地,上述步骤a1具体包括:
步骤a11:扩展程序根据自身保存的位置标识找到本地应用程序的配置文件的位置;
步骤a12:扩展程序根据配置文件的位置连接到本地应用程序的配置文件,并解析配置文件,得到本地应用程序的路径。
本实施例上述步骤S1中,还包括,扩展程序接收来自浏览器的通讯标识;
相应地,步骤S1中,扩展程序将第一数据发送给本地应用程序,具体为:扩展程序将第一数据和通讯标识发送给本地应用程序;
步骤S3中,本地应用程序根据接收的操作结果组织第二数据,具体为:本地应用程序根据通讯标识和接收的操作结果组织第二数据;
步骤S4中,扩展程序将第二数据发送给浏览器,具体为:
扩展程序根据第二数据中的通讯标识将第二数据发送给浏览器。
具体地,上述扩展程序将第一数据和通讯标识发送给本地应用程序,具体为:
扩展程序将通讯标识添加到第一数据中,将添加通讯标识之后的第一数据发送给本地应用程序。
可选地,扩展程序还包括前端,上述步骤S4中,扩展程序接收第二数据具体为:扩展程序的后台接收第二数据;
上述步骤S4中,扩展程序根据第二数据中的通讯标识将第二数据发送给浏览器,具体为:
扩展程序的后台根据第二数据中的通讯标识将第二数据发送给前端;扩展程序的前端将第二数据发送给浏览器。
本发明中,浏览器通过扩展程序实现访问本地计算机中的智能密钥设备,从而代替浏览器通过NPAPI技术访问本地计算机的通讯方式。与NPAPI技术相比,本发明提供的方法还具有以下优势:本发明中浏览器可以支持PC平台和移动平台,与只能支持PC平台的NPAPI技术相比具有更广的应用范围;扩展程序在浏览器中运行,对当前用户的本地计算机拥有较低的访问权限,黑客很难通过扩展程序访问到本地计算机,因此本发明提供的通讯方法具有较高的安全性;同时,扩展程序具有较好的稳定性,不会引起浏览器的崩溃。
实施例2
本实施例提供一种实现浏览器访问智能密钥设备的方法,应用于包括浏览器、扩展程序、本地应用程序和智能密钥设备的系统。如图2所示,包括:
步骤H1:扩展程序注册浏览器监听接口,等待接收来自浏览器的数据。
具体地,扩展程序注册浏览器监听接口,具体为:在扩展程序启动时,扩展程序将第一扩展函数注册为浏览器监听接口。更具体地,扩展程序将第一扩展函数注册为浏览器监听接口,具体为:扩展程序调用第一系统函数将第一扩展函数注册为浏览器监听接口。
例如,第一扩展函数为:function(data,sender,sendResponse);
第一系统函数为:chrome.runtime.onMessageExternal.addListener
注册得到的浏览器监听接口为:chrome.runtime.onMessageExternal.addListener(function(data,sender,sendResponse))。
其中,function为第一扩展函数的名称,data、sender和sendResponse为第一扩展函数的参数。第一扩展函数名称可以变,第一扩展函数的参数形式不变,但参数名称可以改变。扩展程序可以通过浏览器监听接口chrome.runtime.onMessageExternal.addListener(function(data,sender,sendResponse))监听来自浏览器的数据。
步骤H2:浏览器调用相关的通讯参数,根据通讯参数组织第一数据;
可选地,步骤H2中浏览器调用相关的通讯参数,具体为:当用户在浏览器上点击相关功能的按钮时,浏览器从指令类型库中调用相关的通讯参数。可选地,指令类型库为浏览器自身的数据库。
当用户在浏览器上点击获取签名结果按钮时,浏览器从指令类型库中调用的通讯参数为签名指令数据,根据签名指令数据组织的第一数据为:var cmdMsg={"cmd":"USBSign","hashAlg":"SHA1","textData":"1234"};
当用户在浏览器上点击读公钥按钮时,浏览器从指令类型库中调用的通讯参数为读公钥指令数据,根据读公钥指令数据组织的第一数据为:var cmdMsg={"cmd":"GetPublicKey"};
当用户在浏览器上点击获取序列号按钮时,浏览器从指令类型库中调用的通讯参数为获取序列号指令数据,根据获取序列号指令数据组织的第一数据为:var cmdMsg={"cmd":"GetSerialNumber"}。
可选地,步骤H2中浏览器调用相关的通讯参数,具体为:当用户在浏览器上点击相关功能的按钮时,浏览器生成并调用相关的通讯参数。
步骤H3:浏览器根据扩展标识向扩展程序发送第一数据。
具体地,浏览器调用接口函数根据扩展标识向扩展程序发送第一数据;
例如,接口函数为:chrome.runtime.sendMessage(ExtID,message),ExtID为扩展标识,message中包括第一数据;
其中,扩展标识ExtID="qfdykbmfjccjpaijgjjdnkghpdpnakef"。
步骤H4:扩展程序通过浏览器监听接口接收第一数据和通讯标识;
具体地,扩展程序通过浏览器监听接口监听来自浏览器的第一数据和通讯标识,并从浏览器监听接口的第一扩展函数中获取第一数据和通讯标识。
例如,扩展函数通过浏览器监听接口
chrome.runtime.onMessageExternal.addListener(function(data,sender,sendResponse))监听来自浏览器的通讯标识和第一数据,并从浏览器监听接口的第一扩展函数function(data,sender,sendResponse)中获取第一数据和通讯标识;其中,第一扩展函数中的sender中包括通讯标识,data中包括第一数据。
例如,第一数据中的通讯参数为签名指令数据时,data={"cmd":"USBSign","hashAlg":"SHA1","textData":"1234"};
第一数据中的通讯参数为读公钥指令数据时,data={"cmd":"GetPublicKey"};
第一数据中的通讯参数为获取序列号指令数据时,data={"cmd":"GetSerialNumber"}。
本实施例中,浏览器根据扩展标识向扩展程序发送第一数据时,生成通讯标识,并将通讯标识与第一数据通过扩展标识发送给扩展程序。
步骤H5:扩展程序判断与本地应用程序的连接是否有效,如果是则执行步骤H8,否则执行步骤H6。
具体地,扩展程序判断端口类portToNativehost是否为空,如果为空,则端口类无效,即扩展程序与本地应用程序没有建立连接;如果不为空,则端口类有效,即扩展程序与本地应用程序已经建立连接。
步骤H6:扩展程序根据自身保存的位置标识建立与本地应用程序的通讯管道,连接到本地应用程序,获取端口类。
可选地,步骤H6中,扩展程序根据自身保存的位置标识建立与本地应用程序的通讯管道,具体包括:
步骤a1:扩展程序根据自身保存的位置标识找到本地应用程序的配置文件,并解析配置文件,得到本地应用程序的路径;
步骤a2:扩展程序根据本地应用程序的路径建立与本地应用程序的通讯管道。
例如,步骤a2中,扩展程序建立与本地应用程序的通讯管道之后,获取的端口类如下:
portToNativehost=chrome.runtime.connectNative(hostName)。
可选地,步骤a1中,扩展程序根据自身保存的位置标识找到本地应用程序的配置文件,具体为:扩展程序根据自身保存的位置标识在配置文件目录中找到配置文件。其中,配置文件目录在本地计算机安装浏览器时生成。
更具体地,配置文件中包括本地应用程序名称、本地应用程序的路径、通讯管道类型和扩展标识。
以苹果系统为例对步骤a1进行说明,扩展程序根据自身保存的位置标识com.my_company.my_application.json在配置文件目录
/Library/Google/Chrome/NativeMessagingHosts/com.my_company.my_application.json中找到配置文件。例如,配置文件内容如下:
"name":"com.my_company.my_application.json"//本地应用程序名称;
"path":"nativeConsole.exe"//本地应用程序的路径;
"type":"stdio"//通讯管道类型
"allowed_origins":["chrome-extension://knldjmfmopnpolahpmmgbagdohdnhkik/"]//扩展标识;
扩展程序解析配置文件后得到本地应用程序的路径nativeConsole.exe。
以Linux系统为例对步骤a1进行说明,扩展程序根据自身保存的位置标识com.my_company.my_application.json在配置文件目录
/etc/opt/chrome/native-messaging-hosts/com.my_company.my_application.json中找到配置文件;例如,配置文件内容如下:
"name":"com.my_company.my_application.json"//本地应用程序名称
"path":"nativeConsole.exe"//本地应用程序的路径
"type":"stdio"//通讯管道类型
"allowed_origins":
["chrome-extension://knldjmfmopnpolahpmmgbagdohdnhkik/"]//扩展标识
扩展程序解析配置文件后得到本地应用程序的路径nativeConsole.exe。
可选地,上述步骤a1具体包括:
步骤a11:扩展程序根据自身保存的位置标识找到本地应用程序的配置文件位置;
具体地,扩展程序根据自身保存的位置标识在注册表的浏览器安装路径中找到本地应用程序的配置文件位置;
以windows系统为例对步骤a11进行说明,扩展程序根据自身保存的位置标识com.google.chrome.ft在注册表的浏览器安装路径中找到本地应用程序的配置文件位置,例如,配置文件位置为:
HKEY_LOCAL_MACHINE\SOFTWARE\Google\Chrome\NativeMessagingHosts\com.google.chrome.ft。
步骤a12:扩展程序根据配置文件位置连接到本地应用程序的配置文件,并解析配置文件,得到本地应用程序的路径;
具体地,扩展程序根据配置文件位置连接到本地应用程序的配置文件,具体为:扩展程序根据配置文件位置中记录的配置文件路径连接到本地应用程序的配置文件,例如,配置文件位置
HKEY_LOCAL_MACHINE\SOFTWARE\Google\Chrome\NativeMessagingHosts\com.google.chrome.ft中记录的配置文件路径为:
C:\ProgramFiles\EbankTools\EbankPlugin\com.icbc.FT.usbkey.newchrome-win.json。
例如,根据配置文件路径连接到的本地应用程序的配置文件内容如下:
"name":"com.my_company.my_application.json"//本地应用程序名称
"path":"nativeConsole.exe"//本地应用程序的路径
"type":"stdio"//通讯管道类型
"allowed_origins":
["chrome-extension://knldjmfmopnpolahpmmgbagdohdnhkik/"]//扩展标识。
步骤H7:扩展程序根据端口类注册本地应用程序监听接口。
具体地,扩展程序根据端口类将第二扩展函数注册为本地应用程序监听接口;更具体地,扩展程序调用第二系统函数根据端口类将第二扩展函数注册为本地应用程序监听接口。
例如,第二系统函数为:portToNativehost.onMessage.addListener
第二扩展函数为:onNativeMessage(message)
注册得到的本地应用程序监听接口为:
portToNativehost.onMessage.addListener(onNativeMessage)。
可选地,步骤H7中还包括:扩展程序根据端口类注册终止响应监听接口。
具体地,扩展程序根据端口类将第三扩展函数注册为终止响应监听接口;
更具体地,扩展程序根据端口类调用第三系统函数,将第三扩展函数注册为终止响应监听接口。
例如,第三扩展函数为:onDisconnected
第三系统函数为:portToNativehost.onDisconnect.addListener
注册得到的终止响应监听接口如下:
PortportToNativehost.onDisconnect.addListener(onDisconnected);
当本地应用程序与扩展程序连接异常(连接失败或者中途断开)时,扩展程序会调用终止响应监听接口,同时扩展程序组织异常数据,并将异常数据返回浏览器。
本实施例中,步骤H7之后、步骤H10之前还包括:系统判断扩展程序与本地应用程序是否成功建立连接,当系统判断扩展程序没有与本地应用程序成功建立连接时,调用终止响应监听接口。终止响应监听接口被调用后,扩展程序组织异常数据并根据通讯标识返回浏览器,浏览器接收到异常数据后根据异常数据显示异常信息。
本实施例中,上述步骤H7之后、步骤H10之前还包括:系统检测配置文件的内容是否正确,当系统检测配置文件的内容不正确时,调用终止响应监听接口,扩展程序组织异常数据并通过通讯标识将异常数据返回浏览器。
可选地,系统检测配置文件的内容是否正确,具体包括:系统检测配置文件中的本地应用程序的名称是否与位置标识一致,是则正确,否则不正确。
可选地,系统检测配置文件的内容是否正确,具体包括:系统检测配置文件中的扩展标识是否正确,是则正确,否则不正确。更具体地,系统检测配置文件中的扩展标识是否为默认的扩展标识,是则正确,否则不正确。
步骤H8:扩展程序将通讯标识添加到第一数据中。
例如,第一数据中的通讯参数为签名指令数据时,添加通讯标识后的第一数据具体为:
data={"cmd":"USBSign","hashAlg":"SHA1","textData":"1234","tabID":"4"};
第一数据中的通讯参数为读公钥指令数据时,添加通讯标识后的第一数据具体为:data={"cmd":"GetPublicKey","tabID":"4"};
第一数据中的通讯参数为获取序列号指令数据时,添加通讯标识后的第一数据具体为:data={"cmd":"GetSerialNumber","tabID":"4"}。
步骤H9:扩展程序通过通讯管道将添加通讯标识之后的第一数据发送给本地应用程序。
具体地,扩展程序调用第四扩展函数通过通讯管道将添加通讯标识之后的第一数据发送给本地应用程序。
例如,第四扩展函数为:portToNativeHost.postMessage(data)。
其中,data={"cmd":"GetSerialNumber","tabID":"4"},或
data={"cmd":"USBSign","hashAlg":"SHA1","textData":"1234","tabID":"4"},或data={"cmd":"GetPublicKey","tabID":"4"}。
步骤H10:本地应用程序解析第一数据得到通讯参数和通讯标识。
例如,本地应用程序解析第一数据得到的通讯参数和通讯标识为:
readData={"cmd":"USBSign","hashAlg":"SHA1","textData":"1234","tabID":"4"},或readData={"cmd":"GetSerialNumber","tabID":"4"},或readData={"cmd":"GetPublicKey","tabID":"4"};
其中,通讯参数"cmd":"GetSerialNumber"为获取序列号指令数据,通讯参数"cmd":"USBSign","hashAlg":"SHA1","textData":"1234"为签名指令数据,通讯参数"cmd":"GetPublicKey"为读公钥指令数据,"tabID":"4"为通讯标识。
步骤H11:本地应用程序根据通讯参数调用智能密钥设备的驱动接口向智能密钥设备发送相应指令;
具体地,本地应用程序根据通讯参数的类型调用智能密钥设备的驱动接口将相应指令发送给智能密钥设备。
例如,当通讯参数为签名指令数据"cmd":"USBSign","hashAlg":"SHA1","textData":"1234"时,本地应用程序根据签名指令数据调用智能密钥设备的驱动接口,向智能密钥设备发送签名指令;
当通讯参数为读公钥指令数据"cmd":"GetPublicKey"时,本地应用程序根据读公钥指令数据调用智能密钥设备的驱动接口,向智能密钥设备发送读公钥指令;
当通讯参数为获取序列号指令数据"cmd":"GetSerialNumber"时,本地应用程序根据获取序列号指令数据调用智能密钥设备的驱动接口,向智能密钥设备发送获取序列号指令。
步骤H12:智能密钥设备执行相应指令得到操作结果;
当智能密钥设备执行签名指令时,得到的操作结果为签名结果,例如签名结果如下:
"5C245E63806F2CFD9444974301D0A75EF25C1400741AAF85B676A52B8C4E165D01972698A9D6F2160800BAD447713748B1A4BD80324BECB802D103003B109A4B3EB4D92E11EFC17496C1363698D05BE82B663982DEBB67D408021D5A1855BBFAA5161B7CACCDC3E361CC9AF2B0268BD9CC9C40BA54A0D3667F47542179471683930213E30786F19701A1AA4AA864CF8ABA82C55E0C9AC0397F6E12CAF86E16B5764447C75F3F0479E4914FE0099C77B612F6562B2D43151B3D7D3FBD38606D25F85119C0D773C23F73EA16B2416DA4132340D2E9AF7ABD7DEB3E2331EEAA09D02FCA977EFC91858B1420F284FBA154C9684A002B0509CE3E6CB9470DE9A8145B6101C5";
当智能密钥设备执行读公钥指令时,得到的操作结果为公钥,例如得到的公钥如下:
30818902818100AC017998CEC50CF7D0F3CECBACFEF5E10BBB30CC7DE622F79A95546121D88A2C27A43D3DD8922495ED7E091A8C5B335C00FB5A2CF08BD8E5222939228133C15C4B5E63FBE6A111CA5AD9EA1FE3ED81C6D310A503E77B7DF30A60EEDE361AA0EC756D8C1331E9CCF0C85362BF30ADE591A3D2F1A084A530B9320AAF186D445DAB0203010001;
当智能密钥设备执行获取序列号指令时,得到的操作结果为序列号,例如得到的序列号为:5800000118。
步骤H13:智能密钥设备向本地应用程序发送操作结果;
步骤H14:本地应用程序根据通讯标识和接收的操作结果组织第二数据;
具体地,本地应用程序将通讯标识和接收的操作结果组织到预设结构体中,得到第二数据。
例如,当接收的操作结果为序列号时,根据序列号和通讯标识组织的第二数据为:
sendData={"result":"5800000118","tabID":"4"}。
可选地,步骤H14中,还包括:本地应用程序对操作结果进行加密,生成加密数据;
例如,当接收的操作结果为签名结果时,对签名结果
"5C245E63806F2CFD9444974301D0A75EF25C1400741AAF85B676A52B8C4E165D01972698A9D6F2160800BAD447713748B1A4BD80324BECB802D103003B109A4B3EB4D92E11EFC17496C1363698D05BE82B663982DEBB67D408021D5A1855BBFAA5161B7CACCDC3E361CC9AF2B0268BD9CC9C40BA54A0D3667F47542179471683930213E30786F19701A1AA4AA864CF8ABA82C55E0C9AC0397F6E12CAF86E16B5764447C75F3F0479E4914FE0099C77B612F6562B2D43151B3D7D3FBD38606D25F85119C0D773C23F73EA16B2416DA4132340D2E9AF7ABD7DEB3E2331EEAA09D02FCA977EFC91858B1420F284FBA154C9684A002B0509CE3E6CB9470DE9A8145B6101C5"进行加密,得到签名结果的加密数据为:
"XCReY4BvLP2URJdDAdCnXvJcFAB0Gq+FtnalK4xOFl0BlyaYqdbyFggAutRHcTdIsaS9gDJL7LgC0QMAOxCaSz602S4R78F0lsE2NpjQW+grZjmC3rtn1AgCHVoYVbv6pRYbfKzNw+NhzJrysCaL2cycQLpUoNNmf0dUIXlHFoOTAhPjB4bxlwGhqkqoZM+KuoLFXgyawDl/bhLK+G4WtXZER8dfPwR55JFP4Amcd7YS9lYrLUMVGz19P704YG0l+FEZwNdzwj9z6hayQW2kEyNA0umver196z4jMe6qCdAvypd+/JGFixQg8oT7oVTJaEoAKwUJzj5suUcN6agUW2EBxQ==";
当接收的操作结果为公钥时,对公钥
30818902818100AC017998CEC50CF7D0F3CECBACFEF5E10BBB30CC7DE622F79A95546121D88A2C27A43D3DD8922495ED7E091A8C5B335C00FB5A2CF08BD8E5222939228133C15C4B5E63FBE6A111CA5AD9EA1FE3ED81C6D310A503E77B7DF30A60EEDE361AA0EC756D8C1331E9CCF0C85362BF30ADE591A3D2F1A084A530B9320AAF186D445DAB0203010001进行加密,得到公钥的加密数据为:
"MIGJAoGBAKwBeZjOxQz30PPOy6z+9eELuzDMfeYi95qVVGEh2IosJ6Q9PdiSJJXtfgkajFszXAD7Wizwi9jlIik5IoEzwVxLXmP75qERylrZ6h/j7YHG0xClA+d7ffMKYO7eNhqg7HVtjBMx6czwyFNivzCt5ZGj0vGghKUwuTIKrxhtRF2rAgMBAAE="。
相应地,步骤H14具体为:本地应用程序对接收的操作结果进行加密,生成加密数据,根据通讯标识和加密数据组织第二数据。
例如,根据签名结果的加密数据和通讯标识组织的第二数据为:sendData={"result":"XCReY4BvLP2URJdDAdCnXvJcFAB0Gq+FtnalK4xOFl0BlyaYqdbyFggAutRHcTdIsaS9gDJL7LgC0QMAOxCaSz602S4R78F0lsE2NpjQW+grZjmC3rtn1AgCHVoYVbv6pRYbfKzNw+NhzJrysCaL2cycQLpUoNNmf0dUIXlHFoOTAhPjB4bxlwGhqkqoZM+KuoLFXgyawDl/bhLK+G4WtXZER8dfPwR55JFP4Amcd7YS9lYrLUMVGz19P704YG0l+FEZwNdzwj9z6hayQW2kEyNA0umver196z4jMe6qCdAvypd+/JGFixQg8oT7oVTJaEoAKwUJzj5suUcN6agUW2EBxQ==","tabID":"4"};
根据公钥的加密数据和通讯标识组织的第二数据为:sendData={"result":"MIGJAoGBAKwBeZjOxQz30PPOy6z+9eELuzDMfeYi95qVVGEh2IosJ6Q9PdiSJJXtfgkajFszXAD7Wizwi9jlIik5IoEzwVxLXmP75qERylrZ6h/j7YHG0xClA+d7ffMKYO7eNhqg7HVtjBMx6czwyFNivzCt5ZGj0vGghKUwuTIKrxhtRF2rAgMBAAE=","tabID":"4"}。
步骤H15:本地应用程序通过通讯管道向扩展程序发送第二数据。
步骤H16:扩展程序通过本地应用程序监听接口接收本地应用程序通过通讯管道发送的第二数据。
具体地,扩展程序通过本地应用程序监听接口接收本地应用程序通过通讯管道发送的第二数据,并从本地应用程序监听接口的第二扩展函数中获取第二数据。
例如,扩展程序通过本地应用程序监听接口portToNativeHost.onMessage.addListener(onNativeMessage)接收本地应用程序通过通讯管道发送的第二数据,并从本地应用程序监听接口的第二扩展函数onNativeMessage(message)中获取第二数据,其中,第二数据为
message={"result":"5800000118","tabID":"4"},或
message={"result":"XCReY4BvLP2URJdDAdCnXvJcFAB0Gq+FtnalK4xOFl0BlyaYqdbyFggAutRHcTdIsaS9gDJL7LgC0QMAOxCaSz602S4R78F0lsE2NpjQW+grZjmC3rtn1AgCHVoYVbv6pRYbfKzNw+NhzJrysCaL2cycQLpUoNNmf0dUIXlHFoOTAhPjB4bxlwGhqkqoZM+KuoLFXgyawDl/bhLK+G4WtXZER8dfPwR55JFP4Amcd7YS9lYrLUMVGz19P704YG0l+FEZwNdzwj9z6hayQW2kEyNA0umver196z4jMe6qCdAvypd+/JGFixQg8oT7oVTJaEoAKwUJzj5suUcN6agUW2EBxQ==","tabID":"4"},或
message={"result":"MIGJAoGBAKwBeZjOxQz30PPOy6z+9eELuzDMfeYi95qVVGEh2IosJ6Q9PdiSJJXtfgkajFszXAD7Wizwi9jlIik5IoEzwVxLXmP75qERylrZ6h/j7YHG0xClA+d7ffMKYO7eNhqg7HVtjBMx6czwyFNivzCt5ZGj0vGghKUwuTIKrxhtRF2rAgMBAAE=","tabID":"4"}。
步骤H17:扩展程序根据第二数据中的通讯标识向浏览器发送第二数据。
具体地,扩展程序调用第五扩展函数根据第二数据中的通讯标识向浏览器发送第二数据。例如,五扩展函数如下:
chrome.tabs.sendMessage(tabID,message);
其中,chrome.tabs.sendMessage为第五扩展函数的函数名称,tabID为通讯标识,message第二数据在message中。
步骤H18:浏览器接收第二数据,并从第二数据中获取相应数据。
当步骤H1中浏览器调用的通讯参数为获取序列号指令数据时,步骤H18中浏览器接收的第二数据为:
event.data={"result":"5800000118","tabID":"4"},从第二数据中获取的相应数据为:sn=5800000118;
当步骤H1中浏览器调用的通讯参数为签名指令数据时,步骤H18中浏览器接收的第二数据为:
event.data={"result":"XCReY4BvLP2URJdDAdCnXvJcFAB0Gq+FtnalK4xOFl0BlyaYqdbyFggAutRHcTdIsaS9gDJL7LgC0QMAOxCaSz602S4R78F0lsE2NpjQW+grZjmC3rtn1AgCHVoYVbv6pRYbfKzNw+NhzJrysCaL2cycQLpUoNNmf0dUIXlHFoOTAhPjB4bxlwGhqkqoZM+KuoLFXgyawDl/bhLK+G4WtXZER8dfPwR55JFP4Amcd7YS9lYrLUMVGz19P704YG0l+FEZwNdzwj9z6hayQW2kEyNA0umver196z4jMe6qCdAvypd+/JGFixQg8oT7oVTJaEoAKwUJzj5suUcN6agUW2EBxQ==","tabID":"4"},从第二数据中获取的相应数据为签名结果:
signData=XCReY4BvLP2URJdDAdCnXvJcFAB0Gq+FtnalK4xOFl0BlyaYqdbyFggAutRHcTdIsaS9gDJL7LgC0QMAOxCaSz602S4R78F0lsE2NpjQW+grZjmC3rtn1AgCHVoYVbv6pRYbfKzNw+NhzJrysCaL2cycQLpUoNNmf0dUIXlHFoOTAhPjB4bxlwGhqkqoZM+KuoLFXgyawDl/bhLK+G4WtXZER8dfPwR55JFP4Amcd7YS9lYrLUMVGz19P704YG0l+FEZwNdzwj9z6hayQW2kEyNA0umver196z4jMe6qCdAvypd+/JGFixQg8oT7oVTJaEoAKwUJzj5suUcN6agUW2EBxQ==;
当步骤H1中浏览器调用的通讯参数为读公钥指令数据时,步骤H18中浏览器接收的第二数据为:
event.data={"result":"MIGJAoGBAKwBeZjOxQz30PPOy6z+9eELuzDMfeYi95qVVGEh2IosJ6Q9PdiSJJXtfgkajFszXAD7Wizwi9jlIik5IoEzwVxLXmP75qERylrZ6h/j7YHG0xClA+d7ffMKYO7eNhqg7HVtjBMx6czwyFNivzCt5ZGj0vGghKUwuTIKrxhtRF2rAgMBAAE=","tabID":"4"},从第二数据中获取的相应数据为公钥:pubkey=MIGJAoGBAKwBeZjOxQz30PPOy6z+9eELuzDMfeYi95qVVGEh2IosJ6Q9PdiSJJXtfgkajFszXAD7Wizwi9jlIik5IoEzwVxLXmP75qERylrZ6h/j7YHG0xClA+d7ffMKYO7eNhqg7HVtjBMx6czwyFNivzCt5ZGj0vGghKUwuTIKrxhtRF2rAgMBAAE=。
可选地,在本实施例中,扩展程序还包括前端,相应地,上述步骤H17之前扩展程序执行的操作为扩展程序的后台执行,上述步骤H17中,扩展程序根据第二数据中的通讯标识将第二数据发送给浏览器,具体为:扩展程序的后台根据第二数据中的通讯标识将第二数据发送给扩展程序的前端,扩展前端将第二数据发送给浏览器;
相应地,上述步骤H3之前还包括:扩展程序注册扩展消息监听接口;
上述扩展程序的后台根据第二数据中的通讯标识将第二数据发送给扩展程序的前端,前端将第二数据发送给浏览器,具体为:后台根据第二数据中的通讯标识将第二数据发送给前端,前端通过扩展消息监听接口监听到第二数据,并将第二数据发送给浏览器。更具体地,扩展程序的前端将第二数据发送给浏览器,具体为:扩展程序的前端调用第六扩展函数将第二数据发送给浏览器。例如,第六扩展函数为:window.postMessage(message,"*"),其中,message中包括第二数据。
具体地,上述扩展程序注册扩展消息监听接口,具体为:扩展程序将扩展消息函数注册为扩展消息监听接口。更具体地,扩展程序调用消息注册函数,将扩展消息函数注册为扩展消息监听接口。
例如,扩展消息函数为:function(message,sender,sendResponse)
消息注册函数为:chrome.runtime.onMessage.addListener
注册得到的扩展消息监听接口为:
chrome.runtime.onMessage.addListener(function(message,sender,sendResponse));
其中,function为扩展消息函数的名称,data、sender和sendResponse为扩展消息函数的参数。扩展消息函数名称可以变,扩展消息函数的参数形式不变,但参数名称可以改变。其中,data包括中包括第二数据,sender中包括第二数据中的通讯标识。
本实施例中,上述步骤H3中还包括,系统根据扩展标识找到对应的扩展程序的配置文件,检测来自浏览器的网址是否与扩展程序的配置文件中的网址匹配,是则继续,否则结束。
例如,扩展程序的配置文件内容如下:
系统检测来自浏览器的网址是否与"matches"中的其中任一个网址相匹配,如果匹配则执行步骤H3,否则结束。例如,接收的网址为*://*.dccnet.com.cn/*"时,则匹配;接收的网址为*://*.baidu.com.cn/*"时,则不匹配。
实施例3
本实施例提供一种实现浏览器访问智能密钥设备的方法,应用于包括浏览器、扩展程序、本地应用程序和智能密钥设备的系统。如图3所示,包括:
步骤300:扩展程序注册长链接请求监听接口;
具体地,浏览器启动时,扩展程序将第一扩展函数注册为长链接请求监听接口。更具体地,浏览器启动时,扩展程序调用第一系统函数将第一扩展函数注册为长链接请求监听接口。
例如,第一扩展函数为:function(port2Web),port2Web;
第一系统函数为:chrome.runtime.onConnectExternal.addListener;
扩展程序注册得到的长链接请求监听接口为:chrome.runtime.onConnectExternal.addListener(function(port2Web)。
步骤301:浏览器根据扩展标识组织长链接请求,得到长链接的第一端口类,根据第一端口类注册扩展程序监听接口;
具体地,浏览器调用第二系统函数并根据扩展标识组织长链接请求,得到长链接的第一端口类,根据第一端口类将第二扩展函数类注册为扩展程序监听接口。
例如,浏览器组织的长链接请求为:
varwebport=chrome.runtime.connect(ExtID);
其中,chrome.runtime.connect为第二系统函数,ExtID为扩展标识,webport为得到的第一端口类,ExtID="qfdykbmfjccjpaijgjjdnkghpdpnakef"。浏览器中安装扩展程序安装时,自动保存扩展标识。
具体地,浏览器根据第一端口类将第二扩展函数注册为扩展程序监听接口,具体为:浏览器根据第一端口类,调用将第三系统函数将第二扩展函数注册为扩展程序监听接口。
例如,第三系统函数为:webport.onMessage.addListener;
第二扩展函数为:OnRecvExtMsg;
注册得到的扩展程序监听接口为:
webport.onMessage.addListener(OnRecvExtMsg)。
步骤302:浏览器根据扩展标识向扩展程序发送长链接请求。
步骤303:扩展程序通过长链接请求监听接口监听到来自浏览器的长链接请求,获取长链接的第二端口类。具体地,获取长链接的第二端口类具体为:从长链接的监听接口中获取长链接的第二端口类。
例如,扩展程序通过长链接请求监听接口chrome.runtime.onConnectExternal.addListener(function(port2Web)监听到来自浏览器的长链接请求varwebport=chrome.runtime.connect(ExtID)。
获取的第二端口类为:g_port2Web=port2Web。
步骤304:扩展程序根据第二端口类注册浏览器监听接口。
具体地,扩展程序根据第二端口类将第三扩展函数注册为浏览器监监听函数。更具体地,扩展程序根据第二端口类,调用第四系统函数将第三扩展函数注册为浏览器监听接口。
例如,第三扩展函数为:RecvWebMsg;
第四系统函数为:g_port2Web.onMessage.addListener
注册得到的浏览器监听接口为:
g_port2Web.onMessage.addListener(RecvWebMsg)。
扩展程序可以通过浏览器监听接口g_port2Web.onMessage.addListener(RecvWebMsg)监听来自浏览器的数据。
步骤305:浏览器调用相关通讯参数,根据通讯参数组织第一数据。
具体地,步骤305与实施例2中步骤H2相同,在此不再赘述。
步骤306:浏览器通过长链接第一端口类向扩展程序发送第一数据;
具体地,浏览器根据长链接的第一端口类调用第六系统函数,将第一数据发送给扩展程序。
例如,根据长链接的第一端口类调用第六系统函数webport.postMessage(cmdMsg)将第一数据发送给扩展程序,其中,cmdMsg中包括第一数据。
步骤307:扩展程序通过浏览器监听接口接收第一数据;
具体地,扩展程序通过浏览器监听接口监听来自浏览器的第一数据,并从浏览器监听接口的第三扩展函数中获取第一数据。
例如,扩展通过浏览器监听接口
g_port2Web.onMessage.addListener(RecvWebMsg)监听来自浏览器的第一数据,并从浏览器监听接口的第三扩展函数RecvWebMsg中获取第一数据。
例如,第一数据中的通讯参数为签名指令数据时,获取的第一数据Msg={"cmd":"USBSign","hashAlg":"SHA1","textData":"1234"};
第一数据中的通讯参数为读公钥指令数据时,获取的第一数据Msg={"cmd":"GetPublicKey"};
第一数据中的通讯参数为获取序列号指令数据时,获取的第一数据Msg={"cmd":"GetSerialNumber"}。
步骤308:扩展程序判断与本地应用程序的连接是否有效,如果是则执行步骤311,否则执行步骤309。
具体地,扩展程序判断第三端口类g_port2Web是否为空,如果为空,则端口类无效,即扩展程序与本地应用程序没有建立连接;如果不为空,则端口类有效,即扩展程序与本地应用程序已经建立连接。
步骤309:扩展程序根据自身保存的位置标识建立与本地应用程序的通讯管道,连接到本地应用程序,获取端口类。
可选地,步骤309中,扩展程序根据自身保存的位置标识建立与本地应用程序的通讯管道,具体包括:
步骤a1:扩展程序根据自身保存的位置标识找到本地应用程序的配置文件,并解析配置文件,得到本地应用程序的路径;
步骤a2:扩展程序根据本地应用程序的路径建立与本地应用程序的通讯管道。
例如,步骤a2中,扩展程序建立与本地应用程序的通讯管道之后,获取的端口类如下:g_port2Host=chrome.runtime.connectNative("com.google.chrome.test.ft")。
可选地,步骤a1中,扩展程序根据自身保存的位置标识找到本地应用程序的配置文件,具体为:扩展程序根据自身保存的位置标识在配置文件目录中找到配置文件。其中,配置文件目录在本地计算机安装浏览器时生成。
更具体地,配置文件中包括本地应用程序名称、本地应用程序的路径、通讯管道类型和扩展标识。
以苹果系统为例对步骤a1进行说明,扩展程序根据自身保存的位置标识com.my_company.my_application.json在配置文件目录
/Library/Google/Chrome/NativeMessagingHosts/com.my_company.my_application.json中找到配置文件。例如,配置文件内容如下:
"name":"com.my_company.my_application.json"//本地应用程序名称;
"path":"nativeConsole.exe"//本地应用程序的路径;
"type":"stdio"//通讯管道类型
"allowed_origins":["chrome-extension://knldjmfmopnpolahpmmgbagdohdnhkik/"]//扩展标识;
扩展程序解析配置文件后得到本地应用程序的路径nativeConsole.exe。
以Linux系统为例对步骤a1进行说明,扩展程序根据自身保存的位置标识com.my_company.my_application.json在配置文件目录
/etc/opt/chrome/native-messaging-hosts/com.my_company.my_application.json中找到配置文件;例如,配置文件内容如下:
"name":"com.my_company.my_application.json"//本地应用程序名称
"path":"nativeConsole.exe"//本地应用程序的路径
"type":"stdio"//通讯管道类型
"allowed_origins":
["chrome-extension://knldjmfmopnpolahpmmgbagdohdnhkik/"]//扩展标识
扩展程序解析配置文件后得到本地应用程序的路径nativeConsole.exe。
可选地,上述步骤a1具体包括:
步骤a11:扩展程序根据自身保存的位置标识找到本地应用程序的配置文件位置;
具体地,扩展程序根据自身保存的位置标识在注册表的浏览器安装路径中找到本地应用程序的配置文件位置;
以windows系统为例对步骤a11进行说明,扩展程序根据自身保存的位置标识com.google.chrome.ft在注册表的浏览器安装路径中找到本地应用程序的配置文件位置,例如,配置文件位置为:
HKEY_LOCAL_MACHINE\SOFTWARE\Google\Chrome\NativeMessagingHosts\com.google.chrome.ft。
步骤a12:扩展程序根据配置文件位置连接到本地应用程序的配置文件,并解析配置文件,得到本地应用程序的路径;
具体地,扩展程序根据配置文件位置连接到本地应用程序的配置文件,具体为:扩展程序根据配置文件位置中记录的配置文件路径连接到本地应用程序的配置文件,例如,配置文件位置
HKEY_LOCAL_MACHINE\SOFTWARE\Google\Chrome\NativeMessagingHosts\com.google.chrome.ft中记录的配置文件路径为:
C:\ProgramFiles\EbankTools\EbankPlugin\com.icbc.FT.usbkey.newchrome-win.json。
例如,根据配置文件路径连接到的本地应用程序的配置文件内容如下:
"name":"com.my_company.my_application.json"//本地应用程序名称
"path":"nativeConsole.exe"//本地应用程序的路径
"type":"stdio"//通讯管道类型
"allowed_origins":
["chrome-extension://knldjmfmopnpolahpmmgbagdohdnhkik/"]//扩展标识。
步骤310:扩展程序根据端口类注册本地应用程序监听接口。
具体地,扩展程序根据端口类将第四扩展函数注册为本地应用程序监听接口。更具体地,扩展程序根据端口类调用第五系统函数,将第四扩展函数注册为本地应用程序监听接口。
例如,第四扩展函数为:OnNativeMessage,
第五系统函数为:g_port2Host.onMessage.addListener;
扩展程序根据端口类g_port2Host注册的本地应用程序监听接口为:g_port2Host.onMessage.addListener(OnNativeMessage)。
可选地,步骤310中,还包括:扩展程序根据端口类注册终止响应监听接口;具体地,扩展程序根据端口类将第五扩展函数注册为终止响应监听接口;更具体地,扩展程序根据端口类调用第六注册函数,将第五扩展函数注册为终止响应监听监听接口。
例如,第五扩展函数为:WebDisconnect;
第六系统函数为:g_port2Host.onDisconnect.addListener;
扩展程序根据端口类g_port2Host注册得到的终止响应监听接口为:g_port2Host.onDisconnect.addListener(WebDisconnect)。
当本地应用程序与扩展程序连接异常(连接失败或者中途断开)时,扩展程序会调用终止响应监听接口,同时扩展程序组织异常数据,并将异常数据返回浏览器。
本实施例中,步骤310之后、步骤312之前还包括:系统判断扩展程序与本地应用程序是否成功建立连接,当系统判断扩展程序没有与本地应用程序成功建立连接时,调用终止响应监听接口。终止响应监听接口被调用后,扩展程序组织异常数据并根据通讯标识返回浏览器,浏览器接收到异常数据后根据异常数据显示异常信息。
本实施例中,上述步骤310之后、步骤312之前还包括:系统检测配置文件的内容是否正确,当系统检测配置文件的内容不正确时,调用终止响应监听接口,扩展程序组织异常数据并通过通讯标识将异常数据返回浏览器。
可选地,系统检测配置文件的内容是否正确,具体包括:系统检测配置文件中的本地应用程序的名称是否与位置标识一致,是则正确,否则不正确。
可选地,系统检测配置文件的内容是否正确,具体包括:系统检测配置文件中的扩展标识是否正确,是则正确,否则不正确。更具体地,系统检测配置文件中的扩展标识是否为默认的扩展标识,是则正确,否则不正确。
步骤311:扩展程序通过通讯管道向本地应用程序发送第一数据。
具体地,扩展程序调用第六扩展函数通过通讯管道将第一数据发送给本地应用程序。
例如,第六扩展函数为:sendMsgToHost(msg),其中,msg={"cmd":"GetSerialNumber"},或
Msg={"cmd":"USBSign","hashAlg":"SHA1","textData":"1234"},或Msg={"cmd":"GetPublicKey"}。
步骤312:本地应用程序解析第一数据得到通讯参数。
例如,解析得到的通讯参数"cmd":"GetSerialNumber"为获取序列号指令数据;通讯参数"cmd":"USBSign","hashAlg":"SHA1","textData":"1234"为签名指令数据;通讯参数"cmd":"GetPublicKey"为读公钥指令数据。
步骤313:本地应用程序根据通讯参数调用智能密钥设备的驱动接口向智能密钥设备发送相应指令。
具体地,本地应用程序根据通讯指令的类型调用智能密钥设备的驱动接口将第一指令发送给智能密钥设备。
例如,当通讯参数为签名指令数据"cmd":"USBSign","hashAlg":"SHA1","textData":"1234"时,本地应用程序根据签名指令数据调用智能密钥设备的驱动接口,向智能密钥设备发送签名指令;
当通讯参数为读公钥指令数据"cmd":"GetPublicKey"时,本地应用程序根据读公钥指令数据调用智能密钥设备的驱动接口,向智能密钥设备发送读公钥指令;
当通讯参数为获取序列号指令数据"cmd":"GetSerialNumber"时,本地应用程序根据获取序列号指令数据调用智能密钥设备的驱动接口,向智能密钥设备发送获取序列号指令。
步骤314:智能密钥设备执行相应指令得到操作结果;
当智能密钥设备执行签名指令时,得到的操作结果为签名结果,例如签名结果如下:
"5C245E63806F2CFD9444974301D0A75EF25C1400741AAF85B676A52B8C4E165D01972698A9D6F2160800BAD447713748B1A4BD80324BECB802D103003B109A4B3EB4D92E11EFC17496C1363698D05BE82B663982DEBB67D408021D5A1855BBFAA5161B7CACCDC3E361CC9AF2B0268BD9CC9C40BA54A0D3667F47542179471683930213E30786F19701A1AA4AA864CF8ABA82C55E0C9AC0397F6E12CAF86E16B5764447C75F3F0479E4914FE0099C77B612F6562B2D43151B3D7D3FBD38606D25F85119C0D773C23F73EA16B2416DA4132340D2E9AF7ABD7DEB3E2331EEAA09D02FCA977EFC91858B1420F284FBA154C9684A002B0509CE3E6CB9470DE9A8145B6101C5";
当智能密钥设备执行读公钥指令时,得到的操作结果为公钥,例如得到的公钥如下:
30818902818100AC017998CEC50CF7D0F3CECBACFEF5E10BBB30CC7DE622F79A95546121D88A2C27A43D3DD8922495ED7E091A8C5B335C00FB5A2CF08BD8E5222939228133C15C4B5E63FBE6A111CA5AD9EA1FE3ED81C6D310A503E77B7DF30A60EEDE361AA0EC756D8C1331E9CCF0C85362BF30ADE591A3D2F1A084A530B9320AAF186D445DAB0203010001;
当智能密钥设备执行获取序列号指令时,得到的操作结果为序列号,例如得到的序列号为:5800000118。
步骤315:智能密钥设备向本地应用程序发送操作结果;
步骤316:本地应用程序根据接收的操作结果组织第二数据;
例如,第二数据为:sendData={"result":"5600000116","tabID":"4"}。
本地应用程序根据通讯标识和接收的操作结果组织第二数据;
具体地,本地应用程序将接收的操作结果组织到预设结构体中,得到第二数据。
例如,当接收的操作结果为序列号时,根据序列号组织的第二数据为:
sendData={"result":"5800000118"}。
可选地,步骤316中,还包括:本地应用程序对操作结果进行加密,生成加密数据;
例如,当接收的操作结果为签名结果时,对签名结果
"5C245E63806F2CFD9444974301D0A75EF25C1400741AAF85B676A52B8C4E165D01972698A9D6F2160800BAD447713748B1A4BD80324BECB802D103003B109A4B3EB4D92E11EFC17496C1363698D05BE82B663982DEBB67D408021D5A1855BBFAA5161B7CACCDC3E361CC9AF2B0268BD9CC9C40BA54A0D3667F47542179471683930213E30786F19701A1AA4AA864CF8ABA82C55E0C9AC0397F6E12CAF86E16B5764447C75F3F0479E4914FE0099C77B612F6562B2D43151B3D7D3FBD38606D25F85119C0D773C23F73EA16B2416DA4132340D2E9AF7ABD7DEB3E2331EEAA09D02FCA977EFC91858B1420F284FBA154C9684A002B0509CE3E6CB9470DE9A8145B6101C5"进行加密,得到签名结果的加密数据为:
"XCReY4BvLP2URJdDAdCnXvJcFAB0Gq+FtnalK4xOFl0BlyaYqdbyFggAutRHcTdIsaS9gDJL7LgC0QMAOxCaSz602S4R78F0lsE2NpjQW+grZjmC3rtn1AgCHVoYVbv6pRYbfKzNw+NhzJrysCaL2cycQLpUoNNmf0dUIXlHFoOTAhPjB4bxlwGhqkqoZM+KuoLFXgyawDl/bhLK+G4WtXZER8dfPwR55JFP4Amcd7YS9lYrLUMVGz19P704YG0l+FEZwNdzwj9z6hayQW2kEyNA0umver196z4jMe6qCdAvypd+/JGFixQg8oT7oVTJaEoAKwUJzj5suUcN6agUW2EBxQ==";
当接收的操作结果为公钥时,对公钥
30818902818100AC017998CEC50CF7D0F3CECBACFEF5E10BBB30CC7DE622F79A95546121D88A2C27A43D3DD8922495ED7E091A8C5B335C00FB5A2CF08BD8E5222939228133C15C4B5E63FBE6A111CA5AD9EA1FE3ED81C6D310A503E77B7DF30A60EEDE361AA0EC756D8C1331E9CCF0C85362BF30ADE591A3D2F1A084A530B9320AAF186D445DAB0203010001进行加密,得到公钥的加密数据为:
"MIGJAoGBAKwBeZjOxQz30PPOy6z+9eELuzDMfeYi95qVVGEh2IosJ6Q9PdiSJJXtfgkajFszXAD7Wizwi9jlIik5IoEzwVxLXmP75qERylrZ6h/j7YHG0xClA+d7ffMKYO7eNhqg7HVtjBMx6czwyFNivzCt5ZGj0vGghKUwuTIKrxhtRF2rAgMBAAE="。
相应地,步骤316具体为:本地应用程序对接收的操作结果进行加密,生成加密数据,根据加密数据组织第二数据。
例如,根据签名结果的加密数据组织的第二数据为:sendData={"result":"XCReY4BvLP2URJdDAdCnXvJcFAB0Gq+FtnalK4xOFl0BlyaYqdbyFggAutRHcTdIsaS9gDJL7LgC0QMAOxCaSz602S4R78F0lsE2NpjQW+grZjmC3rtn1AgCHVoYVbv6pRYbfKzNw+NhzJrysCaL2cycQLpUoNNmf0dUIXlHFoOTAhPjB4bxlwGhqkqoZM+KuoLFXgyawDl/bhLK+G4WtXZER8dfPwR55JFP4Amcd7YS9lYrLUMVGz19P704YG0l+FEZwNdzwj9z6hayQW2kEyNA0umver196z4jMe6qCdAvypd+/JGFixQg8oT7oVTJaEoAKwUJzj5suUcN6agUW2EBxQ=="};
根据公钥的加密数据组织的第二数据为:sendData={"result":"MIGJAoGBAKwBeZjOxQz30PPOy6z+9eELuzDMfeYi95qVVGEh2IosJ6Q9PdiSJJXtfgkajFszXAD7Wizwi9jlIik5IoEzwVxLXmP75qERylrZ6h/j7YHG0xClA+d7ffMKYO7eNhqg7HVtjBMx6czwyFNivzCt5ZGj0vGghKUwuTIKrxhtRF2rAgMBAAE="}。
步骤317:本地应用程序通过通讯管道向扩展程序发送第二数据。
步骤318:扩展程序通过本地应用程序监听接口接收本地应用程序通过通讯管道发送的第二数据。
具体地,扩展程序通过本地应用程序监听接口接收本地应用程序通过通讯管道发送的第二数据,并从本地应用程序监听接口的第四扩展函数中获取第二数据。
例如,扩展程序通过本地应用程序监听接口
g_port2Host.onMessage.addListener(OnNativeMessage)接收本地应用程序通过通讯管道发送的第二数据,并从本地应用程序监听接口的第四扩展函数onNativeMessage(message)中获取第二数据,其中,第二数据为
message={"result":"5800000118","tabID":"4"},或
message={"result":"XCReY4BvLP2URJdDAdCnXvJcFAB0Gq+FtnalK4xOFl0BlyaYqdbyFggAutRHcTdIsaS9gDJL7LgC0QMAOxCaSz602S4R78F0lsE2NpjQW+grZjmC3rtn1AgCHVoYVbv6pRYbfKzNw+NhzJrysCaL2cycQLpUoNNmf0dUIXlHFoOTAhPjB4bxlwGhqkqoZM+KuoLFXgyawDl/bhLK+G4WtXZER8dfPwR55JFP4Amcd7YS9lYrLUMVGz19P704YG0l+FEZwNdzwj9z6hayQW2kEyNA0umver196z4jMe6qCdAvypd+/JGFixQg8oT7oVTJaEoAKwUJzj5suUcN6agUW2EBxQ==","tabID":"4"},或
message={"result":"MIGJAoGBAKwBeZjOxQz30PPOy6z+9eELuzDMfeYi95qVVGEh2IosJ6Q9PdiSJJXtfgkajFszXAD7Wizwi9jlIik5IoEzwVxLXmP75qERylrZ6h/j7YHG0xClA+d7ffMKYO7eNhqg7HVtjBMx6czwyFNivzCt5ZGj0vGghKUwuTIKrxhtRF2rAgMBAAE=","tabID":"4"}。
步骤319:扩展程序根据第二端口类向浏览器发送第二数据。
具体地,扩展程序根据第二端口类调用第七扩展函数向浏览器发送第二数据。例如,第七扩展函数如下:
g_port2Web.postMessage(msg);其中,第二数据在参数msg中。
步骤320:浏览器通过扩展程序监听接口接收来自扩展程序的第二数据,并从第二数据中获取相应数据。
具体地,浏览器通过扩展程序监听接口接收来自扩展程序的第二数据,从扩展程序监听接口的第二扩展函数中获取第二数据,从第二数据中获取相应数据。例如,浏览器通过扩展程序监听接口webport.onMessage.addListener(OnRecvExtMsg)接收来自扩展程序的第二数据。
当步骤305中浏览器调用的通讯参数为获取序列号指令数据时,步骤320中浏览器接收的第二数据为:
Msg=={"result":"5800000118"},从第二数据中获取的相应数据为:sn=5800000118;
当步骤305中浏览器调用的通讯参数为签名指令数据时,步骤320中浏览器接收的第二数据为:
Msg=={"result":"XCReY4BvLP2URJdDAdCnXvJcFAB0Gq+FtnalK4xOFl0BlyaYqdbyFggAutRHcTdIsaS9gDJL7LgC0QMAOxCaSz602S4R78F0lsE2NpjQW+grZjmC3rtn1AgCHVoYVbv6pRYbfKzNw+NhzJrysCaL2cycQLpUoNNmf0dUIXlHFoOTAhPjB4bxlwGhqkqoZM+KuoLFXgyawDl/bhLK+G4WtXZER8dfPwR55JFP4Amcd7YS9lYrLUMVGz19P704YG0l+FEZwNdzwj9z6hayQW2kEyNA0umver196z4jMe6qCdAvypd+/JGFixQg8oT7oVTJaEoAKwUJzj5suUcN6agUW2EBxQ=="},从第二数据中获取的相应数据为签名结果:
signData=XCReY4BvLP2URJdDAdCnXvJcFAB0Gq+FtnalK4xOFl0BlyaYqdbyFggAutRHcTdIsaS9gDJL7LgC0QMAOxCaSz602S4R78F0lsE2NpjQW+grZjmC3rtn1AgCHVoYVbv6pRYbfKzNw+NhzJrysCaL2cycQLpUoNNmf0dUIXlHFoOTAhPjB4bxlwGhqkqoZM+KuoLFXgyawDl/bhLK+G4WtXZER8dfPwR55JFP4Amcd7YS9lYrLUMVGz19P704YG0l+FEZwNdzwj9z6hayQW2kEyNA0umver196z4jMe6qCdAvypd+/JGFixQg8oT7oVTJaEoAKwUJzj5suUcN6agUW2EBxQ==;
当步骤305中浏览器调用的通讯参数为读公钥指令数据时,步骤320中浏览器接收的第二数据为:
Msg=={"result":"MIGJAoGBAKwBeZjOxQz30PPOy6z+9eELuzDMfeYi95qVVGEh2IosJ6Q9PdiSJJXtfgkajFszXAD7Wizwi9jlIik5IoEzwVxLXmP75qERylrZ6h/j7YHG0xClA+d7ffMKYO7eNhqg7HVtjBMx6czwyFNivzCt5ZGj0vGghKUwuTIKrxhtRF2rAgMBAAE="},从第二数据中获取的相应数据为公钥:pubkey=MIGJAoGBAKwBeZjOxQz30PPOy6z+9eELuzDMfeYi95qVVGEh2IosJ6Q9PdiSJJXtfgkajFszXAD7Wizwi9jlIik5IoEzwVxLXmP75qERylrZ6h/j7YHG0xClA+d7ffMKYO7eNhqg7HVtjBMx6czwyFNivzCt5ZGj0vGghKUwuTIKrxhtRF2rAgMBAAE=。
可选地,在步骤304之后、步骤306之前,还包括
步骤D1:扩展程序根据自身保存的位置标识建立与本地应用程序的通讯管道,连接到本地应用程序,获取端口类,根据端口类注册本地应用程序监听接口。
步骤D1参考本实施例中步骤309-310,在此不再赘述。
可选地,在步骤D1之前,还包括,扩展程序判断与本地应用程序的连接是否有效,是则通过浏览器监听接口等待接收来自浏览器的第一数据,否则执行步骤D1。
扩展程序判断与本地应用程序的连接是否有效具体参考上述步骤308,在此不再赘述。
本实施例中,上述步骤306中还包括,系统根据扩展标识找到对应的扩展程序的配置文件,检测来自浏览器的网址是否与扩展程序的配置文件中的网址匹配,是则继续,否则结束。
例如,扩展程序的配置文件内容如下:
系统检测来自浏览器的网址是否与"matches"中的其中任一个网址相匹配,如果匹配则执行步骤H3,否则结束。例如,接收的网址为*://*.dccnet.com.cn/*"时,则匹配;接收的网址为*://*.baidu.com.cn/*"时,则不匹配。
实施例4
本实施例提供一种实现浏览器访问智能密钥设备的系统,如图4所示,包括扩展程序1和本地应用程序2;
扩展程序1包括:
第一接收模块11,用于接收来自浏览器的第一数据;
第一发送模块12,用于将第一接收模块11接收的第一数据发送给本地应用程序;
第二接收模块13,用于接收来自本地应用程序的第二数据;
第二发送模块14,用于将第二接收模块13接收的第二数据发送给浏览器;
本地应用程序2包括:
第三接收模块21:用于接收来自扩展程序的第一数据;
解析模块22,用于解析第一数据得到通讯参数;
第三发送模块23,用于根据解析模块22得到的通讯参数调用智能密钥设备的驱动接口,向智能密钥设备发送相应指令;
第四接收模块24,用于接收智能密钥设备返回的操作结果;
组织模块25,用于根据第四接收模块24接收的操作结果组织第二数据;
第四发送模块26,用于将组织模块25组织的第二数据发送给扩展程序。
可选地,上述系统中,扩展程序1还包括连接模块;
连接模块,用于在第一发送模块12将第一数据发送给本地应用程序2之前,与本地应用程序建立连接。
可选地,上述系统中,扩展程序1还包括第一注册模块;
第一注册模块,用于在第一接收模块11接收来自浏览器的第一数据之前,注册浏览器监听接口;
具体地,第一注册模块具体用于根据长链接的第二端口类注册浏览器监听接口。
相应地,上述第一接收模块11,具体用于通过浏览器监听接口接收来自浏览器的第一数据。
进一步地,上述扩展程序1在包括第一接收模块11、第一发送模块12、第二接收模块13、第二发送模块14和第一注册模块的基础上,还包括第五接收模块;
第五接收模块,用于在第一注册模块根据长链接的第二端口类注册浏览器监听接口之前,通过长链接请求监听接口监听来自浏览器的长链接请求,获取长链接的第二端口类;
相应地,第二发送模块14,具体用于根据第五接收模块获取的长链接的第二端口类将第二接收模块13接收的第二数据返回浏览器。
进一步地,上述系统中,扩展程序1在包括第一接收模块11、第一发送模块12、第二接收模块13、第二发送模块14、第一注册模块的基础上,还包括连接模块,连接模块用于在第一注册模块根据长链接的第二端口类注册浏览器监听接口之后、第一接收模块11接收第一数据之前,与本地应用程序建立连接;
或者,连接模块用于在第一接收模块11接收第一数据之后、第一发送模块12将第一数据发送给本地应用程序2之前,与本地应用程序建立连接。
可选地,上述系统中,扩展程序1在包括第一接收模块11、第一发送模块12、第二接收模块13、第二发送模块14和连接模块的基础上,或者在包括第一接收模块11、第一发送模块12、第二接收模块13、第二发送模块14、第一注册模块和连接模块的基础上,还包括保存模块,
保存模块,用于保存位置标识;
上述连接模块用于与本地应用程序建立连接,具体用于根据保存模块保存的位置标识建立与本地应用程序的通讯管道,连接到本地应用程序。
具体地,上述连接模块,包括第一连接模块和第二连接模块;
第一连接模块,用于根据保存模块保存的位置标识找到本地应用程序的配置文件,并解析配置文件,得到本地应用程序的路径;
具体地,第一连接模块,具体用于根据保存模块保存的位置标识找到本地应用程序的配置文件的位置;根据配置文件的位置连接到本地应用程序的配置文件,并解析配置文件,得到本地应用程序的路径;
第二连接模块,用于根据本地应用程序的路径建立与本地应用程序的通讯管道;
相应地,第一发送模块12,具体用于通过通讯管道将第一数据发送给本地应用程序1;
第四发送模块26,具体用于通过通讯管道将组织模块组织的第二数据发送给扩展程序。
进一步地,上述系统中,扩展程序1在包括第一接收模块11、第一发送模块12、第二接收模块13、第二发送模块14、连接模块和保存模块的基础上,或者扩展程序在包括第一接收模块11、第一发送模块12、第二接收模块13、第二发送模块14、第一注册模块、连接模块和保存模块的基础上,还包括第二注册模块;
上述连接模块中的第二连接模块,还用于获取端口类;
第二注册模块,用于根据端口类注册本地应用程序监听接口;
相应地,第二接收模块13,具体用于通过本地应用程序监听接口接收本地应用程序2通过通讯管道发送的第二数据。
可选地,上述系统中,扩展程序1在包括第一接收模块11、第一发送模块12、第二接收模块13、第二发送模块14、第一注册模块和连接模块的基础上,还包括判断模块,
判断模块,用于在连接模块与本地应用程序2建立连接之前,判断与本地应用程序2的连接是否有效;
相应地,上述连接模块,具体用于当判断模块判断与本地应用程序的连接无效时,与本地应用程序建立连接。
可选地,上述系统中,扩展程序1在包括第一接收模块11、第一发送模块12、第二接收模块13、第二发送模块14和连接模块的基础上,还包括判断模块;
判断模块,用于在连接模块与本地应用程序建立连接之前,判断与本地应用程序的连接是否有效;
相应地,上述连接模块,具体用于当判断模块判断与本地应用程序的连接无效时,与本地应用程序2建立连接;
上述第一发送模块12,具体用于当判断模块判断与本地的连接有效时,将第一数据发送给本地应用程序2。
具体地,上述判断模块具体用于判断端口类是否为空,如果是,则扩展程序与本地应用程序的连接无效;否则,扩展程序与本地应用程序的连接有效。
可选地,上述系统中,第一接收模块11,还用于接收来自浏览器的通讯标识;
相应地,上述第一发送模块12,具体用于将第一数据和通讯标识发送给本地应用程序2;
上述第三接收模块23,具体用于接收来自扩展程序1的第一数据和通讯标识;
上述组织模块25,具体用于根据第四接收模块24接收的操作结果和第三接收模块21接收的通讯标识组织第二数据;
上述第二发送模块14,具体用于根据第二数据中的通讯标识将第二数据发送给浏览器。
进一步地,上述系统中,扩展程序1还包括添加模块,
添加模块,用于将通讯标识添加到第一数据中;
相应地,上述第一发送模块12,具体用于在添加模块将通讯标识添加到第一数据之后,将第一数据发送给本地应用程序2。
进一步地,上述系统中,扩展程序1在包括添加模块的基础上,还包括前端,上述第一接收模块11、第一发送模块12、第二接收模块13和第二发送模块14属于扩展程序1的后台,
第二发送模块14,具体用于根据第二数据中的通讯标识将第二数据发送给前端;
前端,用于将第二数据发送给浏览器。
以上所述,仅为本发明的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应以权利要求的保护范围为准。