在网上看到一个方案是:“客户端将参数排序进行MD5加密后,得到sign。 服务端再次将你的参数排序进行MD5加密,比较两次得到的值,相同校验成功。为了防止抓包,然后不停发送攻击的包“
这样做 咋就能防止攻击了呢? 攻击者也可以进行 把参数MD5加密后发给服务器啊。
3 回答
一只名叫tom的猫
TA贡献1906条经验 获得超3个赞
如果只做md5,一般要在md5时候,加一个appkey之类的东东,或者说salt,这个东东是不通过参数传递的(前后端都知道值),这样就防止别人篡改和构造请求了。
如果同时做md5和加密,也可以,密钥不传就可以了。
精慕HU
TA贡献1845条经验 获得超8个赞
补充一下楼上的答案,重点说说重放攻击问题。
有可能请求被其他人抓包,拿来重复请求。
那么设计思路是下面这样的:
首先,所有方案在加密的时候都应该有一个约定的秘钥。保证攻击者不能自己算出sign
方案A:验证md5是否被请求过
这样每次请求都有一个唯一的md5,服务端在第一次完成请求后,把md5写入缓存。
下次处理请求之前先判断一下有没有这个md5,如果有就代表是重复请求。
但有没有想到这里有个缺点:
每一个请求都要写一个md5进缓存,请求量比较大的话非常占缓存
方案B:给参数里加个时间戳
如果时间差在60s以上,代表这个请求是被别人抓取到了,拿来做重复请求攻击。
这种方案也有缺点:
客户端和服务端的时间一致性要求比较高。
终极方案:两个结合一下。
时间戳+md5
1、时间差120s以上代表重复请求
2、md5写缓存,缓存时长120s(大于等于上面的值就行),判断如果有md5代表重复请求
这样相对比较好的解决了重复请求问题。
添加回答
举报
0/150
提交
取消