基于口令双向认证的客户端密钥安全存储方法与流程

文档序号:19281873发布日期:2019-11-29 23:01阅读:641来源:国知局
基于口令双向认证的客户端密钥安全存储方法与流程

本发明涉及一种基于口令双向认证的客户端密钥安全存储方法。



背景技术:

在网络信息化快速发展的今天,越来越多的用户使用网络传输数据信息。为了保护用户传输的数据及隐私安全,一般需要进行网络身份认证(即用户与服务器之间的认证),其中基于用户口令的认证是一种常用且有效的方法。常规方案一般可归纳为以下三类实现。第一类,服务端直接口令明文存储,系统认证时通过用户输入的口令和预先存储的用户口令进行比较进而实现用户的认证;第二类,服务端口令hash存储,系统认证时对用户输入的口令进行hash计算,最后与系统预先存储的用户口令的hash值进行比对,如果一致则认证通过,否则认证失败;第三类,服务端口令hash加盐存储,系统认证时,对用户输入用户的口令以及注册时对服务端产生并存储的随机盐值进行hash或者hmac处理,最后与系统预先存储口令hash加盐处理的hash值进行比对,如果一致则认证通过,否则认证失败。

网络身份认证作为网络信息安全的第一道防线,具有十分重要的意义。口令认证技术是解决网络安全的核心技术。然而,当前常规方案所采用的三种服务端口令存储技术存在以下缺点:

第一类服务端直接口令明文存储,这一类方案基本无安全可言,用户口令完全暴露在数据库,一旦被拖库后果不堪设想;

第二类服务端口令hash存储,这一类如果口令不是特别复杂的话基本使用查字典法或彩虹表破解法都能轻松破解口令,因此一旦数据库被拖库口令基本也能破解;

第三类服务端口令hash加盐存储,这一类虽然在一定意义上可削弱查字典法或彩虹表破解法的破解效率,但由于计算hash值的耗时在微秒级别,虽然一定意义上能降低数据库被拖库后被破解的风险,但如果用户设置的口令不是太复杂的话,攻击者还是可以通过优化构建的彩虹表破解法破解;

此外,以上三类实现方案口令均需直接明文或加密传输给服务端,但口令总会明文暴露于服务端,加之中间传输不安全以及服务端口令管理不规范等原因都将可能导致用户口令泄露。

产品安全架构中,除需解决客户端与服务端身份认证外,产品往往期望同时能解决客户端与服务端的会话密钥协商机制,甚至在缺少硬件tpm芯片条件下客户端密钥存储问题。



技术实现要素:

为解决现有技术的不足,本发明提供了一种基于口令双向认证的客户端密钥安全存储方法,安全性高。

本发明采用如下的技术方案:

一种基于口令双向认证的客户端密钥安全存储方法,包括:客户端与服务端的双向认证方法;

客户端与服务端的双向认证方向包括以下步骤:

(1)客户端随机产生client-nonce,然后随同username一起发送认证请求给服务端;

(2)服务端收到请求后,先临时存储username以及client-nonce,并从数据库中查询username对应的salt和iteration-count,同时随机产生server-nonce并临时存储于本地,然后向客户端发送server-nonce以及username对应的salt和iteration-count;

(3)客户端收到报文后,首先根据客户输入的password以及salt、iteration-count,计算客户端认证凭据clientproof=key⊕fun(h(key),username,server-nonce);客户端向服务端发送客户端认证凭据clientproof;其中:key=hi(password,salt,iteration-count);

作为一种具体的方式,clientproof=key⊕hmac(h(key),username|server-nonce),key=pbkdf2(password,salt,iteration-count);

(4)服务端收到报文后,查询username注册时数据库中对应存储的h(key),根据username及server-nonce,计算key1=clientproof⊕fun(h(key),username,server-nonce),并比较h(key1)与存储的h(key)是否一致,若是则对客户端认证通过,若否则对客户端认证失败;

作为一种具体的方式,key1=clientproof⊕hmac(h(key),username|server-nonce);

如对客户端认证通过,服务端根据前面报文收到的username及client-nonce计算serverproof=fun(key1,username,client-nonce),向客户端发送服务端认证凭据serverproof,并计算会话密钥:sessionkey=fun(key1,username,server-nonce,client-nonce);

作为一种具体的方式,sessionkey=hmac(key1,username|server-nonce|client-nonce);

serverproof=hmac(key1,username|client-nonce)。

(5)客户端收到报文后,计算serverproof1=fun(key,username,client-nonce),并比较serverproof1与serverproof是否一致,若是则对服务器认证通过,否则对服务端认证失败;

如对服务器认证通过,

计算会话密钥:sessionkey=fun(key,username,server-nonce,client-nonce),并向服务端反馈认证消息;

作为一种具体的方式,sessionkey=hmac(key,username|server-nonce|client-nonce);

serverproof1=hmac(key,username|client-nonce);

(6)服务端收到认证报文,确认是否通过客户端认证。

进一步地,客户端与服务端协商确认的会话密钥可以用于传输密钥。

