Java使用AES对称加密算法对文件加解密

java

为了安全,我们会采取对文件的重要信息进行加密。本文将介绍如何使用对称加密算法" title="对称加密算法">对称加密算法AES对文件进行加解密,包括:“替换local_policy.jar和US_export_policy.jar文件”、“加密文件内容”、“自定义PropertyPlaceholderConfigurer子类解密文件”。

1、替换local_policy.jar和US_export_policy.jar文件。

替换${java_home}/jre/lib/security下的local_policy.jar和US_export_policy.jar文件。

我们加密使用的密钥长度大于128,而正常Java运行环境限制了密钥长度不能大于128。所以我们需要下载能支持密钥大于128的local_policy.jar和US_export_policy.jar文件,替换掉${java_home}/jre/lib/security下的对应的文件。

2、加密文件内容。

如数据库连接文件,将数据库用户名和密文进行加密。将用户名和密码使用AES加密后,填写到文件:

# 数据库驱动

driverClassName=com.mysql.cj.jdbc.Driver

# 数据库URL

db.mysql.url=jdbc:mysql://localhost:3306/%s?useUnicode=true&serverTimezone=Asia/Shanghai&characterEncoding=utf8&zeroDateTimeBehavior=CONVERT_TO_NULL

# 数据库用户名

db.mysql.username.encryption=81A3FD464E18C4497A79CE7CC9D5B660

db.nbx.mysql.username.encryption=81A3FD464E18C4497A79CE7CC9D5B660

# 密码

db.mysql.password.encryption=16CCEF25E22FA42E89821B7B27858DE26DD8BFF1139FF2C70BECCA88E373F809

db.nbx.mysql.password.encryption=16CCEF25E22FA42E89821B7B27858DE26DD8BFF1139FF2C70BECCA88E373F809

key键多了个”.encryption”,后面使用PropertyPlaceholderConfigurerUtil对其进行处理。

3、自定义 PropertyPlaceholderConfigurer子类解密文件。

PropertyPlaceholderConfigurer是个bean工厂后置处理器的实现,新建一个类PropertyPlaceholderConfigurerUtil继承它,可以在容器启动时,对加密的文件进行解密。

PropertyPlaceholderConfigurerUtil重写了processProperties方法。processProperties方法找到文件里以“.encryption”结尾的key,将它的value进行解密,并去掉“.encryption”:

public class PropertyPlaceholderConfigurerUtil extends PropertyPlaceholderConfigurer {

@Override

protected void processProperties(ConfigurableListableBeanFactory beanFactoryToProcess, Properties props) throws BeansException {

AESUtil aesHelper = new AESUtil();

Enumeration<?> keys = props.propertyNames();

while (keys.hasMoreElements()) {

String key = (String) keys.nextElement();

String value = props.getProperty(key);

if (key.endsWith(".encryption") && null != value) {

props.remove(key);

key = key.substring(0, key.length() - 11);

value = aesHelper.decrypt(value.trim());

props.setProperty(key, value);

}

System.setProperty(key, value);

}

super.processProperties(beanFactoryToProcess, props);

}

}

解密:

	/**

* * Input encrypted String represented in HEX * * @return a string decrypted in

* plain text

*/

public String decrypt(String hexCipherText) {

try {

String plaintext = new String(dcipher.doFinal(hexToByte(hexCipherText)), "UTF-8");

return plaintext;

} catch (Exception e) {

e.printStackTrace();

return null;

}

}

public static byte[] hexToByte(String hexString) {

int len = hexString.length();

byte[] ba = new byte[len / 2];

for (int i = 0; i < len; i += 2) {

ba[i / 2] = (byte) ((Character.digit(hexString.charAt(i), 16) << 4) + Character.digit(hexString.charAt(i + 1), 16));

}

return ba;

}

生成密钥:

	/**

* * Input a string that will be md5 hashed to create the key. * * @return void,

* cipher initialized

*/

public AESUtil() {

try {

SecretKeySpec skey = new SecretKeySpec("xxxxxxxxxxxxxxxx".getBytes(), "AES");

this.setupCrypto(skey);

} catch (Exception e) {

e.printStackTrace();

}

}

获取和初始化加密、解密Cipher对象:

	private void setupCrypto(SecretKey key) {

// Create an 8-byte initialization vector

byte[] iv = new byte[] { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };

AlgorithmParameterSpec paramSpec = new IvParameterSpec(iv);

try {

ecipher = Cipher.getInstance("AES/CBC/PKCS5Padding");

dcipher = Cipher.getInstance("AES/CBC/PKCS5Padding");

// CBC requires an initialization vector

ecipher.init(Cipher.ENCRYPT_MODE, key, paramSpec);

dcipher.init(Cipher.DECRYPT_MODE, key, paramSpec);

} catch (Exception e) {

e.printStackTrace();

}

}

加密字符串:

	/**

* * Input is a string to encrypt. * * @return a Hex string of the byte array

*/

public String encrypt(String plaintext) {

try {

byte[] ciphertext = ecipher.doFinal(plaintext.getBytes("UTF-8"));

return byteToHex(ciphertext);

} catch (Exception e) {

e.printStackTrace();

return null;

}

}

public static String byteToHex(byte[] raw) {

if (raw == null) {

return null;

}

final StringBuilder hex = new StringBuilder(2 * raw.length);

for (final byte b : raw) {

hex.append(HEXES.charAt((b & 0xF0) >> 4)).append(HEXES.charAt((b & 0x0F)));

}

return hex.toString();

}

以上是 Java使用AES对称加密算法对文件加解密 的全部内容, 来源链接: utcz.com/z/394701.html

回到顶部