Skip to content

接口加密与解密

接口加密与解密

简介

接口加密与解密是在数据传输过程中保护数据安全性的重要技术,通过加密技术,可以确保数据在传输和存储过程中不被未经授权的用户或恶意攻击者访问或窃取。

base6简介

  1. 什么是base64编码:

    • base64在实质上就是一种通过64个字符来对二进制数据进行表示的方式。而所谓的base64编码,就是从二进制编码转化为64字符编码的具体过程。
  2. 有什么用途呢?

    • 可以让中文字或者图片也能在网络上顺利传输。
    • 由于二进制的一些字符在网络协议中属于控制字符,不能直接传送,因此需要用Base64编码之后传输,编码之后传输的是一些很普通的ASCII字符。
    • Base64常用于邮件编码,当邮件中有二进制数据时,就要编码转换。
    • base64 最早就是用来邮件传输协议中的,原因是邮件传输协议只支持 ascii 字符传递,因此如果要传输二进制文件,如:图片、视频是无法实现的。因此 base64 就可以用来将二进制文件内容编码为只包含 ascii 字符的内容,这样就可以传输了。 3. 为什么要作一下这样的编码呢?
    • 在计算机中任何数据都是按ascii码存储的,而ascii码的128~255之间的值是不可见字符。而在网络上交换数据时,比如说从A地传到B地,往往要经过多个路由设备,由于不同的设备对字符的处理方式有一些不同,这样那些不可见字符就有可能被处理错误,这是不利于传输的。所以就先把数据先做一个Base64编码,统统变成可见字符,这样出错的可能性就大降低了。
  3. Base64到底是怎样编码的呢?

    • 标准base64只有64个字符(英文大小写、数字和+、/)以及用作后缀等号;
    • base64是把3个字节变成4个可打印字符,所以base64编码后的字符串一定能被4整除(不算用作后缀的等号);
    • 等号一定用作后缀,且数目一定是0个、1个或2个。这是因为如果原文长度不能被3整除,base64要在后面添加\0凑齐3n位。为了正确还原,添加了几个\0就加上几个等号。显然添加等号的数目只能是0、1或2;
    • 严格来说base64不能算是一种加密,只能说是编码转换。使用base64的初衷。是为了方便把含有不可见字符串的信息用可见字符串表示出来,以便复制粘贴;

解决方案

  • 通用加密算法
    • 场景:了解数据使用的通用加密算法,例如 base64。
    • 解决方案:使用通用的解密算法在获取加密响应信息后,对数据进行解密操作。
  • 研发提供加解密 lib
    • 场景:不了解对应的加密算法。
    • 解决方案:需要研发提供加解密对应的 lib 包,完成数据解密。
  • 提供远程解析服务
    • 场景:既不是通用加密算法,研发也无法提供 lib 包。
    • 解决方案:需要加密方提供远程解析服务,这样既解决了加解密问题,研发方也无需担心加解密算法暴露的问题。

实战演示

接下来对 httpbin 服务发起一个 base64 加密后的数据信息,httpbin 服务会将返回此加密数据,通过这个方式,模拟一个加密后的响应数据。

获取到加密后的响应数据,对获取的加密数据进行解密,在对获取到解密后的数据进行断言。

Python 演示代码

import requests
import base64

# 加密
secret_msg = base64.b64encode("霍格沃兹".encode('utf-8'))

def send():
    url = "https://httpbin.ceshiren.com/post"
    data = {"msg": secret_msg}
    # 发送接口请求
    res = requests.post(url, data=data)
    # 获取加密的响应数据
    print(res.json())
    msg = res.json()["form"]["msg"]
    # 对获取的加密数据进行解密
    encoded_str = base64.b64decode(msg).decode('utf-8')
    print(encoded_str)
    assert encoded_str == "霍格沃兹"

send()

Java 演示代码

import org.apache.commons.codec.binary.Base64;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import java.nio.charset.StandardCharsets;
import java.util.LinkedHashMap;
import static io.restassured.RestAssured.given;

public class TestDecode {
    @Test
    void testDecode(){

        // 加密一串数据
        byte[] data = "hogwarts".getBytes(StandardCharsets.UTF_8);
        String secretMsg = Base64.encodeBase64String(data);

        // 发起请求,并获取响应信息
        LinkedHashMap<String, String> responseForm =
            given()
                .formParam("msg", secretMsg)  // 提交表单数据
            .when()
                .post("https://httpbin.ceshiren.com/post")  // 发起POST请求
            .then()
                .log().all()  // 打印完整响应信息
                .extract().path("form");  // 提取form信息

        // 提取加密字段
        String encodedMsg = responseForm.get("msg");

        // 解密操作
        String decodedMsg = new String(Base64.decodeBase64(encodedMsg));
        // 响应断言
        Assertions.assertEquals("hogwarts", decodedMsg);
    }
}

总结

  • 接口加密
  • 接口解密