设计一个app调用的接口,如何防止截取之后重放

设计一个app调用的接口,如何防止截取之后重放

阅读 3.9k
4 个回答

单纯的sign+time会存在漏洞,比如截取后立刻重放可能该请求还是有效的, 这取决于截取时效和当前时间与time的时间差的阀值.

使用sign+time+redis能实现该功能:

  1. 去redis中查找是否有key为sign的string

    - 如果有,说明这个key已在有效期内被使用了,那么这个请求就可以判断是重放请求
  2. 检查sign的有效性和当前时间与time的时间差的阀值

    - 如果有效,则在redis创建这个key,把时效时间设置得比时间差的阀值**略长**即可.
    

网上也有基于time+nonce+sign+redis的方案,不过个人认为nonce与sign的功能是重复的,可以省略,当然nonce的存储空间比存储sign更有优势,自己取舍.

最后, 请使用https增加截取成本.

添加sign+time, 接口验证time及sign
sign中需要将time加入一起生成.

params(treeMap) sign(params,key)

请求被劫持之后,劫持者完全可以不用修改请求任何内容,直接重放。所以只有加强传输成的安全性才是解决问题的根本。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题