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;
  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
加密数据库,可以使用Java加密工具类和数据库连接工具类来实现。以下是一个大致的步骤: 1. 导入Java加密库,如Bouncy Castle。 2. 编写一个Java加密工具类,用于对数据进行加密和解密。这个工具类可以使用对称加密算法,如AES,或非对称加密算法,如RSA。 3. 在数据库连接工具类中,将密码进行加密。这样,在连接数据库时,需要解密密码才能够成功连接。 下面是一个简单的示例代码: ```java import java.security.Security; import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; import org.bouncycastle.jce.provider.BouncyCastleProvider; public class EncryptionUtil { static { Security.addProvider(new BouncyCastleProvider()); } public static byte[] encrypt(String key, String iv, String data) throws Exception { byte[] keyBytes = key.getBytes("UTF-8"); byte[] ivBytes = iv.getBytes("UTF-8"); byte[] dataBytes = data.getBytes("UTF-8"); SecretKeySpec secretKeySpec = new SecretKeySpec(keyBytes, "AES"); IvParameterSpec ivParameterSpec = new IvParameterSpec(ivBytes); Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding", "BC"); cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec, ivParameterSpec); return cipher.doFinal(dataBytes); } public static String decrypt(String key, String iv, byte[] encryptedData) throws Exception { byte[] keyBytes = key.getBytes("UTF-8"); byte[] ivBytes = iv.getBytes("UTF-8"); SecretKeySpec secretKeySpec = new SecretKeySpec(keyBytes, "AES"); IvParameterSpec ivParameterSpec = new IvParameterSpec(ivBytes); Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding", "BC"); cipher.init(Cipher.DECRYPT_MODE, secretKeySpec, ivParameterSpec); byte[] decryptedDataBytes = cipher.doFinal(encryptedData); return new String(decryptedDataBytes, "UTF-8"); } } ``` 在数据库连接工具类中,可以这样来加密密码: ```java public class DBUtil { private static final String KEY = "1234567890123456"; private static final String IV = "1234567890123456"; public static Connection getConnection(String url, String username, String password) throws SQLException, ClassNotFoundException { Class.forName("com.mysql.jdbc.Driver"); Connection conn = DriverManager.getConnection(url, username, EncryptionUtil.decrypt(KEY, IV, Base64.getDecoder().decode(password))); return conn; } public static String encryptPassword(String password) throws Exception { byte[] encryptedData = EncryptionUtil.encrypt(KEY, IV, password); return Base64.getEncoder().encodeToString(encryptedData); } } ``` 注意,这个示例代码中使用了AES算法和Base64编码,需要根据实际情况进行修改。同时,要注意安全性问题,加密算法和密钥等需要保密,以免被攻击者破解。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值