最近不知道怎么的迷上了计算机网络,喜欢抓各种包,于是乎接触到了嗅探,对其有了一些了解,遂码个博客记录一下( Wireshark 真的厉害)。
一、嗅探原理
-
用集线器Hub组建的网络是基于共享原理的,所有传输的数据在局域网中是共享的,换言之就是在同一局域网的所有网络接口都可以访问该局域网中正在传输的所有数据。那为什么对于某一用户而言,其他用户的数据不可见呢?关键在于每个计算机网卡都构建了一个“过滤器”,通过识别数据包中的地址来过滤掉与本机地址不匹配的信息,而嗅探只需要关闭这个“过滤器”,就可以接收所有数据包了。
-
用交换机Switch组成的网络基于交换原理,与集线器不同的是它并不会将数据包发送给全部设备,而是直接发送到目的地址。在这种情况下,嗅探又是如何“窥”到数据包的呢?既然交换机是将数据包直接发送给目的地址,那么如果我们将自己设备的地址伪装成数据包的目的地址是否就可以接收到此数据包呢?答案是肯定的,这就是嗅探获取交换机网络数据包的思路。既然要伪装成目的地址,那么就不得不说说交换机是如何确定目的设备的物理地址:
主机发送信息时将包含目标IP地址的ARP请求广播到网络上的所有主机,并接收返回信息,以此确定目标的物理地址。(ARP:Address Resolution Protocol,地址解析协议,与之相对应的还有RARP---Reverse Address Resolution Protocol,反向地址解析协议。)
因此,对于使用交换机组建的网络可以使用ARP欺骗的方式,通过改变MAC地址欺骗交换机将数据包发给自己,嗅探完成后再转发出去。
二、防范手段
如何保证自己的数据安全呢?我们改变不了底层数据包的s后发机制(也很难做到更好),那么只能通过使用更安全的传输协议或方式去让你的数据即使被截取也无法被识别。
- 从用户的角度:我们可以使用HTTPS访问网站,HTTPS全称为Hyper Text Transfer Protocol over Secure Socket Layer,它的实质是在HTTP的基础上加上SSL层,通过SSL层进行数据加密(SSL详情请看SSL)。 注意:并不是使用HTTPS就万无一失,你必须保证你的浏览器与目标服务器建立了安全的HTTPS连接,其连接状态通常会显示在浏览器地址栏的开头,通常会有几种颜色表示连接状态的安全等级。例如Chrome:
- 从网站运营者的角度:我们应该对传输的数据进行加密。
js加密可以吗?
普通的 js 加密是不能解决问题的,试想一下:如果别人获取到你的数据包,得到你密码加密后的字符串,然后使用该字符串作为密码,并屏蔽掉前端网页的js加密脚本进行提交,其发送的数据内容其实和你正常登陆的数据别无二致。
那应该如何加密呢?
我们需要服务器端进行动态配合,当用户请求时在服务器端生成一个随机的验证码key,保存,并将 key 发送至前端 js,js 得到 key 之后,使用 key 作为密钥对提交的数据进行加密后提交(例如:md5(md5(password) + key))。服务器端得到前端提交的加密后的字符串str1后,从数据库取出用户密码和 key ,进行同样的加密算法得到 str2 ,比较 str1 和 str2 就能得知密码是否正确。该方法的好处在于每次请求都生成一个随机验证码,并使用该验证码对数据进行加密,就算每次使用的密码都一致,HTTP数据包的内容也会因为验证码的不同而出现差异。保证了每次请求的唯一性。