文章目录
Cable Messenger 在项目设计之初,就对数据安全提出了一定的要求。可以大致上分成“对通讯层加密”和“对敏感内容加密”。这里首先介绍“对通讯层加密”的相交内容。
作为一款IM产品,Cable Messenger 采用了HTTP超文本传输协议,TCP面向连接的传输控制协议,还在后面才介绍到的点对点近场通讯协议。而在长连接部分,在TCP基础上,我们采用了时下比较流行的更上层应用协议Websocket
。在以前的文章我也对Websocket
协议的实现以及其核心逻辑进行过比较详细的介绍,有兴趣的朋友可以查看<<用源代码简单透析Websocket背后的真相>> 这篇文章。
这里就先介绍我们基于HTTP超文本传输协议下,在数据传输前对数据进行加密的处理。
HTTPS
在客户端调用服务接口进行数据获取及提交的时候,我们经常用到这个协议。HTTPS在HTTP协议的基础上,添加了TLS密钥生成及交互规范,在对数据进行传输前对传输数据进行进行对称加密,在接收端对数据进行相应的对称解密,实现对数据内容进行简单的保护,解决了明文传输的问题。
也正因为HTTPS协议作为一个国际规范被大家所熟知,所以在很多传输环节可以对整个过程数据进行获取。现时大多数系统进行应用开发时,为保证数据有更进一部的安全性,会在调用HTTPS进行数据发送前,对数据进行再一次的应用内加密。
在加密领域,可大致分为:对称加密,非对称加密。对称加密相对于非对称加密,速度相对更快,可节省一定的CPU运算。但相较非对称加密,更容易被解密。这里就不展开细说了。
Cable Messenger 在调用HTTPS进行传输前采用于了AES对称加密算法。同时对AES加密后生成的加密数据,进行了一定的处理。这样可以一定程度上提高HTTPS传输的安全性。
以Swift
代码为例,截取部分核心代码如下:
///
/// HTTP请求层三:在数据发送前,对数据进行加密
/// - parameter urlString: 地址
/// - parameter header: 协议头参数
/// - parameter params: 表单提交参数
/// - parameter identity: 密钥生成策略参数
/// - parameter handler: 回调
///
public func doPost(sUrl:String,
header:[String:String]? = nil,
params:[String:Any],
identity:Bool = true,
handler:@escaping HandlerBlock) {
///1.生成密钥
let pearKey = self.createCsrf(identity:identity)
///2.生成通用HTTP协议头,及添加额外头信息
var headerParams:[String:String] = getCommonHeaderParams()
headerParams["csrf"] = pearKey.uuid
if let header:[String:String] = header{
for (key, value) in header{
headerParams[key] = value
}
}
///3.生成通用Body参数,及合并提交的参数
var postParams:[String:Any] = params
let commonBodyParams:[String:Any] = getCommonBodyParams()
for item in commonBodyParams{
postParams[item.key] = item.value
}
do{
///4.数据加密
let data:Data = try JSONSerialization.data(withJSONObject:postParams, options:.prettyPrinted)
guard let sJson:String = String(data:data, encoding:String.Encoding.utf8) else{
handler(nil, HTTPRequestError(type:.ParamError, msg:"JSON序列化失败"))
return
}
///4.1 对Body参数进行序列化,生成JSON字符串
var chatSet:CharacterSet = CharacterSet.urlQueryAllowed
chatSet = chatSet.intersection(CharacterSet(charactersIn:"#%<>&=[\\]^`{|}\"]+").inverted)
guard let json: