zoukankan      html  css  js  c++  java
  • 防重放攻击实现

    本文为博主原创,未经允许不得转载

    1.防重放攻击:请求被攻击者获取,并重新发送给认证服务器,从而达到认证通过的目的。

    2。解决方案:

     a. 基于timestamp防止重放攻击

           每次 http 请求时,都添加 timestamp 时间戳的参数,服务端接收到请求时,解析 timestamp 值,并与当前时间进行比较,判断是否超过60s,

      如果超过60s 则丢弃该请求。

     b. 基于nonce值得防重放攻击

        每次http请求时,都添加 一个固定长度的随机数或请求ip加随机数进行hash生成的字符串,服务端在接受到请求的时候,解析请求的nonce值,并将nonce值存于数据库或缓存中,

      当请求时,判断数据库或缓存中是否存在该nonce值,如果存在则丢弃该请求。 此时,使用nonce值,在 http 请求时,nonce值可以保证请求的唯一性。

     c .基于timstamp和nonce值防止重放攻击

          单纯基于 timestamp 进行防重放攻击也会存在风险,如果请求被中间人或是黑客获取,且请求的时间戳与当前时间比较时,仍小于60s 时,此时则

      不能进行防重放攻击。

        单纯使用nonce值时,需要服务端不断地保存nonce值,则会导致数据库保存大量的nonce值,影响效率。

        基于以上两种情况,则将两者结合一起使用,nonce值可以保证请求的唯一性,timestamp可以保证请求的时效性。并将保存于数据库或缓存中的nonce值,

      每隔60s清除一次或将缓存中的nonce值时效时间设置为60s。这样就可以减少nonce值对数据库的压力,提高性能。

    3. 使用证书(公钥与私钥),timestamp 与nonce值进行防重放与防篡改  

      以上请求中nonce值或时间戳等值,若都使用明文传输,会存在被中间人或黑客截取,再次发起请求的风险。

      很多需要进行防重放攻击的场景则都需要保证很高的安全性,所以在整个过程中,可以使用证书进行数据签名,保证请求不被篡改。

      使用证书的公钥与私钥保证请求参数以及timestamp与nonce值不被篡改的方案有两种:

        第一种方案:(客户端使用公钥对数据加密,服务端私钥解密,校验数据的有效性)

          1.客户端向服务端发起https请求

          2.服务端接受到请求后,生成公钥和私钥,公钥相当于锁,私钥相当于钥匙,只有私钥才能打开公钥的内容

          3.服务端返回客户端公钥。

          4.客户端接受到公钥,并解析公钥的有效性,比如颁发者,到期时间等,如果解析异常,则提示证书错误,并进行证书更新。

            客户端解析公钥ok后,对请求体进行加密(此时可将timestamp与nonce值在请求体中进行传输),并传输给服务端

          5.服务端解析客户端传过来的数据,并进行解析,并找到保存于服务端的私钥,对该请求体进行解密,并解析出timestamp 与

            nonce值,此时判断两个值得有效性,如果在使用服务端私钥进行解密处理异常时,则提示请求非法。

        

        第二种方案:(客户端使用私钥签名,服务端使用公钥验签,校验数据的有效性)

          1.客户端向服务端发起https请求

          2.服务端接受到请求后,生成公钥和私钥,公钥相当于锁,私钥相当于钥匙,只有私钥才能打开公钥的内容

          3.服务端返回客户端私钥

          4.客户端使用私钥对请求进行签名(签名的格式可以将HTTP请求头与请求体按按照一定格式进行签名:String signStr = header+&+body),

            并使用authorition 字段以请求头的方式,将签名的数据传到服务端

          5.服务端解析对应的请求,解析出请求头与请求body,拼接签名的原始格式:String signStr = header+&+body,服务端并解析出该请求私钥

            对应的公钥。用公钥验签,判断数据是否被篡改,验签通过后,解析出nonce 值与timestamp值,进行防重放的校验

      

      使用公钥验签与私钥解密的方式可以参考这篇文章:

          RSA 加密,解密,签名,验签

       

  • 相关阅读:
    【BZOJ 2820】 YY的GCD (莫比乌斯+分块)
    【BZOJ 2005】[Noi2010]能量采集 (容斥原理| 欧拉筛+ 分块)
    【HDU 4898】 The Revenge of the Princess’ Knight (后缀数组+二分+贪心+...)
    【BZOJ 3473】 字符串 (后缀数组+RMQ+二分 | 广义SAM)
    【BZOJ3439】 Kpm的MC密码 (TRIE+主席树)
    【GDOI2014 DAY2】Beyond (扩展KMP)
    【转】【最大子矩阵问题】【悬线法】 学习笔记
    【HDU4333】Revolving Digits(扩展KMP+KMP)
    【转】各种字符串算法大总结
    【poj2478-Farey Sequence】递推求欧拉函数-欧拉函数的几个性质和推论
  • 原文地址:https://www.cnblogs.com/zjdxr-up/p/14488681.html
Copyright © 2011-2022 走看看