• 防重放攻击实现


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

    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 加密,解密,签名,验签

       

  • 相关阅读:
    Chrome cookies folder
    Fat URLs Client Identification
    User Login Client Identification
    Client IP Address Client Identification
    HTTP Headers Client Identification
    The Personal Touch Client Identification 个性化接触 客户识别
    购物车 cookie session
    购物车删除商品,总价变化 innerHTML = ''并没有删除节点,内容仍存在
    453
    购物车-删除单行商品-HTMLTableElement.deleteRow()
  • 原文地址:https://www.cnblogs.com/zjdxr-up/p/14488681.html
Copyright © 2020-2023  润新知