Internal APIs encrypt Method V1.0

简单对称密码加密解密

2018/10/19 我们发现大量的非法不带参数的Http请求访问我们的 apihost, 请求日志文件如下所示。

1
2
3
4
5
183.223.44.221 - - [19/Oct/2018:16:47:32 +0800] "POST /api_interface? HTTP/1.1" 200 174 "-" "okhttp/3.10.0"
请求者IP:183.223.44.221
请求接口:api_interface
请求方式:POST
请求者UA:okhttp/3.10.0

问题引申:既然是非法请求,为什么黑客没有带参数的请求?
实际上这是一个很好的问题,如果接口没有做任何安全处理的话,黑客通过抓包很容易拿到请求参数规则,然后通过模拟请求达到目的。一旦接口做过”特殊工艺”处理了,黑客即将无处是从了。最终他们的心态都是从破解到放弃这样一个过程。

正确的请求姿势:

实际上我们的设计接口的时候会有一个统一的接收参数 params 用来接收我们的数据,正确的请求如下:

1
2
3
4
5
183.223.44.221 - - [19/Oct/2018:16:47:32 +0800] "POST /api_interface?params=sM4AOVdWfPE4DxkXGEs8VFmEsZRgy58UYDPD7PjVYQXx1GEFrbjXMo11fb9x6ppwuaAeXV3n2DtoW4lG22nM0g HTTP/1.1" 200 174 "-" "okhttp/3.10.0"
请求者IP:183.223.44.221
请求接口:api_interface?params=sM4AOVdWfPE4DxkXGEs8VFmEsZRgy58UYDPD7PjVYQXx1GEFrbjXMo11fb9x6ppwuaAeXV3n2DtoW4lG22nM0g
请求方式:POST
请求者UA:okhttp/3.10.0

拓扑结构:

什么请求者IP,请求方式,UA都不是重点。重点在于我们的接口都会有一个params的参数,而这个参数的本身是通过加密算法形成的,即使黑客捕获到这串没有意义的密文也头疼。因为我们和客户端程序有规定所有请求的参数必须要用公钥加密后再通过特点的算法传递,同时服务器端返回的数据也是通过这套算法加密后传输。拓扑结构如下图。

为什么要数据加密?

安全,安全,安全。

解决方案:

现在通过一个示例完整的描述一下我们的接口设计中加密解密过程。

公钥
上文中说道,我们同时约定了一套公钥给服务器端与客户端,为了配合下面的算法使用所以我们采用Int 类型的数字。现在定义为 KEY = 110; 为了确保安全性这个KEY只有内部知道。

算法

  • XOR (with KEY)
  • BASE64 (encode/decode)
  • URLEncode/URLDecode

Eg.客户端 zhangsan 执行登录请求

将要发送的数据:
{username:zhangsan,password:123456,action:login}

1
2
3
4
5
6
7
8
9
Map<String,String> reqMap = new HashMap<String,String>();
int key = 110;//客户端与服务器端共同约定的公钥

@Before
public void be() {
reqMap.put("username", "zhangsan");
reqMap.put("password", "123456");
reqMap.put("action", "login");
}

加密算法 (java实现)

1
2
3
4
5
6
7
8
9
10
11
12
13
//1.xor
byte[] byteArry = reqMap.toString().getBytes();
for (int i = 0; i < byteArry.length; i++) {
byteArry[i] = (byte) (byteArry[i] ^ key);
}

//2.base64.ecode
String encode = new BASE64Encoder().encode(byteArry);

//3.url.encode
String dist = URLEncoder.encode(encode, "UTF-8");

System.out.println("params="+dist);

输出的params为:
params=FR4PHR0ZARwKU19cXVpbWEJODw0aBwEAUwIBCQcAQk4bHQscAA8DC1MUBg8ACR0PABM%3D

解密算法 (java实现)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
String params = "FR4PHR0ZARwKU19cXVpbWEJODw0aBwEAUwIBCQcAQk4bHQscAA8DC1MUBg8ACR0PABM%3D";

//1.url.decode
String decode = URLDecoder.decode(params, "UTF-8");

//2.base64.decode
byte[] byteArry = new BASE64Decoder().decodeBuffer(decode);

//3.xor
for (int i = 0; i < byteArry.length; i++) {
byteArry[i] = (byte) (byteArry[i] ^ key);
}

System.out.println("dist:"+new String(byteArry));

输出的dist为:
dist={username:zhangsan,password:123456,action:login}

对称加密优缺点

对称加密算法的优点是算法公开、计算量小、加密速度快、加密效率高。适用于简单的报文加密,同时也使用用大报文加密。
对称加密算法的缺点是在数据传送前,发送方和接收方必须商定好秘钥,然后使双方都能保存好秘钥。其次如果一方的秘钥被泄露,那么加密信息也就不安全了。

常用的对称密钥算法

加密和解密都使用同一把秘钥,这种加密方法称为对称加密,也称为单密钥加密。
简单理解为:加密解密都是同一把钥匙。
AES、DES、3DES、TDEA、Blowfish、RC2、RC4、RC5、IDEA、SKIPJACK 等。

Fred范方青 wechat
项目合作请联系我私人微信: fredtv23
0%