进一步地,基于口令双向认证的客户端密钥安全存储方法还包括:客户端密钥加密存储方法;

客户端密钥加密存储方法包括以下步骤;

(1)客户端向服务器发送username并申请存储密钥;

(2)服务端接收到申请存储密钥报文后,从数据库查询username对应的kek-salt,然后向客户端发送kek-salt;

(3)客户端收到报文后,首先计算kek=fun(password,kek-salt),随机产生用于数据加密的密钥datakey,使用kek加密datakey得到密文ekek(datakey),最后将密文ekek(datakey)发送给服务端;作为一种具体的方式,kek=hmac(password,kek-salt);

(4)服务端收到报文后,直接将密文ekek(datakey)存储到对应的数据库中,以备使用。

进一步地,kek-salt在用户注册时由服务端随机产生。

进一步地,基于口令双向认证的客户端密钥安全存储方法,还包括:客户端密钥获取方法;

客户端密钥获取方法,包括以下步骤:

(1)客户端向服务端发送username并申请解密密钥;

(2)服务端收到报文申请后,从数据库中查询username对应的kek-salt以及对应的密文ekek(datakey),并一同发送给客户端;

(3)客户端收到报文后,首先计算kek=fun(password,kek-salt),然后使用kek对密文ekek(datakey)解密得到datakey,以备使用。

作为一种具体的方式,kek=hmac(password,kek-salt)。

进一步地,kek和datakey在使用结束后可直接删除不必保存。

进一步地,可通过password恢复kek和datakey。

本发明的有益之处在于提出了一种简洁高效的口令双向安全认证方法,具体体现在:认证凭据尽可能的减少关联参数;用户注册时,服务端仅需存储username、salt、iteration-count、h(key)、kek-salt就能完成客户端与服务端之间的双向认证。

认证过程采用随机数server-nonce和client-nonce生成认证凭据,从而可防止重放攻击。因此,即便过程通信数据完全被第三方监听也无法仿冒客户端或服务端。

基于认证过程协商确立的会话密钥sessionkey每次也因使用随机数server-nonce和client-nonce而具有随机性。因此,当会话结束是该会话密钥生命周期也将结束。

客户端认证过程的核心计算采用性能可调控的hi算法实现,可通过配置迭代次数调控认证计算量从而满足不同产品(如传统计算资源充足的产品或轻量级的物联网终端设备)计算性能需求,最终兼顾系统安全与性能。

提出了基于口令安全认证的客户端密钥安全存储机制,实现集口令双向安全认证和客户端密钥安全存储两大功能于一体的技术方法。此外,由于口令双向认证机制的实现过程未直接暴露用户口令,这种方式既保证了安全又兼顾了实用性。

基于口令派生的客户端密钥安全存储机制采用软件实现,从而解决很多端侧硬件缺少tpm芯片又需确保信息安全的场景,保证产品安全同时又节约系统资源和成本。

附图说明

图1是本发明的一种基于口令双向认证的客户端密钥安全存储方法的客户端与服务端的双向认证方法的流程图;

图2是本发明的一种基于口令双向认证的客户端密钥安全存储方法的客户端密钥加密存储方法的流程图;

图3是本发明的一种基于口令双向认证的客户端密钥安全存储方法的客户端密钥获取方法的流程图。

具体实施方式

以下结合附图和具体实施例对本发明作具体的介绍。

本文描述中,fun(a,b,c,d)表示一个输出结果与输入参数a,b,c,d有关的抽象函数,其具体实现可以是密码学算法或者算法的组合,具体而言,可以选用hmac、cmac、hash、aes等密码算法或密码算法组合。公式ekey(m)表示对明文m使用密钥key进行加密后的密文,这里key是对称算法的密钥;hmac(key,m)表示使用密钥key对消息m的hmac运算;⊕表示异或运算;|表示数据拼接运算。

本发明假定用户注册过程为每一位注册用户都在服务端数据库中存储了对应的username、salt、iteration-count、h(key)、kek-salt几个参数。

其中:key=hi(password,salt,iteration-count)。hi是一种基于口令且具有迭代功能的密钥派生算法,作为一种具体实现方式一般可采用pbkdf2算法。该算法一般具有迭代功能且核心计算为单向hash函数。h(key)表示对key进行hash函数处理,password可以是用户的口令或者硬件存储的密钥,iteration-count为迭代次数,salt以及kek-salt都为盐值,但功能不一样。以下描述的安全机制均假定用户已经完成了注册,并选定hi为pbkdf2算法,fun采用hmac算法。

相关技术术语的名词解释:

tpmtrustedplatformmodel可信平台模块;

kekkey-encipheredkey密钥加密密钥;

hmachash-basedmessageauthenticationcode哈希消息认证码;

cmaccipher-basedmessageauthenticationcode加密消息认证码。

一种基于口令双向认证的客户端密钥安全存储方法,包括:客户端与服务端的双向认证方法、客户端密钥加密存储方法和客户端密钥获取方法。

