关于加签名防攻击的疑问

在网上看到一个方案是:“客户端将参数排序进行MD5加密后,得到sign。 服务端再次将你的参数排序进行MD5加密,比较两次得到的值,相同校验成功。为了防止抓包,然后不停发送攻击的包“

这样做 咋就能防止攻击了呢?
攻击者也可以进行 把参数MD5加密后发给服务器啊。

阅读 2.7k
3 个回答

如果只做md5,一般要在md5时候,加一个appkey之类的东东,或者说salt,这个东东是不通过参数传递的(前后端都知道值),这样就防止别人篡改和构造请求了。

如果同时做md5和加密,也可以,密钥不传就可以了。

补充一下楼上的答案,重点说说重放攻击问题。

有可能请求被其他人抓包,拿来重复请求。
那么设计思路是下面这样的:

首先,所有方案在加密的时候都应该有一个约定的秘钥。保证攻击者不能自己算出sign

方案A:验证md5是否被请求过

这样每次请求都有一个唯一的md5,服务端在第一次完成请求后,把md5写入缓存。
下次处理请求之前先判断一下有没有这个md5,如果有就代表是重复请求。

但有没有想到这里有个缺点:
每一个请求都要写一个md5进缓存,请求量比较大的话非常占缓存

方案B:给参数里加个时间戳

如果时间差在60s以上,代表这个请求是被别人抓取到了,拿来做重复请求攻击。

这种方案也有缺点:
客户端和服务端的时间一致性要求比较高。

终极方案:两个结合一下。

时间戳+md5
1、时间差120s以上代表重复请求
2、md5写缓存,缓存时长120s(大于等于上面的值就行),判断如果有md5代表重复请求

这样相对比较好的解决了重复请求问题。

其实我倒是关注 将参数排序 这个不排序 有什么影响吗?如果直接把提交的数据拿来用不是更方便,毕竟安全体现再 appkey 上了啊

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