HTTPS 能防止重放攻击吗?为什么?
SSL1.0安全隐患
SSLv1.0是Netscape公司发明的Secure Socket Layer 1.0版本,也是第一个版本,用于安全加密保护http,http主要用于包装电子购物。
但是由于SSLv1.0发送方不对发出的message个数计数,接收方也不对接收到的message计数。换句话说,通信双方message数量没有记忆,这样就给第三方可乘之机。第三方可以将截获的message再次发出,这样接收方校验成功,于是提交给应用程序。应用程序会再次执行code,如果这个执行code是转账付款,那问题就大了。
这个安全漏洞很快就被SSLv2.0修复,修复方法很简单,发送方对发出的message个数计数,接收方也对接收到的message计数。然后将message的序号,作为HMAC输入的一个参数,加密发送到对方。
接收方接收到之后,和发送方执行同样的校验方法(HMAC),由于双方的输入参数是一模一样的,而且message的序号也是一样的,所以校验通过,提交给应用程序。如果被第三方replay,就无法通过安全校验,从而被丢弃,对应用程序的影响=0。
假设发送方老王发送的message的序号 =3, 且这个message被接收方老李成功接收。
第三方老黑将序号=3的message 重新发一次,那么老李收到message的时候,序号就不是3了,因为序号3已经收到了,至于序号是4、5、6还是什么不重要,重要的是序号≠3,那么安全校验一定会以失败而告终。
聪明的读者可能会说,为何老黑不将message的序号3修改成4、5、6或者别的,那还是有可能成功的,对吗?
很遗憾,你无法做到,因为message序号是隐含的(implicit)。
什么是隐含序列号?
隐含是什么意思呢?
也许读者会很意外,message报文本身是没有序号的,这个序号只有发送方知道。老王你连自己发送了多少个message都不知道吗?每发一个包裹(message)先后次序都不知道?
老王说,俺当然知道。
老李我问你,你从老王收多少个包裹知道吗,每个包裹先后次序知道吗?
老李幽幽地说,俺收到多少个包裹是知道的,先后次序(序号)也是知道的,本来俺无法确定包裹来自老王,但是好在有HMAC安全校验码的帮助,包裹确实都来自于老王。因为除了俺之外,只有老王知道HMAC的密钥。
为何SSL/TLS要跑在TCP上,而不是UDP上?
答案也很简单,因为UDP无法确保message的到达顺序,会造成双方message的序号不一致而通信失败。而TCP可以确保message的到达顺序,可以确保双方序号一致,从而确保HMAC校验成功。
