网络框架- HTTP加密策略介绍

做网络框架,势必要与http请求打交道,那么加密策略也是各大公司必不可少的部分。这篇文章我来总结下我接触过的加密算法和策略。

一、基础

首先http协议本身存在安全性问题,主要为如下几点:

  • 数据隐私性:通信使用明文、内容可能被窃取。
  • 数据完整性:无法证明报文完整性,内容可能遭篡改。
  • 身份认证:不验证通信方身份,可能遭遇伪装。

因此要解决这些问题,就引入了加密。那么目前加密主要分两大类:

  • 自定义:说白了就是跟服务端约定好加解密方案和规则,对请求和响应进行加密,防止明文裸奔,同时做好完整性认证和身份认证。
  • 三方:用https,https在http基础上增加了ssl加密层,对传输数据帮你做好了加解密,通过购买证书、添加证书记录、颁发证书后上传来完成域名https化就行。客户端只需要配置下网络库去支持https,目前volley和okhttp都支持https。

二、加密算法

好,那么不管是自定义还是三方方案,都会用到加密算法,那么基本加密算法还是有必要了解下。

2.1 签名和加密

A向B发送信息,数据签名是让B确认信息是A发送的,不是别人。而数据加密保证数据不能被除B之外的其他人获取到。

2.2 加密算法

1)对称性加密算法
加密和解密使用同一个密钥(私钥),信息接收双方都需事先知道密匙和加解密算法。

AES 高级加密标准,又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。

  • ECB模式 (Electronic Codebook Book)将整个明文分成若干段相同的小段,然后对每一小段进行加密。
  • CBC模式(Cipher Block Chaining)先将明文切分成若干小段,然后每一小段与初始块或者上一段的密文段进行异或运算后,再与密钥进行加密。

优点:加解密速度快、效率高。
缺点:对称加密时,都需要使用其他人不知道的唯一秘钥,密钥数量巨大,管理和分发非常困难,秘钥一旦泄露,加密信息就不安全了。
作用:对传输明文加解密。

2)非对称加密算法
加密和解密所使用的不是同一个密钥,通常有两个密钥,称为"公钥"和"私钥",它们两个必需配对使用,否则不能打开加密文件。双方分别生成公私钥,公钥给对方,私钥自己保留。拿对方的公钥向对方发送加密信息,对方拿私钥解密。

RSA 目前主流的非对称加密算法。

优点:秘钥管理方便,安全性高。
缺点:加解密过程复杂,耗时长,只适合对少量数据加密。
数据加密:任何发送方都可以用接收方的公钥加密,接收方用对应的私钥解密。
数据签名:用发送方的私钥加密,任何接收方都可以用发送方公钥解密。

3)散列算法/哈希算法
一种单向加密算法,过程不可逆。

MD5 信息摘要算法。把任意数据转换为定长(或限制长度)的数据,

SHA1 也是一种哈希算法,与md5类似。SHA1摘要比md5长32位,安全性更好,但是运算步骤要多一些,所以慢一些。

作用:进行一致性验证、数字签名、安全访问认证。

4)密钥交换方案
D-H 依赖的是:离散对数运算。

有两个公开的数g和p,其中p为素数,g是p的一个元根。
甲:私钥a  A = g^a mod p  把A发给乙
乙:私钥b  B= g^b mod p 把B发给甲

甲:B^a mod p = Fkey
乙:A^b mod p =Skey

Fkey = Skey
只要私钥不泄漏就行。

ECDH = ECC +DH https使用ECDH密钥交换.
DH和ECDH的主要的作用就是在通信双方发送一些公有参数,保留私有参数,而后通过一系列计算双方都能够得到一个一致的结果。而这个运算的逆运算复杂度过高,在有限时间内不可解(至少量子计算机问世以前不可解),以保证密钥安全性。

5)其他算法
严格意义上不算加密。

Base64 一种编码方式,用来将非ASCII字符的数据转换成ASCII字符的一种转换算法。

作用:便于网络传输。

算法基本分这么四类,每一类都包含但不限于这么几种,每类我只例举了目前最为主流的方案,最个基本介绍。

三、加密策略

那么,介绍完加密算法,接下来谈谈目前主要使用的加密策略。

3.1 RSA+SHA1

用SHA算法进行签名,用RSA算法进行加密。

加密流程:
1)利用私钥将请求参数进行 SHA1withRSA 签名即可。

/**
* 进行sha1 Rsa算法签名
* @param str
* @param privateKey
* @return
*/
public static byte[] sha1WithRsa(String str, PrivateKey privateKey) {
    try {
        Signature signature = Signature.getInstance("SHA1withRSA");
       signature.initSign(privateKey);
       signature.update(str.getBytes());
       return signature.sign();
   } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
   } catch (SignatureException e) {
        e.printStackTrace();
   } catch (InvalidKeyException e) {
        e.printStackTrace();
   }
    return null;
}

