我是靠谱客的博主 闪闪火,最近开发中收集的这篇文章主要介绍jdbc 加密之 DES 算法,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

1.没有加密前,我们的 jdbc.propertites 文件的信息上这样的:

#没有加密的
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/o2o?useUnicode=true&characterEncoding=utf8
jdbc.username=root
jdbc.password=root

很明显,这样是不安全的做法,只要黑客一黑进来就能直接看到数据库连接的账号和密码了,所以,我们最少也要对数据库连接的账号和密码进行加密。下面就直接介绍如何用 DES 算法来进行加解密。

2.DES 加密的 Java 实现

首先,我们要编写一个 DES 加密的工具类来对数据库的信息进行加密。然后通过这个类里面的 main 函数对 jdbc.username 和 jdbc.password 的明文信息进行加密,然后把生成的密文复制粘贴到 jdbc.propertites 里面,如下图。

注意:

需要导入的包我直接给出了,所以不导入错误的包,不用程序运行不了,还有,如果你用的编译器上 Eclipse 或者 MyEclipse 的话,BASE64 的加密和解密的包可能没办法直接导入,可以看的另外一篇博客,很容易就可以解决的:

Eclipse 使用 sun.misc.BASE64 的加解密

import java.security.Key;
import java.security.SecureRandom;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
public class DESUtil {
private static Key key;
// 设置秘钥key
private static String KEY_STR = "myKey";
private static String CHARSETNAME = "UTF-8";
private static String ALGORITHM = "DES";
static {
try {
// 生成DES算法对象
KeyGenerator generator = KeyGenerator.getInstance(ALGORITHM);
// 运用SHA1安全策略
SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");
// 设置上密钥种子
secureRandom.setSeed(KEY_STR.getBytes());
// 初始化给于SHA1的算法对象
generator.init(secureRandom);
// 生成密钥对象
key = generator.generateKey();
generator = null;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
/**
* 获取加密后的信息
*
* @param str
* @return
*/
public static String getEncryptString(String str) {
// 基于BASE64编码,接受byte[]并转换成String
BASE64Encoder base64encoder = new BASE64Encoder();
try {
// 按UTF8编码
byte[] bytes = str.getBytes(CHARSETNAME);
// 获取加密对象
Cipher cipher = Cipher.getInstance(ALGORITHM);
// 初始化密码信息
cipher.init(Cipher.ENCRYPT_MODE, key);
// 加密
byte[] doFinal = cipher.doFinal(bytes);
// byte[]to encode好的String并返回
return base64encoder.encode(doFinal);
} catch (Exception e) {
// TODO: handle exception
throw new RuntimeException(e);
}
}
/**
* 获取解密之后的信息
*
* @param str
* @return
*/
public static String getDecryptString(String str) {
// 基于BASE64编码,接受byte[]并转换成String
BASE64Decoder base64decoder = new BASE64Decoder();
try {
// 将字符串decode成byte[]
byte[] bytes = base64decoder.decodeBuffer(str);
// 获取解密对象
Cipher cipher = Cipher.getInstance(ALGORITHM);
// 初始化解密信息
cipher.init(Cipher.DECRYPT_MODE, key);
// 解密
byte[] doFinal = cipher.doFinal(bytes);
// 返回解密之后的信息
return new String(doFinal, CHARSETNAME);
} catch (Exception e) {
// TODO: handle exception
throw new RuntimeException(e);
}
}
public static void main(String[] args) {
System.out.println(getEncryptString("root"));
System.out.println(getEncryptString("root"));
}
}

3.解密的JAVA实现

加密后,我们自然要实现相关的解密方法。

这里通过 EncryptPropertyPlaceholderConfigurer.java 类的实现以及对 spring-dao.xml 文件的配置来实现数据库连接信息的解密。

EncryptPropertyPlaceholderConfigurer.java 的实现代码

import org.springframework.beans.factory.config.PropertyPlaceholderConfigurer;
public class EncryptPropertyPlaceholderConfigurer extends PropertyPlaceholderConfigurer {
// 需要加密的字段数组
private String[] encryptPropNames = { "jdbc.username", "jdbc.password" };
/**
* 对关键的属性进行转换
*/
@Override
protected String convertProperty(String propertyName, String propertyValue) {
if (isEncryptProp(propertyName)) {
// 对已加密的字段进行解密工作
String decryptValue = DESUtil.getDecryptString(propertyValue);
return decryptValue;
} else {
return propertyValue;
}
}
/**
* 该属性是否已加密
*
* @param propertyName
* @return
*/
private boolean isEncryptProp(String propertyName) {
for (String encryptpropertyName : encryptPropNames) {
if (encryptpropertyName.equals(propertyName))
return true;
}
return false;
}
}

这里需要注意的是加密的字段,如果你还加密了其他字段的话,记得自己添加上去。

spring-dao.xml 配置文件的修改:

<!-- <context:property-placeholder location="classpath:jdbc.properties"/> -->
<bean class="com.util.EncryptPropertyPlaceholderConfigurer">
<property name="locations">
<list>
<!-- 如果有其他加密文件需要解密,需要继续添加value,而value里面放的上文件的绝对路径 -->
<value>classpath:jdbc.properties</value>
</list>
</property>
<property name="fileEncoding" value="UTF-8"></property>
</bean>

把原来配置 spring-dao.xml 配置的这句代码给注释掉:

<context:property-placeholder location="classpath:jdbc.properties"/>

换成上面整个 bean 进去,然后记得把 bean class 的值修改成自己解密类的路径,还有注意自己的 jdbc.properties 的路径。

4.测试

到这里,加密解密的步骤基本都做完了,现在就差测试了。

记得 jdbc.properties 记得换上密文信息。

然后重启下 tomcat ,打开一个需要访问到数据库的页面测试下就行。

记得,写配置文件的时候,不要写错别字,,,博主踩了好多次坑!!!!

最后

以上就是闪闪火为你收集整理的jdbc 加密之 DES 算法的全部内容,希望文章能够帮你解决jdbc 加密之 DES 算法所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(54)

评论列表共有 0 条评论

立即
投稿
返回
顶部