引言:在 web 程序中,数据加密非常重要,对于不用解密的数据,如密码等,一般使用 md5 的加密技术,对于需要解密的数据,我们常用 AES 加密,现在我们来讨论下如何提高数据的安全性。
一、对私钥用公钥加密,然后数据进行多次对称加密
我觉得,数据的加首先双方约定一个
公钥:ABCDEFGHIJKLMNOP
签名:QWERTYHJKDLOFJSK
数据加密次数:n
-
加密随机密钥
首先对公钥进行MD5加密,转大写并截取 16 位作为newKey;
然后随机生成 16 位的随机密钥 randomKey,对randomKey 进行 AES 标准加密(偏移量和私钥一样,加密方式为为:“AES/CBC/PKCS5Padding”)得到加密的秘钥realKey;
-
双方约定数据封装形式+签名-> data,然后对其 MD5 加密转大写成为newSign;
再对上面的随机秘钥 randomKey 进行 MD5 加密,截取 16 位作为数据传输的 json 进行 AES 标准进行加密,json 一般都是需要传输的数据+newSign;(这里 AES 根据约定进行轮换 n 次)
下面给出流程示例
下面贴出代码
package com.dao.xu;
import com.alibaba.fastjson.JSON;
import org.apache.commons.codec.digest.DigestUtils;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.util.*;
/**
* 安全设计
*
* @author 阿导
* @CopyRight 万物皆导
* @Created 2019/5/15 20:26:00
*/
public class WWJD {
/**
* 加密公钥
*/
private final static String COMMON_KEY = "wwjdwwjdwwjdwwjdwwjdwwjdwwjdwwjd";
/**
* 签名秘钥
*/
private final static String SIGN_KEY = "wwjdwwjdwwjdwwjdwwjdwwjdwwjdwwjd";
/**
* 约定次数
*/
private final static Integer N = 10;
/**
* SIGN
*/
private final static String SIGN = "sign";
/**
* 随机秘钥集合
*/
private final static String KEYS = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz*$";
/**
* 默认字符集
*/
private final static String DEFAULT_CODE = "UTF-8";
/**
* 零
*/
private final static Integer ZERO = Integer.valueOf(0);
/**
* 引号
*/
public static final String QUOTES = "\"";
/**
* 逗号
*/
public static final String COMMA = ",";
/**
* 冒号
*/
public static final String COLON = ":";
/**
* 左大括号
*/
public static final String BRACES_LEFT = "{";
/**
* 右大括号
*/
public static final String BRACES_RIGHT = "}";
/**
* 将字符串MD5加码 生成32位md5码
*
* @param inStr
* @return java.lang.String
* @author 阿导
* @time 2019/5/15 20:23:00
*/
private static String md5(String inStr) {
try {
return DigestUtils.md5Hex(inStr.getBytes(DEFAULT_CODE));
} catch (UnsupportedEncodingException e) {
throw new RuntimeException("MD5签名过程中出现错误");
}
}
/**
* AES加密
*
* @param cleartext
* @param rKey
* @return java.lang.String
* @author 阿导
* @time 2019/5/15 20:24:00
*/
private static String