一种动态签名方法及应用该方法的客户端和服务器
技术领域
本申请属于身份认证技术领域,尤其涉及在身份认证过程中的一种动态签名方法及应用该方法的客户端和服务器。
背景技术
重放攻击是指攻击者发送一个目的主机已接受过的数据包,来达到欺骗***的目的,主要用于身份认证过程,破坏认证的正确性。重放攻击是计算机世界黑客常用的攻击方式之一,为了抵御重放攻击,现在的身份认证一般采用挑战应答方式。
挑战应答方式是在用户在客户端申请登录***进行身份认证时,先发送请求,***服务器端接收到请求后向客户端发送挑战值,客户端根据接收到的挑战值计算出应答值,并向***服务器端发送响应消息,***服务器端在收到响应消息后进行判断应答值是否正确,如果正确则认证通过,否则断开连接。而为了防止响应信息被截获并篡改或被攻击者伪造,通常还对响应消息进行签名。
然而现有技术都是采用固定算法进行签名,如果签名密钥泄漏,攻击者就能伪造响应消息,从而造成用户帐号的被盗用或认证失败。
发明内容
本申请的目的是提供一种动态签名方法及应用该方法的客户端和服务器,在签名密钥泄漏情况下,如果攻击者不知道签名算法,也无法伪造响应消息,提高安全性。
为了实现上述目的,本申请技术方案如下:
一种动态签名方法,应用于身份认证***的客户端,所述身份认证***还包括服务器端,所述动态签名方法包括:
向服务器端发送认证请求;
接收所述服务器端发送的认证请求应答消息,所述认证请求应答消息中携带有挑战值;
根据认证请求应答消息中的挑战值选择签名算法,并使用选择的签名算法对生成的认证响应消息进行签名,向服务器端发送认证响应消息,以便服务器端在接收到所述认证响应消息后,同样根据所述挑战值选择签名算法对认证响应消息进行校验。
本申请的一种实施方式,所述用选择的签名算法对生成的认证响应消息进行签名,其中进行签名时所使用的密钥为约定的第二私钥,在服务器端保存有约定的第二公钥用于对签名的认证响应消息进行校验。即以约定的第二私钥和第二公钥作为选择的签名算法的密钥来进行签名。
本申请的另一种实施方式,所述用选择的签名算法对生成的认证响应消息进行签名,其中进行签名时所使用的密钥为用户私钥,在服务器端保存有对应的用户公钥用于对签名的认证响应消息进行校验,所述动态签名方法还包括:
向服务器端发送开通请求,接收服务器端发送的携带挑战值的开通请求应答消息;
生成包括用户私钥和用户公钥的用户公私钥对,保存用户私钥;
根据开通请求应答消息中的挑战值选择签名算法,并使用选择的签名算法和约定的第二私钥对生成的开通响应消息进行签名后发送给服务器端,所述开通响应消息包括用户公钥,以便服务器端接收开通响应消息并使用约定第二公钥进行校验,在服务器端保存用户公钥。
即通过开通请求,建立客户端与服务器端针对用户的个人用户密钥对,每个用户有自己的密钥对,提高安全性。
进一步地,所述开通请求应答消息在服务器端以约定的第一私钥进行签名,所述动态签名方法在接收到开通请求应答消息后,还包括:
以约定的第一公钥对接收的开通请求应答消息进行校验,如果校验通过才进行后续的响应,否则报错。
同样,所述认证请求应答消息在服务器端以约定的第一私钥进行签名,所述动态签名方法在接收到认证请求应答消息后,还包括:
以约定的第一公钥对接收的认证请求应答消息进行校验,如果校验通过才进行后续的响应,否则报错。通过对开通请求应答消息和认证请求应答消息进行签名发送,加强了服务器端与客户端之间信息交互的保密。
本申请中签名算法包括签名算法1-签名算法n,n为签名算法的数量,所述根据所述挑战值选择签名算法,包括:
求所述挑战值除以n得到的余数p,选择签名算法p+1作为选择的签名算法。本申请不限于选择签名算法的具体选择方法。
进一步地,本申请所述选择的签名算法为至少一种,通过选择的多个签名算法复用能够更加提高安全性。
本申请还提出了一种动态签名方法,应用于身份认证***的服务器端,所述身份认证***还包括客户端,所述动态签名方法包括:
接收客户端发送的认证请求,向客户端发送携带挑战值的认证请求应答消息;
接收客户端根据认证请求应答消息中的挑战值选择签名算法,并使用选择的签名算法进行签名的认证响应消息,同样根据挑战值选择签名算法校验认证响应消息的签名,如果校验通过,则认证通过,否则报错。
同样,本申请的一种实施方式,所述根据挑战值选择签名算法校验认证响应消息的签名,其中校验所使用的密钥为约定的第二公钥,对客户端使用选择的签名算法和约定的第二私钥签名的认证响应消息进行校验。
本申请的另一种实施方式,所述根据挑战值选择签名算法校验认证响应消息的签名,其中校验所使用的密钥为用户公钥,所述客户端用选择的签名算法对生成的认证响应消息进行签名,使用的密钥为对应的用户私钥,所述动态签名方法还包括:
接收客户端发送的开通请求,向客户端发送携带挑战值的开通请求应答消息;
接收客户端根据开通请求应答消息中的挑战值选择签名算法,并使用选择的签名算法和约定的第二私钥签名的开通响应消息,所述开通响应消息包括用户公钥,同样根据挑战值选择签名算法,并使用第二公钥校验开通响应消息,在服务器端保存用户公钥。
进一步地,所述动态签名方法还包括:以约定的第一私钥对开通请求应答消息进行签名,以便所述客户端以约定的第一公钥对接收的开通请求应答消息进行校验,如果校验通过才进行后续的响应,否则报错。
同样地,所述动态签名方法在接收客户端发送的认证请求后,还包括:
以约定的第一私钥对携带挑战值的认证请求应答消息进行签名后发送,以便所述客户端以约定的第一公钥对接收的认证请求应答消息进行校验,如果校验通过才进行后续的响应,否则报错。
本申请还提示提出了基于上述方法对应的装置,分别为:
一种客户端,应用于身份认证***,所述身份认证***还包括服务器端,所述客户端包括:
请求模块,用于向服务器端发送认证请求,并接收所述服务器端发送的认证请求应答消息,所述认证请求应答消息中携带有挑战值;
签名模块,用于根据认证请求应答消息中的挑战值选择签名算法,并使用选择的签名算法对生成的认证响应消息进行签名,向服务器端发送认证响应消息,以便服务器端在接收到所述认证响应消息后,同样根据所述挑战值选择签名算法对认证响应消息进行校验。
相应地,一种服务器,应用于身份认证***,所述身份认证***还包括客户端,所述服务器包括:
应答模块,用于接收客户端发送的认证请求,向客户端发送携带挑战值的认证请求应答消息;
校验模块,用于接收客户端根据认证请求应答消息中的挑战值选择签名算法,并使用选择的签名算法进行签名的认证响应消息,同样根据挑战值选择签名算法校验认证响应消息的签名,如果校验通过,则认证通过,否则报错。
本申请利用下发的挑战随机数选择签名算法,通过随机数动态选择签名算法,在签名密钥泄漏情况下,如果攻击者不知道签名算法,也无法伪造响应消息,由于在这种情况下,除了要获取签名密钥外,通常还需要反编译客户端程序,增加了攻击成本,提高安全性。
附图说明
图1为本申请动态签名方法流程图;
图2为本申请动态签名方法另一实施例流程图
图3为本申请客户端结构示意图;
图4为本申请服务器结构示意图。
具体实施方式
下面结合附图和实施例对本申请技术方案做进一步详细说明,以下实施例不构成对本申请的限定。
在基于互联网的应用中,一般来说都具有位于用户侧的客户端和位于服务商侧的服务器端。客户端一般为应用程序,安装在用户的移动终端、电脑或其他智能设备中,有些客户端直接是服务商提供的网页。客户端与服务器端之间开通业务、进行业务操作过程中的校验、以及注销业务等等都需要进行用户的身份认证。
本实施例动态签名方法如图1所示,包括如下步骤:
S1、客户端向服务器端发送认证请求。
S2、服务器端接收到认证请求后,向客户端发送携带挑战值的认证请求应答消息。
挑战值是在身份认证过程中通过随机算法生成的随机数,关于随机数的生成,现有技术中有伪随机算法和强随机算法,本实施例采用强随机算法,获得的随机数分布更加均匀。
S3、客户端根据认证请求应答消息中的挑战值选择签名算法,并使用选择的签名算法对生成的认证响应消息进行签名,向服务器端发送认证响应消息。
在身份认证过程中,客户端在接收到认证请求应答消息后,需要进行响应,向服务器端返回认证响应消息。认证响应消息中包括应答值,该应答值是根据挑战值按照固定的算法计算得到的,以便服务器端根据同样的算法计算得到应答值进行比较验证。
本实施例与现有技术不同的地方在于,还根据认证请求应答消息中的挑战值选择签名算法,并使用选择的签名算法对认证响应消息进行签名后在发送到服务器端。
其中根据接收的挑战值来选择签名算法,例如可选择的签名算法有4中,分别为签名算法1、签名算法2、签名算法3、签名算法4。
可以以挑战值求余的方式选择算法,如果挑战值除以4余数为0,则选择签名算法1,余数为1则选择签名算法2,依次类推。具体的签名算法有安全哈希算法RAS-SHA1、RSA-SHA256等,这里不再赘述。
需要注意的是,使用签名算法进行签名时所采用的密钥对通常采用客户端与服务器端约定的第二公私钥对,该第二公私钥对包括第二私钥和第二公钥,第二私钥保存在客户端,第二公钥保存在服务器端。在签名时使用选择的签名算法和第二私钥进行签名,而在后续的签名校验时,使用选择的签名算法和第二公钥进行校验。
然而约定的第二私钥和第二公钥因为是对所有该客户端的用户都是统一的,安全性不够。为此,本实施例还包括一个生成用户公私钥对,并发送用户公钥到服务器端的过程,通过开通响应消息携带用户公钥发送到服务器端。包括如下步骤:
F1、客户端向服务器端发送开通请求,接收服务器端发送的携带挑战值的开通请求应答消息;
F2、客户端生成用户公私钥对,包括用户私钥和用户公钥,在客户端保存用户私钥;
F3、客户端根据开通请求应答消息中的挑战值选择签名算法,采用选择的签名算法和第二私钥对生成的开通响应消息进行签名,开通响应消息包括用户公钥,并将开通响应消息发送到服务器端;
F4、服务器端接收开通响应消息并使用选择的签名算法和第二公钥对开通响应消息进行校验,在服务器端保存用户公钥。
从而在客户端上保存了用户私钥,在服务器端保存了用户公钥,该用户私钥和用户公钥对每个用户是唯一的,更加安全可靠。并在后续对认证响应消息进行签名时,采用用户私钥进行签名,并在服务器端采用用户公钥进行校验。
需要说明的是,本实施例以挑战值求余的方式选择算法,也可以直接以挑战值的个位数或十位数来进行选择,或根据挑战值除以4得到的值来进行选择,本申请不限于具体选择方式。
S4、服务器端接收认证响应消息,同样根据挑战值选择签名算法,校验响应消息的签名,如果校验通过,则认证通过,否则报错。
在服务器端对认证响应消息的校验过程中,包括如下两个校验步骤:
1)、使用选择的签名算法对认证响应消息进行校验。
在服务器端,同样对挑战值求余,选择对应的签名算法,采用第二公钥对认证响应消息进行校验。如果采用生成的用户公私钥对,则客户端使用选择的签名算法和用户私钥对认证响应消息进行签名,在服务器端则需要使用用户公钥对认证响应消息进行校验。
2)、使用与客户端相同的算法计算得到应答值与响应消息中的应答值进行比较验证。
关于挑战应答的校验,在现有技术中已经应用的比较成熟,这里不再赘述。
本实施例对认证响应消息进行的签名校验,由于是随机的签名算法,即使用户密钥泄露,由于攻击者不知道签名算法,也无法伪造响应消息。
综上所述,图1示出了本申请的一种实施例,在该实施例中,认证响应消息采用客户端与服务器端约定的第二公私钥对进行签名和校验,或提前通过步骤F1~F4预存了用户公私钥,客户端和服务器端采用用户公私钥对进行签名和校验。而图2示出了另一种实施例,在该实施例中,在客户端第一次发起认证的过程中,在步骤S2之后,直接生成用户公私钥对,并发送用户公钥到服务器端保存,即在步骤S2之后,包括如下步骤:
F5、客户端生成用户公私钥对,包括用户私钥和用户公钥,在客户端保存用户私钥;
F6、客户端采用选择的签名算法和第二私钥对生成的开通响应消息进行签名,开通响应消息包括用户公钥,并将开通响应消息发送到服务器端;
F7、服务器端接收开通响应消息并使用选择的签名算法和第二公钥对开通响应消息进行校验,在服务器端保存用户公钥。
可见本申请通过步骤F1~F4首先生成用户公私钥对,或者在第一次认证的过程中通过步骤F5~F7来生成用户公私钥对,采用用户公私钥对进行签名和校验;或者直接采用第二公私钥对来进行签名和校验。优选地,采用步骤F1~F4的步骤来操作,通过随机为每个用户产生用户公私钥对,每个用户拥有自己的用户公私钥对,更加安全;同时在用户开通应用的时候就来完成用户公私钥对的产生和发送过程,不需要如图2所示在第一次认证过程中进行额外的生成和发送过程,对于实现起来更加容易。
本实施例为了进一步地增加认证过程中的安全性,还对认证请求应答消息进行加密后发送,是为了进一步保障认证过程的安全性。
在客户端与服务器端约定有第一公钥和第一私钥,第一公钥保存在客户端,第一私钥保存在服务器端。服务器端在采用第一私钥对认证请求应答消息进行加密后发送到客户端,客户端用第一公钥解密进行验证,验证通过则进行下面的步骤,否则报错。这里用到的加密算法可以为对称算法、非对称算法、摘要算法等。
同理对于开通请求应答消息,也可以同样采用第一公钥和第一私钥进行加密和校验,这里不再赘述。
需要注意的是,在一般要求不高的情况下,也可以省略对认证请求应答消息的加解密验证过程。
通常在身份认证中,认证响应消息中还包括身份认证的具体信息,例如指纹、密码、用户ID等,在对认证响应消息进行签名校验和应答值校验后,还需要比较保存在服务器端的身份认证的具体信息,如果一致则认为是合法用户,这里不再赘述。
需要说明的是,本申请根据随机数选择签名算法,不限于选择一种签名算法来进行签名,也可以选择多种算法的组合进行签名操作,提高算法的变化。例如根据随机数的个位数和十位数,选择两个签名算法,先后进行两次签名来进一步增强签名的安全性。
本实施例还同时提出了基于上述方法对应的客户端和服务器,如图3所示,本实施例的客户端包括:
请求模块,用于向服务器端发送认证请求,并接收所述服务器端发送的认证请求应答消息,所述认证请求应答消息中携带有挑战值;
签名模块,用于根据认证请求应答消息中的挑战值选择签名算法,并使用选择的签名算法对生成的认证响应消息进行签名,向服务器端发送认证响应消息,以便服务器端在接收到所述认证响应消息后,同样根据所述挑战值选择签名算法对认证响应消息进行校验。
其中,签名模块在对认证响应消息进行签名,其中进行签名时可以使用约定第二密钥对,也可以使用生成的用户密钥对。
当签名时使用约定第二密钥对时,客户端签名模块使用约定的第二私钥对认证响应消息进行签名,在服务器端保存有约定的第二公钥用于对签名的认证响应消息进行校验。
当签名时使用生成的用户密钥对时,客户端签名模块使用用户私钥对认证响应消息进行签名,在服务器端保存有对应的用户公钥用于对签名的认证响应消息进行校验。
而在生成用户密钥对的过程中,请求模块还用于向服务器端发送开通请求,接收服务器端发送的携带挑战值的开通请求应答消息;签名模块还用于生成包括用户私钥和用户公钥的用户公私钥对,保存用户私钥,根据开通请求应答消息中的挑战值选择签名算法,并使用选择的签名算法和约定的第二私钥对生成的开通响应消息进行签名后发送给服务器端,所述开通响应消息包括用户公钥,以便服务器端接收开通响应消息并使用约定第二公钥进行校验,在服务器端保存用户公钥。
其中所述开通请求应答消息在服务器端以约定的第一私钥进行签名,请求模块在接收到开通请求应答消息后,还用于以约定的第一公钥对接收的开通请求应答消息进行校验,如果校验通过才进行后续的响应,否则报错。
同样地,所述认证请求应答消息在服务器端以约定的第一私钥进行签名,请求模块在接收到认证请求应答消息后,还用于以约定的第一公钥对接收的认证请求应答消息进行校验,如果校验通过才进行后续的响应,否则报错。
如图4所示,本实施例的服务器,包括:
应答模块,用于接收客户端发送的认证请求,向客户端发送携带挑战值的认证请求应答消息;
校验模块,用于接收客户端根据认证请求应答消息中的挑战值选择签名算法,并使用选择的签名算法进行签名的认证响应消息,同样根据挑战值选择签名算法校验认证响应消息的签名,如果校验通过,则认证通过,否则报错。
其中,校验模块根据挑战值选择签名算法校验认证响应消息的签名,其中校验所使用的密钥为约定的第二公钥,或用户公钥。
即当客户端使用选择的签名算法和约定的第二私钥签名认证响应消息时,校验模块使用约定的第二公钥进行校验;而在客户端使用选择的签名算法和用户私钥签名认证响应消息时,校验模块使用用户公钥进行校验。
在生成用户密钥对的过程中,应答模块还用于接收客户端发送的开通请求,向客户端发送携带挑战值的开通请求应答消息;校验模块还用于接收客户端根据开通请求应答消息中的挑战值选择签名算法,并使用选择的签名算法和约定的第二私钥签名的开通响应消息,所述开通响应消息包括用户公钥,同样根据挑战值选择签名算法,并使用第二公钥校验开通响应消息,在服务器保存用户公钥。
进一步地,应答模块还用于以约定的第一私钥对开通请求应答消息进行签名,以便客户端以约定的第一公钥对接收的开通请求应答消息进行校验,如果校验通过才进行后续的响应,否则报错。
进一步地,应答模块在接收客户端发送的认证请求后,还以约定的第一私钥对携带挑战值的认证请求应答消息进行签名后发送,以便所述客户端以约定的第一公钥对接收的认证请求应答消息进行校验,如果校验通过才进行后续的响应,否则报错。
以上实施例仅用以说明本申请的技术方案而非对其进行限制,在不背离本申请精神及其实质的情况下,熟悉本领域的技术人员当可根据本申请作出各种相应的改变和变形,但这些相应的改变和变形都应属于本申请所附的权利要求的保护范围。