为什么同一条消息,重放一次就可能骗过系统?
很多人第一次听到“重放攻击”时,会觉得这不就是把别人发过的合法请求再发一遍吗,系统怎么会这么容易上当。问题就在这里:如果服务端只检查“这条消息长得像不像真的”,却不检查“它是不是在正确的时间、正确的上下文里出现”,那攻击者根本不需要破解密码,也不需要看懂全部内容,只要把已经抓到的合法请求原样再送一次,门就可能又开了。早期很多门禁、支付确认、短信验证接口都栽过这种坑,因为设计者把“消息内容合法”和“这次动作合法”混为一谈了。
真正挡住重放攻击的,不是把消息写得更复杂,而是让每一次请求都带上“只能用一次”的证据。最常见的是 nonce、timestamp、sequence number,或者干脆做挑战-响应。这样服务端看到的就不再只是“你会不会说正确的话”,而是“你是不是在我刚刚给你的这道题上,按这一次的规则回答了”。这就是为什么很多安全协议总是在签名内容里塞进随机数、时间戳、会话标识,甚至把请求路径和方法也一起签进去。少一个字段,攻击面就可能多一块。
所以看一个认证方案安不安全,别只盯着“用了加密”这几个字。加密只能说明别人不容易看懂,不能说明别人不能拿着旧消息反复用。安全协议里最值钱的那部分,往往不是算法名字多吓人,而是它有没有把“这一次”绑定死。#Security
很多人第一次听到“重放攻击”时,会觉得这不就是把别人发过的合法请求再发一遍吗,系统怎么会这么容易上当。问题就在这里:如果服务端只检查“这条消息长得像不像真的”,却不检查“它是不是在正确的时间、正确的上下文里出现”,那攻击者根本不需要破解密码,也不需要看懂全部内容,只要把已经抓到的合法请求原样再送一次,门就可能又开了。早期很多门禁、支付确认、短信验证接口都栽过这种坑,因为设计者把“消息内容合法”和“这次动作合法”混为一谈了。
真正挡住重放攻击的,不是把消息写得更复杂,而是让每一次请求都带上“只能用一次”的证据。最常见的是 nonce、timestamp、sequence number,或者干脆做挑战-响应。这样服务端看到的就不再只是“你会不会说正确的话”,而是“你是不是在我刚刚给你的这道题上,按这一次的规则回答了”。这就是为什么很多安全协议总是在签名内容里塞进随机数、时间戳、会话标识,甚至把请求路径和方法也一起签进去。少一个字段,攻击面就可能多一块。
所以看一个认证方案安不安全,别只盯着“用了加密”这几个字。加密只能说明别人不容易看懂,不能说明别人不能拿着旧消息反复用。安全协议里最值钱的那部分,往往不是算法名字多吓人,而是它有没有把“这一次”绑定死。#Security