post和get
首先呢,登录是要用post请求,还是用get请求。这个我一下子没明白,因为大家都说post比get更安全,然后我就了解了一下,大家会说这个是因为get请求是直接把参数放在querystring(长度限制255)里的,可以直接被看到,而post是把参数放在body里,不能直接被看到。但其实只要截获了这个报文是可以看到body里的内容的。这时候就想到要给账号密码进行hash加密,加密后就不是明文了嘛。
重放攻击
我以为这样就万事大吉了,结果有给我知道一个重放攻击,就是拿着加密后的账号密码直接去访问服务器就好了(把其中的其他操作参数进行更改),不管加没加密,都可以一样访问。防止重放攻击的方案我又了解到有timestap(在http请求里加上timestap参数,限定在60s内这个报文是安全的,缺点:60s内的重放攻击无法防止)和nonce(在本地用Mac地址、时间戳、token啥的生成一个唯一字符串,在服务器上存储收到过的字符串,收到请求的时候判断这个字符串之前是否有请求过,缺点:集合越来越大,占内存)所以有一个优化的方案就是timestap和nonce一起用,大于60s就清空一次集合。
HTTPS
但这样搞我觉得太麻烦了嘛,我就想看看有没有什么简单的方法,然后就知道了https。https的思路就是对数据进行对称加密,对称加密所要使用的密钥通过非对称加密传输。然后这个公钥是服务器告诉大家的,客户端用公钥加密了自己的私钥传给服务器,服务器再用自己的私钥去解密这个公钥。(因为用私钥对称加密,解密的速度比较快)服务器的公钥和私钥就是来自证书机构,所以只要证书机构安全,https就没有问题。
中间人攻击
这时候我又知道了一个中间人攻击,中间人攻击分为两种。
SSL劫持攻击
将自己接入到客户端和服务器中间,将公钥替换成自己的公钥。
SSL剥离攻击
也要将自己设为中间人,与客户端HTTP明文会话,与服务器继续HTTPS会话
数字签名
这时候将明文hash生成摘要,用私钥加密摘要和明文,到服务器再用私钥解密,再在服务器hash一次明文,看看是否和摘要是一样的。
参考文章:
https://blog.youkuaiyun.com/weixin_42375964/article/details/108269784
https://blog.youkuaiyun.com/weixin_42375964/article/details/109132907
https://blog.youkuaiyun.com/weixin_42375964/article/details/108269850