重放攻击-实例解析
主要讲两点一,是么是重放攻击?
二,怎么样防止重放攻击?
一,重放攻击:顾名思义,重:再次放的意思。
主机A要给主机B发送报文,中间重放攻击的主人可以是A,或者是攻击者C
:当是A时,表示A会重复发送相同的报文给B,
:当是C时,表示C截获了A发送给B的报文,然后再伪装成A给B发送其截获的报文
重放攻击的含义:主机A给主机B发送的报文被攻击者C截获了,然后C伪装成A给B发送其截获来的报文,而B会误以为C就是A,就把回应报文发送给了C。
虽然A是加密的,但C根本不用破译。
实例分析:登录验证
登录验证的基本流程:(4步)
1,前端:
用户输入账号,密码,然后登录
2,用户在发送登录请求之前,web端会首先对明文密码进行md5加密(而加密后的密码会储存于后端的数据库中)
3,提交账号及md5加密后的密码
4,请求到达后端,将 从数据库中提取的账号与密码和现在提交的账号与密码进行比较,如果相同,则登录成功。
那么在这中间会出现什么问题呢?
思考:这个过程安全吗?
我们知道,在此过程中传输的是经过md5加密后的密码,即使被监听者截取到,而md5是不可逆的,明文密码也不会泄露的 。
其实不然,监听者无需解出密码明文,即可登录——因为监听者只需将监听到的URL(uniform )重放一下,即可冒充你的身份登录系统。
下面我们讲解一下稍微安全一点的登录:
关键是:进行了两次加密,且攻击者的session中的随机码与数据库中的随机码相同的概率可以忽略。
1,进入前端用户登陆界面时生成一个随机码(盐值)(此随机码会在客户端和后端session中各保存一个)
2,用户在发送登录请求之前,web端首先会对明文密码进行md5加密,存于数据库中,然后加密后的密码再与盐值连接,再进行md5加密
最后密码=md5{[md5(明文密码)]+随机码}
3,请求到达后端后,将 从数据库中提取的md5加密后的密码+后端session中的盐值进行md5加密,与发送来的密文进行对比,若相同,则成功。
更安全的登陆流程:
1,系统随机生成一个固定盐值,uerooejioeueo%@*?.,*6hgk,>ikuolm 足够复杂
2,当用户注册,修改密码时,明文密码会先于固定盐值连接,进行md5加密,然后再与随机码连接再次进行md5加密
最后密码=md5{【md5(明文密码+固定盐值)】+随机码}
最后更加完善的方式:
1,设置登陆验证码、
2,错误达到一定次数,锁定账号几分钟
3,存数据库前再加一次盐,然后再md5一次,防止拖库被猜密码
二,防御方案:
1,加随机数:双方只需要记住各自使用过的随机数,不能有重复数,如果报文中有以前使用过的随机数,则被认为是重放攻击
优点:双方不需要保持时间的同步,
缺点:需要额外保存使用过的随机数,则需要保存和查询开销
2,加时间戳:时戳——代表当前时刻的数
而重放的时戳将相对远离当前时刻
优点:不需要内存开销
缺点:通信各方的计算机时钟必须保持同步(同步越好,受攻击的可能性越小)
3,加流水号:双方在报文中添加一个逐步递增的整数,则只要收到一个不连续的流水号报文(太大或者太小)就认为有重放威胁
优点:不需要时间同步,保存的信息量小
缺点:攻击者如果对报文解密成功,就获得了流水号进而会伪造数据