引用:http://www.iteye.com/topic/70663 (先转过来,有需要的时候参考)
如何给工程中的配置文件加密 解密
之前有人问过hibernate密码问题,大家都没有给出一个具体的解决方案,所以我就看了一下代码,把我的想法和实现拿出来和大家讨论一下。
我现在的环境是spring+hibernate,但是这并不影响这个加密解密的问题,其他环境应该是略有不同,但是思路肯定是一样的。
总体思路:在工程的配置文件中填写数据库密码的密文,在应用程序使用datasource的时候解密成明文以创建连接。
步骤1
使用java的中cipher类并使用DES(对称加密算法)算法对明文进行加密
````````````````这里如何使用cipher类和DES算法的原理可以上网查找,我懒得写了,如果大家真的也怕麻烦自己去找的话我再写一个贴出来吧
修改:我随便写了一个类,大家看着改吧,我没有测试过
public class DESUtil {
public static void main(String[] args){
try {
if(args[0].equals("-genKey")){
generateKey(args[1]);
}else{
//if (args[0].equals("-encrypt"))encrypt();
//else decrypt();
}
}catch (Exception e) {
// TODO: handle exception
}
}
public static String encrypt(String plainText, String encryptString, File keyFile)throws IOException, ClassNotFoundException,GeneralSecurityException{
ObjectInputStream keyIn = new ObjectInputStream(new FileInputStream(keyFile));
int mode = Cipher.ENCRYPT_MODE;
Key key = (Key)keyIn.readObject();
keyIn.close();
InputStream in = new FileInputStream(plainText);
OutputStream out = new FileOutputStream(encryptString);
Cipher cipher = Cipher.getInstance("DES");
cipher.init(mode, key);
doEncryptAndDecrypt(in, out, cipher);
String result = out.toString();
System.out.print(result);
in.close();
out.close();
return result;
}
public static String decrypt(String encryptString, String plainText, File keyFile)throws IOException, ClassNotFoundException,GeneralSecurityException{
ObjectInputStream keyIn = new ObjectInputStream(new FileInputStream(keyFile));
int mode = Cipher.DECRYPT_MODE;
Key key = (Key)keyIn.readObject();
keyIn.close();
InputStream in = new FileInputStream(encryptString);
OutputStream out = new FileOutputStream(plainText);
Cipher cipher = Cipher.getInstance("DES");
cipher.init(mode, key);
doEncryptAndDecrypt(in, out, cipher);
String result = out.toString();
System.out.print(result);
in.close();
out.close();
return result;
}
public static void doEncryptAndDecrypt(InputStream in, OutputStream out, Cipher cipher)throws IOException, GeneralSecurityException{
int blockSize = cipher.getBlockSize();
int outputSize = cipher.getOutputSize(blockSize);
byte[] inBytes = new byte[blockSize];
byte[] outBytes = new byte[outputSize];
int inLength = 0;
boolean more = true;
while(more){
inLength = in.read(inBytes);
if(inLength == blockSize){
int outLength = cipher.update(inBytes, 0, blockSize, outBytes);
out.write(outBytes,0,outLength);
}
else more = false;
}
if(inLength>0) outBytes = cipher.doFinal(inBytes, 0, inLength);
else outBytes = cipher.doFinal();
out.write(outBytes);
}
public static void generateKey(String path) throws Exception{
KeyGenerator keygen = KeyGenerator.getInstance("DES");
SecureRandom random = new SecureRandom();
keygen.init(random);
SecretKey key = keygen.generateKey();
ObjectOutputStream out = new ObjectOutputStream( new FileOutputStream(path));
out.writeObject(key);
out.close();
}
}
通过以上的encrypt方法得到一个密码的密文(一般的密码是明文,作为参数传进去可以得到对应的密文),比如说21sadf25
步骤2
将加密后的密文添加到配置文件中
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="org.gjt.mm.mysql.Driver"/>
<property name="url" value="jdbc:mysql://localhost/test?useUnicode=true&characterEncoding=utf-8&autoReconnect=true"/>
<property name="username" value="root"/>
<property name="password" value="21sadf25"/>
<property name="maxActive" value="100"/>
<property name="whenExhaustedAction" value="1"/>
<property name="maxWait" value="120000"/>
<property name="maxIdle" value="30"/>
<property name="defaultAutoCommit" value="true"/>
</bean>
步骤3
继承spring的LocalSessionFactoryBean类,override其setDataSource方法,将dataSource的password取出,解密后再赋值。
为什么要这么做呢,因为datasource是localsessionFactoryBean的一个属性,在注入dataSource时将其密码解密是比较恰当的。所以选择这个setDataSource方法进行override。假设我们使用的dbcp连接池
代码如下:(类名是AhuaXuanLocalSessionFactoryBean)
public void setDataSource(DataSource dataSource) {
String password = (BasicDataSource)dataSource.getPassword();
//通过cipher类进行解密
String decryPassword = DESUtil.decrypt(password);
dataSource.setPassword(decryPassword);
this.dataSource = dataSource;
}
配置如下:
<bean id="sessionFactory" class="org.springframework.orm.hibernate.AhuaXuanLocalSessionFactoryBean">
<property name="dataSource">
<ref bean="dataSource"/>
</property>
</bean>
之前robbin说的DataSourceFactoryBean那个类我在spring1.2.8中没有找到,但是我觉得改造LocalSessionFactoryBean也不错
这样就完成了一个我们的目标,以上代码是随便写的,没有经过测试,有兴趣的同学可以试一下
纯转载收藏,有机会在深入,目前还没有在此基础上实现过!!!
分享到:
相关推荐
Hibernate 配置文件加密解密方案 在本文中,我们将讨论如何在 Hibernate 配置文件中对数据库密码进行加密和解密,以保护数据的安全。该方案通过使用 Java 的 Cipher 类和 DES 对称加密算法来实现加密和解密操作。 ...
在这个"jasypt加密_spring整合.zip"压缩包中,我们将会探讨如何将Jasypt与Spring框架整合,以便在Hibernate配置文件中安全地存储敏感信息。 首先,Jasypt提供了两种主要的加密模式:强加密(Strong Encryption)和...
Proxool的加密功能允许我们在配置中使用加密的用户名和密码,确保即使配置文件被泄露,攻击者也无法直接获取到明文的数据库凭据。这增强了系统的安全性,降低了数据泄露的风险。 在提供的压缩包文件中,可能包含了...
Hibernate 3.3 对 Java 5 的注解支持进行了强化,允许开发者在实体类和属性上直接使用注解来定义数据库映射,减少了XML配置文件的使用。这使得代码更加简洁,提高了开发效率。 2. **Criteria 查询API增强**: 新...
3. 数据源设置:创建一个自定义的数据源,用于处理SQLCipher的加密解密逻辑。在连接数据库时,需要将密码传递给SQLCipher,以便正确地打开和操作加密的SQLite数据库。 4. 修改数据库操作:在Hibernate的...
SSH的主要配置文件在Unix/Linux系统中通常是`/etc/ssh/sshd_config`(服务器端)和`~/.ssh/config`(客户端)。这些文件中包含了SSH服务的各种设置,如端口号、加密算法、身份验证方法等。 - `sshd_config`文件:...
数据库连接池的配置中,通常会在配置文件(如XML或properties文件)中写入加密后的密码。在应用启动时,会读取这个加密后的密码,然后进行解密操作,与用户输入的明文密码进行比对。具体的解密过程取决于加密策略,...
- 在Hibernate配置文件中(如`hibernate.cfg.xml`): ```xml jasypt.hibernate.connectionprovider.EncryptedPasswordDriverManagerConnectionProvider <property name="connection.password">ENC(G6N718...
例如,你可以使用`EncryptedPropertyPlaceholderConfigurer`来加密和解密Spring配置文件中的属性值。 2. **集成友好:** Jasypt可以无缝集成到各种Java应用框架中,如Spring、Hibernate等,为这些框架提供了加密...
系统采用SpringMVC整合Hibernate,前端采用Jquery的miniUI做简单展示,集合了常用的web程序功能,增删改查,分页,上传文件,下载文件,freemark导出word,导出excel,spring定时器(三种配置写法都有简单介绍),...
对于整个数据库的加密,可能需要利用数据库管理系统(如MySQL的TDE,Transparent Data Encryption)提供的特性,设置加密策略,并配置加密密钥管理。 3. **Java与数据库的交互** Java中的JDBC提供了一套标准接口...
- `security`:涉及安全性的代码,如权限控制、加密解密等。 - `service`:业务逻辑层,处理应用的核心业务。 - `servlet`:存放公共Servlet,处理HTTP请求。 - `utils`:工具类集合,包含各种通用操作方法。 -...
使用Spring的JUnit支持,开发者可以编写测试用例,确保登录功能的正确性,包括验证用户的合法性、检查密码加密解密是否正确以及权限控制是否到位。 综上所述,"Struts+Spring+Hibernate" 登录系统整合了三个强大的...
6. 配置文件:包括Spring的bean配置文件、Struts2的动作配置文件以及Hibernate的实体映射文件。 登录功能通常涉及用户的验证,这需要在Service层实现,可能包括从数据库中查询用户信息、密码加密解密等步骤。此外,...
当用户尝试连接时,服务器会用公钥加密一个随机数并发送给客户端,客户端使用私钥解密,然后用解密后的数字回传给服务器,证明它持有正确的私钥,从而完成身份验证。 配置SSH涉及到以下几个关键步骤: 1. **生成...
这个"SSM整合demo"是一个示例项目,旨在展示如何将这三个框架有效地结合在一起,同时还实现了一些进阶功能,如自动分页、非实体类校验、异常处理、事务管理和数据库配置文件加密。 首先,Spring是核心容器,负责...
>Jasypt是一个Java库,可以使开发者不需太多操作来给Java项目添加基本加密功能,而且不需要知道加密原理。 >根据Jasypt官方文档,Jasypt可用于加密任务与应用程序,例如加密密码、敏感信息和数据通信、创建完整检查...
5. **配置文件**:SSH框架的配置文件包括struts.xml(Struts2配置)、spring-context.xml(Spring配置)和hibernate.cfg.xml(Hibernate配置)。这些文件定义了组件间的依赖、Action的映射、数据源和实体类的映射等...
1. **实例化DAO**:在服务启动时,根据配置文件(如Hibernate的.cfg.xml或MyBatis的mybatis-config.xml)加载数据库连接信息,并创建DAO实例。 2. **调用DAO**:当用户请求获取产品信息时,系统识别到需要调用DAO。...