Bootstrap

java与数据库数据加密方法

1.java测试加密代码:

AES和HEX加密及解密工具类:

/**
 * AES加解密字符串工具类
 */
public class AesEncrypt {
​
    public static void main(String[] args) {
        String aes_en = aes_encrypt("AES工具1@!","123456");
        System.out.println("AES加密:"+aes_en);
​
        String aes_de = aes_decrypt("54faa6635e17933f3e4e33442e040a37","123456");
        System.out.println("AES解密:"+aes_de);
    }
​
    /**
     * AES加密
     * @param content  加密明文
     * @param strKey   加密key
     * @return
     */
    public static String aes_encrypt(String content, String strKey) {
        try {
            //获取处理过的AES密钥Key
            SecretKey key = generateMySQLAESKey(strKey,"ASCII");
            //创建密码器
            Cipher cipher = Cipher.getInstance("AES");
            //初始化为加密模式的密码器
            cipher.init(Cipher.ENCRYPT_MODE, key);
            //获取utf-8字符集加密内容字节数组
            byte[] cleartext = content.getBytes("UTF-8");
            //使用初始的加密模式密码器,对加密内容加密
            byte[] ciphertextBytes = cipher.doFinal(cleartext);
            //返回AES加密内容字符串
            return new String(Hex.encodeHex(ciphertextBytes));
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (NoSuchPaddingException e) {
            e.printStackTrace();
        } catch (InvalidKeyException e) {
            e.printStackTrace();
        } catch (IllegalBlockSizeException e) {
            e.printStackTrace();
        } catch (BadPaddingException e) {
            e.printStackTrace();
        }
        return null;
    }
​
    /**
     * AES解密
     * @param content  解密密文
     * @param aesKey   解密key(与加密同)
     * @return
     */
    public static String aes_decrypt(String content, String aesKey){
        try {
            //获取处理过的AES密钥Key
            SecretKey key = generateMySQLAESKey(aesKey,"ASCII");
            //创建密码器
            Cipher cipher = Cipher.getInstance("AES");
            //初始化为解密模式的密码器
            cipher.init(Cipher.DECRYPT_MODE, key);
            //获取密文内容字节数组
            byte[] cleartext = Hex.decodeHex(content.toCharArray());
            //使用初始的解密模式密码器,对加密内容解密
            byte[] ciphertextBytes = cipher.doFinal(cleartext);
            //返回AES解密字符串
            return new String(ciphertextBytes, "UTF-8");
​
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (NoSuchPaddingException e) {
            e.printStackTrace();
        } catch (InvalidKeyException e) {
            e.printStackTrace();
        } catch (IllegalBlockSizeException e) {
            e.printStackTrace();
        } catch (BadPaddingException e) {
            e.printStackTrace();
        } catch (DecoderException e) {
            e.printStackTrace();
        }
        return null;
    }
​
    /**
     * AES加密key处理
     * @param key
     * @param encoding
     * @return
     */
    public static SecretKeySpec generateMySQLAESKey(final String key, final       
        String encoding) 
      {
            try {
                final byte[] finalKey = new byte[16];
                int i = 0;
                for(byte b : key.getBytes(encoding))
                    finalKey[i++%16] ^= b;
                //根据字节数组生成AES密钥Key
                return new SecretKeySpec(finalKey, "AES");
            } catch(UnsupportedEncodingException e) {
                throw new RuntimeException(e);
            }
       }

2.数据库测试加密函数:

Hex(加密)、Unhex(解密)、AES_ENCRYPT(加密)、AES_DECRYPT(解密)

#查看
select HEX(AES_ENCRYPT('123456','11')) AS encrypt;  #查看加密值
SELECT AES_DECRYPT(UNHEX('37793CE97D52B3C802B7319852115A4E'), '11') AS jieMi; #查看解密值
​
#新增==>加密
insert into user(name, encrypt_name) values('加密@1!',HEX(AES_ENCRYPT('加密@1!','123456')));
​
#查询==>解密
select name, AES_DECRYPT(UNHEX(encrypt_name), '123456') AS en_name from user;
​
#测试1:可以,不过会出现乱码==>测试成功
CREATE TABLE t_encrypt_1 (encrypt_1 varbinary(16), encrypt_2 binary(16), encrypt_3 blob);
​
INSERT INTO t_encrypt_1 VALUES (AES_ENCRYPT('明文1', 'key'), AES_ENCRYPT('明文2', 'key'), AES_ENCRYPT('明文3', 'key'));
​
SELECT AES_DECRYPT(encrypt_1, 'key'), AES_DECRYPT(encrypt_2, 'key'), AES_DECRYPT(encrypt_3, 'key') FROM t_encrypt_1;
​
#测试2:可以==>测试成功(推荐使用)
CREATE TABLE t_encrypt_2(encrypt2 char(32));
​
INSERT INTO t_encrypt_2 VALUES (HEX(AES_ENCRYPT('test2', 'key2')));
​
SELECT AES_DECRYPT(UNHEX(encrypt2), 'key2') FROM t_encrypt_2;
​
#测试3:可以(创建和添加时,做处理)==>测试成功
CREATE TABLE t_encrypt_3(encrypt3 varchar(32)) CHARSET latin1;
​
INSERT INTO t_encrypt_3 SELECT AES_ENCRYPT('text3', 'key3');
​
SELECT AES_DECRYPT(encrypt3, 'key3') FROM t_encrypt_3;
;