发明内容
有鉴于此,本发明提供了一种生成本地密钥的方法,包括,
步骤1,客户端接收用户输入的用户口令,并以所述用户口令作为安全口令转换生成客户端密钥;
步骤2,客户端对用户信息进行签名,获得签名信息,并将所述用户信息、签名信息及客户端密钥发送给服务端;
步骤3,服务端接收客户端发送的信息并对所述签名信息进行验签,验签通过执行下一步;
步骤4,服务端随机生成随机密钥rk,发送给客户端,并存储客户端标识;
步骤5,客户端接收所述随机密钥rk,并将所述安全口令与所述随机密钥rk拼接后转换生成所述本地密钥。
其中,
所述客户端密钥由所述安全口令通过PBKDF类函数转换生成。
其中,
所述用户信息包括安全键盘配置参数uid、用户公钥、用户身份ID。
其中,
所述签名信息由所述用户信息以用户私钥签名获得。
其中,
步骤2中,所述用户信息、签名信息、客户端密钥采用服务端公钥加密发送至所述服务端;
步骤3中,所述服务端接收到客户端发送的信息后采用服务端私钥进行解密。
其中,
步骤4中,所述随机密钥rk采用客户端公钥加密发送至所述客户端;
步骤5中,所述客户端接收到所述随机密钥rk后采用客户端私钥进行解密。
其中,
所述客户端标识包括用户身份ID、用户公钥、客户端密钥、随机密钥rk。
其中,
所述本地密钥由所述安全口令和所述随机密钥rk拼接后通过PBKDF类函数转换生成。
其中,
客户端请求更新随机密钥rk时,进一步包括步骤,
客户端发送所述用户信息、签名信息、客户端密钥至服务端;服务端验证所述客户端密钥,验证通过生成新的随机密钥rk,并发送客户端。
其中,
客户端请求恢复随机密钥rk时,进一步包括步骤,
步骤200,客户端将所述客户端密钥、签名信息、用户信息、时间戳发送服务端;
步骤201,服务端接收客户端发送的信息并存储时间戳,并验证所述客户端密钥,验证通过后将所述随机密钥rk发送客户端。
其中,
步骤201中所述时间戳用于判断是否为恶意攻击,若同样请求时间戳超过预设时间,则所述服务端认定为恶意攻击。
其中,
步骤200中,客户端将所述客户端密钥、签名信息、用户信息、时间戳以服务端公钥加密发送服务端;
步骤201中,服务端接收客户端发送的消息并采用服务端私钥进行解密。
其中,
步骤201中,所述随机密钥rk以一随机数rand’作为密钥加密发送至客户端;所述随机数rand’由所述时间戳拼接随机数构成。
其中,
步骤1中,以所述用户口令经二次加密后作为安全口令转换生成客户端密钥。
其中,
所述二次加密步骤包括,
将用户口令的每个字符依次转换为16进制字节,并按半字节依次取数,记为N1,N2,N3,N4…Nn;根据自定义算法生成混淆口令串M1|M2|M3|M4|…|Mn;所述自定义算法为:
M1=ASCII(S(H(N1,1)));
Mi=ASCII[H’(Ni,i)^S(H(Ni-1,(i-1)))]||ASCII(S(H(Ni,i)));
其中,
H(x,i)为自定义的10进制函数,H(x,i)=((2x+i)mod 16)||x;
H(x,i)的逆转换记为H’(x,i),H’(x,i)=x||((2x+i)mod 16);
ASCII表示ASCII码转换;
i=2,3,4,…n,n为用户口令全部转为16进制后的字符个数。
其中,
所述二次加密步骤还包括中间口令生成步骤,用于将生成的所述混淆口令串M1|M2|M3|M4|…|Mn转换为中间口令,其计算过程为:
对M1|M2|M3|M4|…|Mn以ASCII码方式解码,获取2n-1个字节;将2n-1个字节顺序排序,设定为
A=A0A1A2A3…A2n-2;
使用随机数生成器生成m个2n-1字节长度的随机数,每个随机数记为FKi=K0iK1iK2iK3i…K(2n-2)i;i=1,2,3,…,m;
使A与第一个随机数FK1按bit位对位异或,得到T1;
按同样方式使T1与第二个随机数FK2对位异或,获取T2;
依此类推,获取m个2n-1字节的数,连接生成m*(2n-1)个字节的中间口令T1T2T3T4...Tm。
其中,
所述的随机数生成器的计算过程为,
R1=keccak(seed1+rand1,(2n-1)*m);
Ri=keccak(seedi+randi,(2n-1)*m),randi=rand1+(i-1),seedi=keccak(Ri-1+randi,(2n-1)*m);
其中,
Ri为字节数为(2n-1)的随机数;
seed1=seed,rand1=uid;其中,seed为与安全键盘版本相关的随机数,uid为与安全键盘初始化配置相关的随机数,与用户关联;
i=2,3,…,m。
本发明进一步提供了一种生成本地密钥的***,包括客户端和服务端,所述
客户端和服务端通过各自的通信模块进行通信:
所述客户端进一步包括,
输入模块,包括安全键盘,用于用户输入用户口令;
接收模块,用于接收所述用户口令;
密钥生成模块,用于生成客户端密钥及本地密钥;
客户端加解密模块,用于对用户信息进行签名,获得签名信息;
所述服务端进一步包括,
服务端加解密模块,用于对所述签名信息进行验签;
服务端密钥生成模块,用于生成随机密钥rk;
存储模块,用于存储客户端标识。
其中,
所述客户端密钥由用户口令作为安全口令通过PBKDF类函数转换生成。
其中,
所述用户信息包括安全键盘配置参数uid、用户公钥、用户身份ID;
所述客户端标识包括用户身份ID、用户公钥、客户端密钥、随机密钥rk。
其中,
所述签名信息由所述用户信息以用户私钥签名获得。
其中,
所述客户端加解密模块还用于对待发送信息采用接收方公钥或对称密钥进行加密,以及对接收到的信息采用客户端私钥或对称密钥进行解密;
所述服务端加解密模块还用于对接收到的信息采用服务端私钥或对称密钥进行解密,以及对待发送信息采用接收方公钥或对称密钥进行加密。
其中,
所述本地密钥由安全口令和随机密钥rk拼接后通过PBKDF类函数转换生成。
其中,
所述服务端进一步包括:
服务端验证模块,用于验证所述客户端密钥。
其中,
所述客户端加解密模块还用于将所述用户口令进行二次加密生成安全口令;
所述安全口令用于转换生成所述客户端密钥和本地密钥。
具体实施方式
以下结合具体实施方式进一步详细说明本发明的技术方案。应当理解,此处描述的具体实施方式仅仅用以解释本发明,并不用于限定本发明。
图1示出根据本发明的一个实施例的生成本地密钥的***。
其中,包括客户端1、服务端2;并且,客户端1和服务端2通过各自的通信模块(图1中未示出)进行数据传输;
其中,客户端1进一步包括:
输入模块11,可以包括安全键盘,用于接收用户通过键盘输入的用户口令;所述键盘可以为任何终端上的物理键盘、用户界面上显示的键盘等;
接收模块12,用于接收用户输入的用户口令;
密钥生成模块13,用于生成客户端密钥及本地密钥;其中,所述客户端密钥由安全口令通过PBKDF类函数转换生成,所述安全口令为所述用户口令;所述本地密钥由安全口令和随机密钥rk拼接后通过PBKDF类函数转换生成,所述随机密钥rk由服务端生成;
其中,生成客户端密钥和本地密钥采用的PBKDF类函数不同,例如采用PBKDF-argon2生成客户端密钥,采用PBKDF2生成本地密钥;
具体的,采用PBKDF-argon2生成客户端密钥时,设置Salt=uid,Password=安全口令;其余参数的设定可采用现有技术,在此不做特别限定;优选地,可以设置其他参数Parallelism=4;tagLength=32;memorySizeKB=4096;iterations=16;version-13;hashType=2;
采用PBKDF2生成本地密钥时,设置Salt=uid,Password参数由安全口令与随机密钥rk拼接而成;其余参数的设定可采用现有技术,在此不做特别限定;优选地,可以设置Prf为HMAC-sha256;C=4096;Dklen=32;
客户端加解密模块14,用于对用户信息进行签名,获得签名信息;所述用户信息包括安全键盘配置参数uid、用户公钥、用户身份ID;所述安全键盘配置参数uid为随安全键盘在客户端程序初始化时生成在配置文件的随机数,其与键盘和用户关联,不同用户uid值不同;用户身份ID由应用程序预设,用于用户身份的校验确认;用户公私钥对可以为客户端预设;签名算法可采用现有技术中任一种签名函数,在此不再赘述。
服务端2进一步包括:
服务端加解密模块21,用于对所述签名信息进行验签;
服务端密钥生成模块22,用于随机生成随机密钥rk;所述随机密钥rk的长度不限,优选16字节。
进一步的,客户端加解密模块14还用于对待发送服务端的信息采用服务端公钥或对称密钥进行加密,以及对接收到的信息采用客户端私钥或对称密钥进行解密;
服务端加解密模块21还用于对接收到的信息采用服务端私钥或对称密钥进行解密,以及对待发送客户端的信息采用客户端公钥或对称密钥进行加密。
如图2所示,本发明相应地提供了一种生成本地密钥的方法,包括如下步骤:
步骤100,客户端接收用户输入的用户口令;
步骤101,客户端1接收用户输入的用户口令,并以所述用户口令作为安全口令转换生成客户端密钥;
其中,所述安全口令为所述用户口令;
步骤102,客户端1对用户信息进行签名,获得签名信息;
其中,所述用户口令通过客户端1的安全键盘输入用户口令;所述用户信息包括安全键盘配置参数uid、用户公钥、用户身份ID;所述安全键盘配置参数uid为随安全键盘在客户端程序初始化时生成在配置文件的随机数,其与键盘和用户关联,不同用户uid值不同;用户身份ID由应用程序预设,用于用户身份的校验确认;用户公私钥对可以为客户端预设;签名算法可采用现有技术中任一种签名函数,在此不再赘述。
步骤103,客户端将所述用户信息、签名信息及客户端密钥发送给服务端;
优选地,所述用户信息、签名信息、客户端密钥采用服务端公钥加密发送至所述服务端;
步骤104,服务端接收客户端发送的信息并对所述签名信息进行验签,验签通过执行下一步;
优选地,所述服务端接收到客户端发送的信息后采用服务端私钥进行解密;验签未通过则直接退出或返回验签未通过消息;
步骤105,服务端随机生成随机密钥rk并存储客户端标识;
其中,所述客户端标识包括用户身份ID、用户公钥、客户端密钥、随机密钥rk;
步骤106,服务端将rk发送给客户端;
优选地,所述随机密钥rk采用客户端公钥加密发送至所述客户端;
步骤107,客户端接收所述随机密钥rk,并将所述安全口令与所述随机密钥rk对接转换生成所述本地密钥;
优选地,所述客户端接收到所述随机密钥rk后采用客户端私钥进行解密获得所述随机密钥rk。
其中,上述步骤100-107中具体使用的方法或工作流程与上述***中的相同,不再赘述。
如图3结合图4所示,本发明的本地密钥生成***还可以用于恢复本地密钥rk;其中,
客户端1通信模块发送恢复密钥请求至服务端2,同时发送用户信息、签名信息、客户端密钥、以及时间戳;优选地,采用随机数对时间戳进行拼接形成一256bit随机数rand’,以进一步增强通信安全性;
服务端2进一步包括验证模块24,用于验证所述客户端密钥,即将接收到的客户端密钥与存储的客户端标识中的客户端密钥进行对比验证,验证一致后由服务端通信模块将所述随机密钥rk发送客户端;
客户端1接收随机密钥rk,并由密钥生成模块将安全口令与随机密钥rk拼接后通过PBKDF类函数转换生成本地密钥,实现本地密钥的恢复。
其中,恢复本地密钥的方法进一步包括如下步骤:
步骤200,客户端1向服务端2发送恢复密钥请求,同时发送用户信息、签名信息、客户端密钥、以及时间戳;
优选地,采用随机数对时间戳进行拼接形成一256bit随机数rand’,以进一步增强通信安全性;
其中,rand’只有一次有效性;rand’存储在服务端key-value数据库(如redis)中,用于判断是否为恶意攻击,当同样请求时间戳超过预设时间,例如5分钟,则认为是恶意攻击,请求不予执行。具体的,客户端请求恢复备份密钥时,发送客户端密钥、签名信息、用户信息、随机数rand’至服务端,服务端存储随机数rand’,并验证所述客户端密钥,验证通过后将所述随机密钥rk发送客户端。随机数rand’为一次有效,仅存储预设时间,例如5分钟,两次同样请求时间戳超过5分钟的,认为是攻击,直接放弃;
优选地,客户端加解密模块14还用于将所述用户信息、签名信息、客户端密钥、以及时间戳使用服务端公钥进行加密后发给服务端2;
步骤201,服务端接收客户端发送的信息并存储时间戳,并验证所述客户端密钥,验证通过后将所述随机密钥rk发送客户端;
优选地,服务端2采用服务端公钥解密从客户端接收到的信息;。
为了防止恶意攻击或恶意尝试用户口令,若客户端密钥错误超过3次,则锁定安全键盘一定时间,例如30分钟。
优选地,服务端采用随机数rand’作为对称密钥对随机密钥rk进行加密后发送客户端;对称加解密算法可采用现有技术中任一种对称加解密函数,例如AES256;客户端接收随机密钥rk后以随机数rand’作为对称密钥进行解密,解密算法采用与服务端一致的对称加解密算法。
本发明的本地密钥生成***还可以用于更新随机密钥rk,其中,更新随机密钥rk的方法进一步包括步骤:
客户端1发送用户信息、签名信息、客户端密钥至服务端;
服务端2的验证模块24验证所述客户端密钥,验证通过生成新的随机密钥rk,并发送客户端。
根据本发明另一个实施例的本地密钥生成***,图1所示的本地密钥生成***中的客户端1的客户端加解密模块14还用于对接收模块12接收到的所述用户输入的用户口令进行二次加密,二次加密后的结果作为安全口令发送给客户端密钥生成模块13用于生成客户端密钥和本地密钥;
其中,如图5所示,客户端加解密模块14进一步包括混淆模块141,具体地,其工作流程如下:
将用户输入的每个口令字符,通过ASCII码依次转换为16进制字节后,按半字节依次取数,记为N1,N2,N3,N4…Nn;
根据自定义算法生成混淆口令串M1|M2|M3|M4|…|Mn;所述自定义算法为:
M1=ASCII(S(H(N1,1)));
Mi=ASCII[H’(Ni,i)^S(H(Ni-1,(i-1)))]||ASCII(S(H(Ni,i)));
其中,
H(x,i)为自定义的10进制函数,H(x,i)=((2x+i)mod 16)||x;
H(x,i)的逆转换记为H’(x,i),H’(x,i)=x||((2x+i)mod 16);
S(x)采用标准AES算法中S盒的构建方法:
其中,ASCII表示ASCII码转换;x代表函数变量;·表示对位异或加运算;
表示异或加运算;
i=2,3,4,…n,n为正整数用户口令全部转为16进制后的字符个数。
由此,可获取混淆后的字节数为(2n-1)的混淆口令串M1|M2|M3|M4|…|Mn。
其中,如图5所示,客户端加解密模块14进一步包括中间口令生成模块142,具体地,其工作流程如下:
对上述混淆口令串M1|M2|M3|M4|…|Mn以ASCII码方式解码,获取2n-1个字节;
将2n-1个字节顺序排序,设定为A=A0A1A2A3…A2n-2;
使用随机数生成器生成m个2n-1字节长度的随机数,每个随机数记为FKi=K0iK1iK2iK3i…K(2n-2)i;i=1,2,3,…,m;
使A与第一个随机数FK1按bit位对位异或,得到T1;
按同样方式使T1与第二个随机数FK2对位异或,获取T2;
依此类推,获取m个2n-1字节的数,连接生成m*(2n-1)个字节的中间口令T1T2T3T4...Tm;其中,所述随机数生成器(keccakrand函数)生成随机数的步骤进一步包括:
FK1=R1=keccak(seed1+rand1,(2n-1)*m);
FKi=Ri=keccak(seedi+randi,(2n-1)*m),randi=rand1+(i-1),seedi=keccak(Ri-1+randi,(2n-1)*m)
其中,
seed1=seed,rand1=uid;seed为与安全键盘版本相关的随机数,同一版本的安全键盘seed值相同,不同版本的安全键盘seed值不同;uid为随键盘在客户端程序初始化时生成在配置文件的随机数,其与键盘和用户关联,不同用户uid值不同;
m为扩展倍数(内置默认为8);m越大,获得的中间口令长度越长,安全级别越高;
i=2,3,…,m;
Ri为字节数为(2n-1)的随机数;
由此,可获取长度为m*(2n-1)个字节的中间口令T1T2T3T4...Tm。
本实施例采用自定义的新型算法,将用户口令进一步拆分成混淆口令和中间口令,可更有效地防止键盘拦截及内存注入攻击,保证用户口令只在输入瞬间出现,增强了用户口令的安全性。用户口令经二次加密后作为安全口令转换生成客户端密钥和本地密钥,安全级别更高。
相应地,如图6所示,本发明的生成本地密钥的方法进一步将用户口令二次加密的方法:
步骤300,将输入的用户口令生成混淆口令串;
步骤301,将混淆口令串转为中间口令;
其中,所述生成混淆口令串和中间口令的步骤使用如前所述的相应的方法,不再赘述。
本申请本地密钥生成***的设计,提供口令分割技术,可以保证用户端与服务端结合才可正常使用键盘的方式对口令进行增强防护;可有效防止黑客攻击,用户只需记住简单的用户口令,即可获得高安全级别的保护,方便快捷,满足特殊场合需要。
以上的实施方式均为本发明的优选实施方式,并非因此限制本发明的专利保护范围。任何本发明所属的技术领域的技术人员,在不脱离本发明所公开的精神和范围的前提下,对本发明的内容所做的等效结构与等效步骤的变换均落入本发明要求保护的专利范围之内。