2)加密完成开始打包参数。

主要玩的是这个类:/Android/sdk/sources/android-27/java/security/Signature.java

3.2 RSA+AES

使用RSA来首先传输AES的密钥给对方,然后再使用AES来进行加密通讯。

加密流程:
1)将请求参数进行AES加密。

public static byte[] encryptByAes(String data, String pass, String init,
       String mode) throws Exception {
    String transformation;
    //选择CBC or ECB模式
   if (mode.equals(Constant.ECODE_METHOD)) {
        transformation = Constant.AES_TRANSFORMATION_CBC;
   } else {
        transformation = Constant.AES_TRANSFORMATION_ECB;
   }
    try {
        Cipher cipher = Cipher.getInstance(transformation);
       int blockSize = cipher.getBlockSize();
       ...
       // 将随机生成的密码变成AES算法的私钥
       SecretKeySpec keyspec = new SecretKeySpec(hexString2Bytes(pass),
               "AES");
       // ECB don't need ivspec
       IvParameterSpec ivspec = new IvParameterSpec(init.getBytes());
       if (mode.equals(Constant.ECODE_METHOD)) {
            cipher.init(Cipher.ENCRYPT_MODE, keyspec, ivspec);
       } else {
            cipher.init(Cipher.ENCRYPT_MODE, keyspec);
       }
        byte[] encrypted = cipher.doFinal(plaintext);
       return encrypted;
   } catch (Exception e) {
        e.printStackTrace();
       return new byte[0];
   }
}

2)利用私钥将AES加密后的结果进行RSA加密。

/**
* 进行Rsa算法加密
* @param data 需要加密的数据
* @param privateKey 加密所需要的私钥
* @return
*/
public static byte[] encryptByRsa(String data, PrivateKey privateKey) {
    try 
       Cipher cipher = Cipher.getInstance(Constant.RSA_TRANSFORMATION);
       cipher.init(Cipher.ENCRYPT_MODE, privateKey);
       byte[] encryptData = cipher.doFinal(data.getBytes());
       return encryptData;
   } catch (Exception e) {
        e.printStackTrace();
       return new byte[0];
   }
}

3)加密完成开始打包参数。

主要玩的是这个类:Android/sdk/sources/android-27/javax/crypto/Cipher.java

公司保密性原因,具体细节不便过多透露,这里了解个大概策略就行,具体加解密代码网上应该能搜到一大堆。

3.3 数据签名
这种方案就纯跟服务端去自定义你们觉得合适的加密方式来满足明文保密、明文完整性验证和身份验证的需要。

3.4 Https

HTTPS = HTTP+SSL(TLS)。

原本HTTP和TCP/UDP直接通信,而加了SSL后,就变成HTTP先和SSL通信,再由SSL和TCP/UDP通信。

HTTPS和HTTP的主要区别:

  • https协议需要到ca申请证书,一般免费证书较少,需要一定费用。
  • http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议。
  • HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。

说白了,https就是在http协议层面帮你做了加密。

优点:加密传输、身份认证、安全性高。

缺点:

  • HTTPS协议握手阶段比较费时,会使页面的加载时间延长,同时增加耗电;(这个没验证过具体程度)
  • 证书需要一定费用。
  • 加密和证书都依赖第三方,存在风险。

Https也是对称加密和非对称加密结合的方式。

https流程解析:


https流程

client -> http请求 ->server
server ->证书(公钥、私钥)->公钥->client
client ->TLS验证公钥有效- 生成随机数用公钥加密生成私钥 ->server
server->用随机数私钥对明文进行对称加密 -> client
client ->随机数私钥对明文解密->server

各加密算法在https中的作用:
CA证书:由它生产的公钥能确认服务端正确性,防止中间人攻击。
AES:明文加密,但是加密效率高,但是密钥不安全。
RSA:保证AES密钥安全性。
DH/ECDH:向前安全。

注:只要 rsa 私钥被破解了,就可以解开以前的信息的对称密钥,然后就破解了以前的信息。
而 DH 是当时 client 和 server 共同算出的对称密钥,即时 rsa 私钥被破解,以往的信息仍然是安全的。

四、实战

参考:
HTTPS的加密原理
https 的加密原理
请教DH算法在混合加密中,到底起什么作用?

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
禁止转载,如需转载请通过简信或评论联系作者。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,362评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,330评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,247评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,560评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,580评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,569评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,929评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,587评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,840评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,596评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,678评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,366评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,945评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,929评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,165评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,271评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,403评论 2 342