Cable Messenger : 通讯层加密传输方案


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:
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值