jsoncpp库的安装使用
sudo yum install jsoncpp-devel
使用jsoncpp包含头文件<jsoncpp/json/json.h>
Makefile要添加链接jsoncpp库的选项-ljsoncpp
HTTP协议
应用层:通俗说就是程序员在socket接口之上编写的具体逻辑,其中很多工作都是和文本处理有关的(协议分析与处理)。
所以http协议,也就是超文本传输协议,也一定会存在大量的文本分析和协议处理。
协议名称://服务器IP[:端口号]/web根目录
如果用户想在URL中包含URL本身就用来作为特殊字符的字符,URL形成的时候,浏览器会自动进行编码(encode)。
所以,服务端收到这样的请求之后,一般都需要进行特殊字符的转回(decode)。
http协议作为应用层的协议,底层所采用的是TCP协议。
http的请求和响应的报文格式,单纯从报文的角度,http可以看作是基于行的文本协议。
http request的协议版本用于告诉server端,client端用的协议版本;而http response的协议版本用于告诉client端,server端用的协议版本。
http是如何区分报头和有效载荷的呢?
是通过空行的方式来区分的。
我们平时的上网行为无非就两种:
a.从服务端拿取数据 — GET
b.把数据从客户端进行提交 — POST, GET
GET方法通过URL传参,会回显输入的私密信息,进而不够私密;
POST方法通过正文提交参数,不会进行回显,一般而言私密性是有保证的。
对数据进行加密和解密才是安全性上的问题。
HTTP协议还有很多方法,但最常用也就是GET和POST方法了。
HTTP协议的状态码主要分为以下五类:
错误码类别 | 状态类别 | 原因解释 |
---|---|---|
1XX | Informational(信息性状态码) | 接收的请求正在处理 |
2XX | Success(成功状态码) | 请求正常处理完成 |
3XX | Redirection(重定向状态码) | 需要进行附加操作以完成请求 |
4XX | Client Error(客户端错误状态码) | 服务器无法处理请求 |
5XX | Server Error(服务器错误状态码) | 服务器处理请求出错 |
永久重定向301 vs 临时重定向302
临时重定向:不影响用户后续的请求策略
永久重定向:会影响用户后续的请求策略
HTTP协议特征:简单快速,无连接,无状态
HTTPS协议
HTTPS协议是在HTTP协议的基础上引入了一个加密层。
HTTP协议的内容都是按照文本的方式明文传输的,所以当明文数据经过路由器等中间设备传输时,一旦被劫持,传输的内容也就完全被暴露出来了,劫持者甚至可以在不被客户端和服务器双方察觉的情况下进行信息的篡改,这就是所谓的中间人攻击。所以对传输的信息进行加密是必须的。
- 什么是加密
所谓加密就是把明文进行一系列变换,生成密文;
解密就是把密文再进行一系列的变换,还原成明文;
在这个加密和解密的过程中,需要密钥来辅助这一系列的转换。 - 常见加密方式
- 对称加密
对称加密的特征就是:加密和解密所用的秘钥是相同的。
也就是同一个密钥可以用作信息的加密和解密。
对称加密其计算量小,加密速度快,加密效率高。 - 非对称加密
需要两个密钥来进行加密和解密。这两个密钥就是公开密钥(公钥)和私有密钥(私钥)。
通过公钥对明文加密,可以变成密文;通过私钥对密文解密,可以变成明文;
也可以反过来用,
通过私钥对明文加密,可以变成密文;通过公钥对密文解密,可以变成明文。
非对称算法其算法强度复杂,加密解密速度比对称加密解密要慢很多。
- 数据摘要(数据指纹) & 数字签名
数据摘要(数据指纹),其基本原理就是利用单向散列函数(Hash函数)对信息进行运算,生成一串固定长度的数字摘要。这并不是一种加密机制,但可以用来判断数据有没有被篡改过,通常用来进行数据对比。
MD5就是常见的摘要算法。
数据摘要经过加密,就得到了数字签名。 - CA证书
服务端在能使用HTTPS协议前,需要向CA机构申领一份数字证书,这份证书就如同身份证一样,向客户端浏览器证明服务端公钥的权威性。
当服务端申领CA证书的时候,CA机构会对服务端进行审核,并专门为该网站形成数字签名,过程如下:
- CA机构拥有非对称加密的公钥A和私钥A’
- CA机构对服务端申请的证书明文数据进行hash,形成数据摘要
- 然后对数据摘要用私钥A’加密,得到数字签名
服务端申请的证书明文和数字签名共同组成了数字证书,这样一份数字证书就是服务端所申请的CA证书了。
HTTPS协议的加密层正是通过非对称加密+对称加密+CA认证来完成的。
所以,HTTPS协议工作过程涉及到的密钥有三组:
- 第一组是非对称加密密钥,用于校验证书是否被篡改;
- 第二组是非对称加密密钥,用于协商生成对称加密的密钥;
- 第三组是对称加密密钥,用于后续客户端和服务器传输数据时进行对称密钥的加密解密。
其实这一切的关键都是围绕这个对称加密的密钥展开的:
第一组非对称加密的密钥是为了让客户端拿到第二组非对称加密的公钥;
第二组非对称加密的密钥是为了让客户端把这个对称密钥传给服务器。