客户端加密压缩,服务器端解压缩解密

#数据安全# 客户端加密压缩,服务器端解压缩解密

摘要

客户端加密压缩,服务器端解压缩解密,考虑到安全,客户端请求时传递的数据需要加密。 考虑到效率,客户端请求头要减小可以采用Gzip把postdata压缩。注意顺序,先压缩再加密。到了服务器端先解密后解压。

请求流程

考虑到安全,客户端请求时传递的数据需要加密。
考虑到效率,客户端请求头要减小可以采用Gzip把postdata压缩。
注意顺序,先压缩再加密。到了服务器端先解密后解压。

代码组织

服务器端使用 springboot 架构
加密解密

package cn.shanchuan.ut;

import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;

import org.apache.commons.codec.binary.Base64;


public class Encryptor {

    private static String key = "Bar22222Bar11111"; // 128 bit key
    private static String initVector = "RandomInitVector"; // 16 bytes IV


    public static String base64(byte[] datas) {
        return Base64.encodeBase64String(datas);
    }

    public static byte[] encrypt(byte[] bytes) {
        try {
            IvParameterSpec iv = new IvParameterSpec(initVector.getBytes("UTF-8"));
            SecretKeySpec skeySpec = new SecretKeySpec(key.getBytes("UTF-8"), "AES");

            Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5PADDING");
            cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv);

//            byte[] encrypted = cipher.doFinal(value.getBytes());
            byte[] encrypted = cipher.doFinal(bytes);
//            return Base64.encodeBase64String(encrypted);
            return encrypted;
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return null;
    }


    public static byte[] decrypt(byte[] encrypted) {
        try {
            IvParameterSpec iv = new IvParameterSpec(initVector.getBytes("UTF-8"));
            SecretKeySpec skeySpec = new SecretKeySpec(key.getBytes("UTF-8"), "AES");

            Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5PADDING");
            cipher.init(Cipher.DECRYPT_MODE, skeySpec, iv);
//         byte[] original = cipher.doFinal(Base64.decodeBase64(encrypted));
            byte[] original = cipher.doFinal(encrypted);
            return original;
//            return new String(original);
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return null;
    }


    public static void main(String[] args) {

        String str = "Hello World";
        System.out.println("加密后:" + base64(encrypt(str.getBytes())));//在控制台输出需要base64
        System.out.println("解密后:" + new String(decrypt(encrypt(str.getBytes()))));//解密后是字节数组还需要String

    }
}

这里使用java实现的对称加密.

关注代码

Gzip解压缩

package cn.shanchuan.ut;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.zip.GZIPInputStream;
import java.util.zip.GZIPOutputStream;


public class Gzip {

    public static byte[] gunzip(byte[] bytes) throws IOException {
        ByteArrayInputStream bis = new ByteArrayInputStream(bytes);
        GZIPInputStream gzis = new GZIPInputStream(bis);
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        byte[] buf = new byte[1024];
        int n = 0;
        while ((n = gzis.read(buf)) != -1) {
            bos.write(buf, 0, n);
        }
        return bos.toByteArray();
    }


    public static byte[] zip(byte[] inbytes) {
        ByteArrayOutputStream originalContent = new ByteArrayOutputStream();
        try {
            originalContent
                    .write(inbytes);
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            GZIPOutputStream gzipOut = new GZIPOutputStream(baos);
            originalContent.writeTo(gzipOut);
            gzipOut.finish();
            return baos.toByteArray();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return new byte[0];
    }
}

如何启动代码

启动服务器端,启动App_startweb.java main方法就可以
客户端 Test_gzip_encode.java 也是一个main方法

代码地址

https://coding.net/u/javacore/p/javaweb-aes-gzip/git