图1示出了一种客户端与服务端的双向认证方法。

客户端与服务端的双向认证方向包括以下步骤:

1、客户端随机产生client-nonce,然后随同username一起发送认证请求给服务端。

2、服务端收到请求后,先临时存储username以及client-nonce,并从数据库中查询username对应的salt和iteration-count,同时随机产生server-nonce并临时存储于本地,然后向客户端发送server-nonce以及username对应的salt和iteration-count。

3、客户端收到报文后,首先根据客户输入的password以及salt、iteration-count,计算客户端认证凭据clientproof,并向服务端发送客户端认证凭据clientproof;作为一种具体的方式:

clientproof=key⊕hmac(h(key),username|server-nonce);

key=pbkdf2(password,salt,iteration-count)。

4、服务端收到报文后,查询username注册时数据库中对应存储的h(key),根据username及server-nonce,计算key1,并比较h(key1)与存储的h(key)是否一致,若是则对客户端认证通过,若否则对客户端认证失败;

如对客户端认证通过,服务端根据前面报文收到的username及client-nonce计算服务端认证凭据serverproof,并向客户端发送服务端认证凭据serverproof,之后计算会话密钥sessionkey,待使用。作为一种具体的方式:

key1=clientproof⊕hmac(h(key),username|server-nonce);

serverproof=hmac(key1,username|client-nonce);

sessionkey=hmac(key1,username|server-nonce|client-nonce)。

5、客户端收到报文后,计算serverproof1,并比较serverproof1与serverproof是否一致,若是则对服务器认证通过,若否则对服务端认证失败;如对服务器认证通过,计算会话密钥sessionkey,并向服务端反馈认证消息。作为一种具体的方式:

serverproof1=hmac(key,username|client-nonce);

sessionkey=hmac(key,username|server-nonce|client-nonce)。

服务器收到认证报文,确认是否通过客户端认证。

客户端与服务端协商确认的会话密钥sessionkey可以用于客户端与服务端之间加密数据传输,以及传输密钥等信息。

如图2示出了一种客户端密钥加密存储方法。

客户端密钥加密存储方法包括以下步骤;

1、客户端向服务器发送用户名username并申请存储密钥。

2、服务端接收到申请存储密钥报文后,从数据库查询username对应的kek-salt,然后向客户端发送kek-salt。kek-salt,该盐值在用户注册时由服务端随机产生。

3、客户端收到报文后,首先计算kek=hmac(password,kek-salt),随机产生用于数据加密的对称密钥datakey,使用kek加密datakey得到密文ekek(datakey),最后将密文ekek(datakey)发送给服务端。

4、服务端收到报文后,直接将密文ekek(datakey)存储到对应的数据库中,以备使用。

图3示出了一种客户端密钥获取方法。

客户端密钥获取方法,包括以下步骤:

1、客户端向服务端发送username并申请解密密钥;

2、服务端收到报文申请后,从数据库中查询username对应的kek-salt以及对应的密文ekek(datakey),并一同发送给客户端。

3、客户端收到报文后,首先计算kek=hmac(password,kek-salt),然后使用kek对密文ekek(datakey)解密得到datakey,以备使用。

kek和datakey在使用结束后可直接删除不必保存,需要时可通过password恢复kek和datakey,以确保系统安全。

本发明实现了一个基于口令的双向安全认证机制,该机制提出了简洁的认证凭据构造方法,包括客户端认证凭据clientproof及服务端认证凭据serverproof。具体形式为:clientproof=key⊕fun(h(key),username,server-nonce),serverproof=fun(key1,username,client-nonce)。一方面,密钥key由password通过hi算法派生所得,而客户端认证凭据clientproof又依赖于key,因此只有掌握了password的客户端才能生成合法的客户端认证凭据clientproof;另一方面,只有合法并拥有h(key)的服务端在成功完成对客户端认证凭据clientproof验证通过后,才能确保key=key1,从而生成正确的服务端认证凭据serverproof。

基于认证过程中的中间核心密钥key,协商出客户端与服务端的会话密钥sessionkey,具体形式采用sessionkey=fun(key,username,server-nonce,client-nonce)的协商机制,其中key只有当认证成功时才能临时存在,不需使用时可以删除。

通过结合口令双向认证机制提供基于口令派生kek(密钥加密密钥)的客户端密钥安全存储机制,其过程为首先基于口令选定派生算法得到密钥加密密钥kek=fun(password,kek-salt)。然后基于kek加密datakey得到密文ekek(datakey),并发送服务端存储。

本发明基于用户口令,同时实现了双向安全认证及客户端密钥安全存储两大安全机制。该机制假定当双向安全认证通过后,客户端密钥安全存储机制才发生作用来确保密系统安全。

以上显示和描述了本发明的基本原理、主要特征和优点。本行业的技术人员应该了解,上述实施例不以任何形式限制本发明,凡采用等同替换或等效变换的方式(包括采用任何构造本发明中所定义的抽象函数fun、hi的方式)所获得的技术方案,均落在本发明的保护范围内。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1