发明内容
本发明的目的在于提供一种集中安全管理USB Key解锁密钥的方法,解决上述现有技术的缺陷,对大量USB Key的解锁密钥进行集中安全的管理, 可以解决因固定解锁口令或解锁工具泄漏,而带来的安全问题。
本发明所解决的技术问题可以采用以下技术方案来实现:
一种集中安全管理USB Key解锁密钥的方法,其特征在于,它包括如下步骤:
1)通过加密机生成随机数作为解锁密钥;
2)USB Key在交付用户使用前,将步骤1)生成的解锁密钥,通过微软CSP接口扩展写入USB Key中;
3)将步骤1)生成的解锁密钥用加密机加密,同获取的USB Key的唯一标识一起,加密写入数据库中;
4)如果USB Key被锁定,通过USB Key的唯一标识找到对应的加密后的解锁密钥,再通过加密机解密后,通过微软CSP接口扩展,对USB Key进行口令解锁。
本发明的一个实施例中,在USB Key交付给用户使用前,为每个USB Key生成唯一的解锁密钥,同时保证该解锁密钥的安全存储,这个过程称为USBKey初始化过程;在需要解锁的时候,还需要能够通过该解锁密钥对USB Key进行解锁,即USB Key的PIN解锁过程
本发明的一个实施例中,所述CSP接口使用CryptGetProvParam函数获取USB Key信息,所述CSP接口使用CryptSetProvParam函数进行USB Key初始化,所述CSP接口使用CryptSetProvParam函数进行USB Key的PIN解锁。
本发明中的集中安全管理USB Key解锁密钥的方法的安全性由以下方面保证:
1、每个USB Key的解锁密钥,是由加密机生成的随机数,可保证每个USB Key的解锁密钥都各不相同,即使一个USB Key的解锁密钥偶然泄漏,也不会影响到其他;
2、USB Key的解锁密钥通过加密写入数据库中,在管理得当的前提下,可以确保解锁密钥不会被泄漏;
3、USB Key一旦被锁定,必须通过前述步骤中的数据库和加密机才能重新解锁,在管理得当的前提下,解锁的过程和方式都是安全的;
4、可以在分发大量USB Key设备时,确保各个USB Key解锁密钥的安全 性,并为后续USB Key使用过程中出现的锁定,提安全的解锁。
本发明的集中安全管理USB Key解锁密钥的方法,在USB Key交付给用户使用前,为每个USB Key生成唯一的解锁密钥,同时保证该解锁密钥的安全存储,在需要解锁的时候,还需要能够通过该解锁密钥对USB Key进行解锁;可以在分发大量USB Key设备时,确保各个USB Key解锁密钥的安全性,并为后续USB Key使用过程中出现的锁定,提安全的解锁,实现本发明的目的。
本发明的特点可参阅本案图式及以下较好实施方式的详细说明而获得清楚地了解。
具体实施方式
为了使本发明实现的技术手段、创作特征、达成目的与功效易于明白了解,下面结合具体图示,进一步阐述本发明。
如图1所示,本发明的集中安全管理USB Key解锁密钥的方法,它包括如下步骤:
1)通过加密机生成随机数作为解锁密钥;
2)USB Key在交付用户使用前,将步骤1)生成的解锁密钥,通过微软CSP接口扩展写入USB Key中;
3)将步骤1)生成的解锁密钥用加密机加密,同获取的USB Key的唯一标识一起,加密写入数据库中;
4)如果USB Key被锁定,通过USB Key的唯一标识找到对应的加密后的解锁密钥,再通过加密机解密后,通过微软CSP接口扩展,对USB Key进行口令解锁。
本发明的集中安全管理USB Key解锁密钥的方法在USB Key交付给用户使用前,为每个USB Key生成唯一的解锁密钥,同时保证该解锁密钥的安全 存储,这个过程称为初始化过程;在需要解锁的时候,还需要能够通过该解锁密钥对USB Key进行解锁,即解锁过程。
在USB Key的初始化过程中,在每一个USB Key交付给用户使用前,先通过加密机生成一个随机数作为解锁密钥,这个解锁密钥一方面通过表一中定义的CryptSetProvParam函数(参见dwParam是PP_INIT时的说明)参数传递下去,由CSP提供者实现写入USB Key中,另一方面会通过加密机加密后,写入数据库中。同时与解锁密钥一起写入的还有USB Key的序列号,是通过CryptGetProvParam(参见dwParam是PP_GETINFO时的说明)获取。
在USB Key锁定后的解锁过程中,首先通过CryptGetProvParam(参见dwParam是PP_GETINFO时的说明),获取USB Key的序列号,然后在数据库中查找到对应的加密后的解锁密钥,通过加密机加密后,将解锁密钥和新的口令通过表一中定义的CryptSetProvParam函数(参见dwParam是PP_RELOADPIN时的说明)参数传递下去,由CSP提供者根据解锁密钥,具体实现USB Key的解锁。
由于对USB Key解锁密钥的操作不是一个标准接口,为了方便对不同类型USB Key的初始化,需要一个统一的接口。本发明通过一个基于微软CSP的扩展接口来实现这一功能,具体见下面的CSP扩展接口描述。
算法标识定义
根据ALG_ID的定义规则,SM1(SCB2)属于块加密,这部分的ID从1~17已被占用,最大不能超过512。
//Block cipher sub ids
#define ALG_SID_SM1 102
#define ALG_SID_SSF33 103
#define CALG SM1(ALG CLASS DATA ENCRYPT|ALG TYPE BLOCK|ALG SID SM1)
#define CALG SSF33(ALG CLASS DATA ENCRYPT|ALG TYPEBLOCK|ALG SID SSF33)
#define CALG SM1 NAME“SM1”
#define CALG SSF3 3NAME“SSF33”
为在ASN.1结构中使用算法,还需要定义算法的OID,依据国密定义:
#define szOID SM1“1.2.156.197.1.102”
#define szOID SSF33“1.2.156.197.1.103”
CSP扩展接口包括如下三个函数:
1、获取USB Key信息
获取USB Key信息基于CryptGetProvParam函数。
BOOL WINAPI CryptGetProvParam(
HCRYPTPROV hProv,
DWORD dwParam,
BYTE*pbData,
DWORD*pdwDataLen,
DWORD dwFlags
);
dwParam
[in]增加获取USB Key信息的参数:PP_GETINFO
pbData
[in]放置返回的USB Key信息
返回数据以JSON格式定义,因为可能有多个USB Key同时存在,所以用JSON的array方式表示数据,其中的每个元素都代表一个USB Key信息。如下所示(假设有两个USB Key情况):
[
{
″model″:″SZD1000-A″,
″SN″:″00000000″,
″inited″:false
}
{
″model″:″SZD2000″,
″SN″:″00000001″,
″inited″:true
}
]
各个参数含义如下:
标识 |
数据类型 |
含义 |
model |
String |
USB Key产品型号 |
SN |
String |
USB Key的唯一序列号 |
inited |
Boolean |
USB Key是否做过初始化 |
2、USB Key初始化
USB Key初始化使用CryptSetProvParam函数:
BOOL WINAPI CryptSetProvParam(
HCRYPTPRO V hProy,
DWORD dwParam,
BYTE* pbData,
DWORD dwFlags
);
dwParam
[in]增加USB Key初始化参数PP_INIT
数值 |
含义 |
PP_INIT |
USB Key初始化,pbData中以JSON格式传递初始化参数 |
初始化参数以JSON格式定义,为避免歧义,所有Key值以Hexadecimal格式表示,如下所示:
{
″model″:″SZD1000-A″,
″SN″:″00000000″,
″reloadPinKey″:″31313131313131313131313131313131″,
″initPin″:″12345678″,
″minPinLen″:8,
″maxPinLen″:16,
″retryCount″:5
}
各个参数含义如下:
标识 |
数据类型 |
含义 |
SN |
String |
指定哪个USB Key需要初始化 |
reloadPinKey |
Hexadecimal |
初始化后的PIN解锁密钥 |
initPin |
String |
初始化后的PIN |
minPinLen |
Int |
初始化后PIN的最少位数 |
maxPinLen |
Int |
初始化后PIN的最大位数 |
retryCount |
Int |
初始化后PIN的错误计数,即最大尝试次数 |
USB Key要能够根据参数完成自身的初始化,返回参数依照CryptSetProvParam的定义,若有错误通过SetLastError设置。错误定义参见后面表。
3、USB Key的PIN解锁
USB Key的PIN解锁使用CryptSetProvParam函数:
BOOL WINAPI CryptSetProvParam(
HCRYPTPRO V hProv,
DWORD dwParam,
BYTE*pbData,
DWORD dwFlags
);
dwParam
[in]增加USB Key的PIN解锁参数PP_RELOADPIN
PIN解锁参数以JSON格式定义,如下所示:
{
″model″:″SZD1000-A″,
″SN″:″00000000″,
″reloadPinKey″:″31313131313131313131313131313131″,
″initPin″:″12345678″
}
各个参数含义如下:
标识 |
数据类型 |
含义 |
SN |
String |
指定哪个USB Key需要PIN解锁 |
reloadPinKey |
Hexadecimal |
PIN解锁密钥 |
initPin |
String |
解锁后的PIN |
USB Key要能够根据参数完成PIN解锁操作,并设置USB Key的PIN值为initPIN的值。返回参数依照CryptSetProvParam的定义,若有错误通过SetLastError设置。错误定义参见后面表。
相关常量定义
#define PP GETINFO 101
#define PP INIT 102
#define PP RELOADPIN 103
#define PP_CHANGEPIN 104
错误定义
错误号 |
含义 |
0xF0000001 |
设备无效 |
0xF0000002 |
设备读写错误 |
0xF0000003 |
设备验证失败 |
[0129]
0xF0000004 |
设备安全性错误 |
0xF0000005 |
设备空间不足 |
以上显示和描述了本发明的基本原理和主要特征和本发明的优点。本行业的技术人员应该了解,本发明不受上述实施例的限制,上述实施例和说明书中描述的只是说明本发明的原理,在不脱离本发明精神和范围的前提下,本发明还会有各种变化和改进,这些变化和改进都落入要求保护的本发明范围内,本发明要求保护范围由所附的权利要求书及其等效物界定。