基于WebAssmbly编码无需缓存中间件的防重放方法与流程

本发明属于网络安全,特别是涉及基于webassmbly编码无需缓存中间件的防重放方法。
背景技术:
1、在无线网络中,重放攻击是一种最常见的、危害性较大的一种攻击。在可以受到攻击的认证协议中,百分之九十以上都来自于重放攻击。重放攻击就是攻击者发送一个目的主机已接收过的包。该攻击一方面通过占用接收系统的资源使系统的可用性受到损害,另一方面攻击者利用网络监听或者其他方式盗取认证凭据,之后再把它重新发给认证服务器,来达到欺骗系统的目的。目前,较常用的防重放攻击方案有如下几种:
2、a:时间戳校验:每次http请求都加上时间戳参数,然后把时间戳和其他参数一起进行数字签名。假设一次正常的http请求,从发出到达服务器都不会超过某个固定的时间,如60秒,服务器比较http请求中的时间戳参数与当前时间是否超过了60秒,超过了则认为是非法的请求。一般情况下,黑客从抓包到重放请求耗时远远超过60s,如果黑客修改时间戳参数,则对应的数字签名就会失效,因为黑客不知道token值,无法生成新的数字签名。这种方式简单易用,但漏洞也是显而易见的,即无法抵御在定义的超时时间内发生的重放攻击,且凡应用时间戳校验的方案均要求客户端和服务器时间精确同步,下同。
3、b:nonce方案:nonce是仅一次有效的随机字符串,要求每次请求时,该参数要保证不同,服务器将每次请求的nonce参数存储到缓存(一般由中间件实现,如redis或memcached)中。每次处理http请求时,先判断该请求的nonce参数是否存在于缓存中,如存在则认为是非法请求。这种方式也有很大的问题,就是存储nonce的缓存会越来越大,验证nonce是否存在的耗时会越来越长,所以需要定期清理该缓存,而一旦清理缓存后,则重放防御清零,假设该缓存每天清理一次,黑客捕获到合法请求,虽然当时无法进行重放攻击,但可以在一天后进行重放攻击;且用于存储nonce的缓存也是一笔不小的开销。
4、c:时间戳+nonce方案:每个请求都带时间戳和nonce随机码,服务端记录所有的nonce随机码,但设置一个超时时间,超时的重放攻击会被时间戳参数判定无效,未超时的重放攻击则会因nonce随机码在缓存中存在而判定为无效,因为缓存中存储的nonce随机码会因超时而被自动清理,避免了缓存空间的无限增长;该方案依赖redis等高速缓存中间件的超时失效机制。
5、另外,以上三种方法都因客户端编程语言javascript是以源码方式在浏览器中执行,对所有人可见,客户端应用的所有算法(nonce、签名等)理论上都存在被破解的可能,因此,本技术提供一种基于webassmbly编码无需缓存中间件的防重放方法。
技术实现思路
1、本发明的目的在于提供基于webassmbly编码无需缓存中间件的防重放方法,通过选择一种低重码率、保证执行确定性的nonce随机码生成算法,对每个用户,使用同一个种子,在客户端和服务端分别产生相同的nonce随机码序列,该序列中的最新的nonce随机码即用户密钥,客户端每次请求时使用用户密钥执行数据加密算法对数据进行加密得到防重放参数,服务端用用户密钥解密防重放参数,如客户端用户密钥与服务端用户密钥相同,解密后会得到包含验证魔数的有效数据,如解密失败或者解密后验证魔数不匹配,视为无效请求。用户密钥使用之后,客户端和服务端用nonce随机码生成算法分别同步更新各自的用户密钥,解决了现有的问题。
2、为解决上述技术问题,本发明是通过以下技术方案实现的:
3、本发明为基于webassmbly编码无需缓存中间件的防重放方法,主要由以下四部分组成:加密器,接口,算法和常量,本发明需要在客户端与服务端实现相同的nonce随机码生成算法和密钥加/解密算法。服务端可以使用各种web编程语言实现;为避免源码泄漏,客户端的算法使用webassembly编码实现;此编码实现在本发明中称之为加密器,加密器有三种形态,加密器模板,加密器实例,加密模块;具体包括以下步骤:
4、编译:通过加密器模板在编码中定义一个占位魔数,所述魔数长度和保护密钥长度相同,所述保护密钥是用来加/解密用户密钥的密钥;加密器模板是本方案中多个算法的实现,在服务端发布前准备好,可用各种支持webassembly的编程语言实现并编译成webassembly编码;
5、实例化:在用户发起申请会话请求时,用户密钥和加密器模板经实例化处理动态生成加密器实例;加密器实例会发送到客户端;
6、加载:客户端浏览器在接收到加密器实例后,在浏览器中加载生成javascript闭包对象;闭包对象用于对请求进行加密并动态更新客户端的用户密钥,闭包对象导出加密函数,所述加密函数调用加密器webassembly实例的数据加密方法完成对数据的加密,得到防重放参数;
7、接口:接口有两个:申请会话接口和通讯接口,正常情况下,申请会话接口只在最初调用一次,后面只使用通讯接口和服务端交互即可;
8、算法:本方案用到:nonce随机码算法、数据加密算法、密钥加密算法、保护密钥构建算法、用户种子生成算法;每种算法的实现可根据实际场景和具体需求灵活选择,同种算法彼此具备可替换性,从而增强了整体方案的灵活性与扩展性。
9、进一步地,构建所述加密器实例的方法为:
10、s1:处理用户请求:验证用户身份,获得用户id,返回当前服务端时间戳;
11、s2:获取用户密钥:根据用户id查到用户密钥,用nonce随机码算法更新用户密钥;nonce随机码算法:用于计算nonce随机码序列。每个随机码都由上一个随机码迭代生成;
12、s3:构建保护密钥:使用保护密钥构建算法对用户id、服务端时间戳计算生成保护密钥;保护密钥构建算法:任意散列算法,如md5,用于生成保护密钥;
13、s4:加密用户密钥:使用密钥加密算法和保护密钥加密用户密钥;密钥加密算法:以保护密钥为密钥,对用户密钥加/解密的对称加密算法。作用:避免用户密钥明文展现;保护密钥构建算法:任意散列算法,如md5,用于生成保护密钥;
14、s5:获取加密器模板:加密器模板是服务端静态资源,可考虑在多个加密器模板中动态随机选择一个;
15、s6:构建加密器副本:复制加密器模板,将复制所得的加密器副本中的占位魔数替换为保护密钥;
16、s7:构建加密器实例:定义数据结构并构建二进制数据,并用base64编码转换为字符串。
17、进一步地,所述闭包对象生成的方法为:
18、ss1:解析加密器实例:对base64解码得到的二进制数据,根据定义的数据结构的格式,解析得到加密器用户密钥密文和加密器副本;
19、ss2:构建webassembly实例:用javascript的webassembly系统对象将加密器副本的二进制数据编译为javascript源码可调用的webassembly实例;
20、ss3:构建加密器模块:生成一个闭包对象,闭包对象内包含两个闭包变量:一个是用户密钥密文变量,一个是加密器webassembly实例变量。
21、进一步地,所述加密函数处理数据的方法为:
22、s011:调用加密函数:通过业务功能将请求参数明文传入加密函数;
23、s012:获取用户密钥密文:用户密钥密文是加密器模块的闭包变量;
24、s013:调用加密器webassembly实例的数据加密方法,传入用户密钥密文和请求参数明文;
25、s014:解密用户密钥:调用加密器webassembly实例内的密钥加/解密方法,用保护密钥解密用户密钥;
26、s015:生成防重放参数:使用用户密钥执行数据加密算法加密请求参数明文和验证魔数,得到防重放参数;数据加密算法:以用户密钥为密钥,对业务数据加/解密的对称加密算法,用于构造防重放参数;
27、s016:更新用户密钥:用nonce随机码算法更新用户密钥;nonce随机码算法:用于计算nonce随机码序列,每个随机码都由上一个随机码迭代生成;
28、s017:加密新用户密钥:调用加密器webassembly实例内的密钥加/解密方法,用保护密钥加密;
29、s018:返回结果给数据加密函数:返回结果包括:防重放参数和新的用户密钥密文;
30、s019:更新加密器模块内的用户密钥密文;
31、s0110:返回防重放参数到业务功能。
32、进一步地,所述客户端通过通讯接口与服务端交互,所述通讯接口的时序为:
33、t1:构造防重放参数:客户端调用加密器模块加密业务数据生成防重放参数;
34、t2:客户端为请求附加签名和身份验证信息,向服务端发起请求;
35、t3:用户身份验证:验证通过则得到用户信息,验证不通过则返回错误信息并中止处理;
36、t4:防重放验证:服务端根据用户信息取得用户密钥,执行数据加密算法(数据加密算法:以用户密钥为密钥,对业务数据加/解密的对称加密算法。用于构造防重放参数),解密获得业务数据明文,检查其中是否包含验证魔数,若有表示验证通过,若无则返回错误信息并中止处理;
37、t5:更新用户密钥:服务端执行nonce随机码算法(nonce随机码算法:用于计算nonce随机码序列。每个随机码都由上一个随机码迭代生成),得到新的用户密钥并更新;
38、t6:处理请求:执行具体的业务处理,获得处理结果;
39、t7:将处理结果返回客户端。
40、进一步地,所述客户端和服务器的会话通过申请会话接口进行初始化,构建加密器实例,申请会话接口的时序为:
41、c1:初始化用户密钥:服务端启动服务以及新增用户时,执行用户种子生成算法(用户种子生成算法:用于生成每个用户密钥的种子,任意散列算法),为每个用户初始化用户密钥,初始化的用户密钥存储在数据库或者会话缓存中;
42、c2:客户端向服务端发起申请会话请求:请求中包含用户身份验证信息;
43、c3:用户身份的验证:用户身份验证协议的具体实现与本方案无关,此不赘述;
44、c4:更新用户密钥:服务端用请求中的用户信息,取得该用户的用户密钥,执行nonce随机码算法(nonce随机码算法:用于计算nonce随机码序列。每个随机码都由上一个随机码迭代生成),得到新的用户密钥并更新;
45、c5:构建加密器实例;
46、c6:客户端接收并加载加密器实例,生成javascript闭包对象,客户端与服务端通过加密器实现了用户密钥的同步。
47、进一步地,服务端用用户密钥解密防重放参数;
48、若客户端用户密钥与服务端用户密钥相同,则解密后得到包含验证魔数的有效数据;
49、若解密失败或者解密后验证魔数不匹配,则视为无效请求;
50、用户密钥使用之后,客户端和服务端用nonce随机码生成算法分别同步更新各自的用户密钥。
51、进一步地,所述nonce随机码算法用于计算nonce随机码序列,每个随机码都由上一个随机码迭代生成,所述nonce随机码算法为xorshift算法或线性同余法或梅森素数旋转法。
52、进一步地,所述保护密钥构建算法为任意散列算法,用于生成保护密钥。
53、进一步地,所述用户种子生成算法为任意散列算法,用于生成每个用户密钥的种子。
54、本发明具有以下有益效果:
55、1、不依赖redis等三方缓存中间件,部署更方便,对服务器资源要求更低;是一种白名单方案:记录下次请求有效的用户密钥,用此密钥加密数据,匹配则通过,否则拒绝服务;因为在服务端只需要为每个用户记录一个编码,对存储要求极低,也不需要超时失效机制。
56、2、安全性提高:体现在三方面,2.1、客户端算法是二进制的webassembly编码实现的,不具备可读性,不像常规的javascript编码,是源码方式执行;2.2、通讯过程中,不传输用户密钥,用户密钥分别存储在服务端和客户端,用算法保持双端滚动同步;2.3、用户密钥在客户端是密文形式存储,而保护用户密钥的保护密钥,是webassembly编码的一部分,是二进制格式。
57、3、执行效率提高:webassembly编码执行效率接近原生编码,比javascript源码执行效率高。
58、4、因为不使用时间戳,所以也不需要客户端与服务端的时间精确同步。
59、当然,实施本发明的任一产品并不一定需要同时达到以上所述的所有优点。
技术研发人员:肖文峰
技术所有人:深圳联友科技有限公司
备 注:该技术已申请专利,仅供学习研究,如用于商业用途,请联系技术所有人。
声 明 :此信息收集于网络,如果你是此专利的发明人不想本网站收录此信息请联系我们,我们会在第一时间删除
