`
xiaofengtoo
  • 浏览: 492882 次
  • 性别: Icon_minigender_1
  • 来自: xiamen
社区版块
存档分类
最新评论

给hibernate配置文件加密 解密的方案

阅读更多

 

引用: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 配置文件加密解密方案 在本文中,我们将讨论如何在 Hibernate 配置文件中对数据库密码进行加密和解密,以保护数据的安全。该方案通过使用 Java 的 Cipher 类和 DES 对称加密算法来实现加密和解密操作。 ...

    jasypt加密_spring整合.zip

    在这个"jasypt加密_spring整合.zip"压缩包中,我们将会探讨如何将Jasypt与Spring框架整合,以便在Hibernate配置文件中安全地存储敏感信息。 首先,Jasypt提供了两种主要的加密模式:强加密(Strong Encryption)和...

    proxool连接池用户名密码加密

    Proxool的加密功能允许我们在配置中使用加密的用户名和密码,确保即使配置文件被泄露,攻击者也无法直接获取到明文的数据库凭据。这增强了系统的安全性,降低了数据泄露的风险。 在提供的压缩包文件中,可能包含了...

    Hibernate 3.3主要的新特性包括

    Hibernate 3.3 对 Java 5 的注解支持进行了强化,允许开发者在实体类和属性上直接使用注解来定义数据库映射,减少了XML配置文件的使用。这使得代码更加简洁,提高了开发效率。 2. **Criteria 查询API增强**: 新...

    SQLCipher加密

    3. 数据源设置:创建一个自定义的数据源,用于处理SQLCipher的加密解密逻辑。在连接数据库时,需要将密码传递给SQLCipher,以便正确地打开和操作加密的SQLite数据库。 4. 修改数据库操作:在Hibernate的...

    ssh原理和配置文件详解

    SSH的主要配置文件在Unix/Linux系统中通常是`/etc/ssh/sshd_config`(服务器端)和`~/.ssh/config`(客户端)。这些文件中包含了SSH服务的各种设置,如端口号、加密算法、身份验证方法等。 - `sshd_config`文件:...

    Java MD5 加密数据库连接池密码

    数据库连接池的配置中,通常会在配置文件(如XML或properties文件)中写入加密后的密码。在应用启动时,会读取这个加密后的密码,然后进行解密操作,与用户输入的明文密码进行比对。具体的解密过程取决于加密策略,...

    使用jasypt-1.5加密Spring的db属性文件[归类].pdf

    - 在Hibernate配置文件中(如`hibernate.cfg.xml`): ```xml jasypt.hibernate.connectionprovider.EncryptedPasswordDriverManagerConnectionProvider &lt;property name="connection.password"&gt;ENC(G6N718...

    Java加密包 Jasypt

    例如,你可以使用`EncryptedPropertyPlaceholderConfigurer`来加密和解密Spring配置文件中的属性值。 2. **集成友好:** Jasypt可以无缝集成到各种Java应用框架中,如Spring、Hibernate等,为这些框架提供了加密...

    SpringMVC整合Hibernate前端采用miniUI项目

    系统采用SpringMVC整合Hibernate,前端采用Jquery的miniUI做简单展示,集合了常用的web程序功能,增删改查,分页,上传文件,下载文件,freemark导出word,导出excel,spring定时器(三种配置写法都有简单介绍),...

    修改表头加密数据库.rar

    对于整个数据库的加密,可能需要利用数据库管理系统(如MySQL的TDE,Transparent Data Encryption)提供的特性,设置加密策略,并配置加密密钥管理。 3. **Java与数据库的交互** Java中的JDBC提供了一套标准接口...

    JAVA项目文件结构与配置文档(干货)

    - `security`:涉及安全性的代码,如权限控制、加密解密等。 - `service`:业务逻辑层,处理应用的核心业务。 - `servlet`:存放公共Servlet,处理HTTP请求。 - `utils`:工具类集合,包含各种通用操作方法。 -...

    struts+spring+hibernate的登陆系统

    使用Spring的JUnit支持,开发者可以编写测试用例,确保登录功能的正确性,包括验证用户的合法性、检查密码加密解密是否正确以及权限控制是否到位。 综上所述,"Struts+Spring+Hibernate" 登录系统整合了三个强大的...

    ssh框架增删改查登录功能

    6. 配置文件:包括Spring的bean配置文件、Struts2的动作配置文件以及Hibernate的实体映射文件。 登录功能通常涉及用户的验证,这需要在Service层实现,可能包括从数据库中查询用户信息、密码加密解密等步骤。此外,...

    ssh配置

    当用户尝试连接时,服务器会用公钥加密一个随机数并发送给客户端,客户端使用私钥解密,然后用解密后的数字回传给服务器,证明它持有正确的私钥,从而完成身份验证。 配置SSH涉及到以下几个关键步骤: 1. **生成...

    SSM整合demo

    这个"SSM整合demo"是一个示例项目,旨在展示如何将这三个框架有效地结合在一起,同时还实现了一些进阶功能,如自动分页、非实体类校验、异常处理、事务管理和数据库配置文件加密。 首先,Spring是核心容器,负责...

    jasypt-1.9.3.jar

    &gt;Jasypt是一个Java库,可以使开发者不需太多操作来给Java项目添加基本加密功能,而且不需要知道加密原理。 &gt;根据Jasypt官方文档,Jasypt可用于加密任务与应用程序,例如加密密码、敏感信息和数据通信、创建完整检查...

    ssh框架的登陆注册

    5. **配置文件**:SSH框架的配置文件包括struts.xml(Struts2配置)、spring-context.xml(Spring配置)和hibernate.cfg.xml(Hibernate配置)。这些文件定义了组件间的依赖、Action的映射、数据源和实体类的映射等...

    SSH2流程图

    1. **实例化DAO**:在服务启动时,根据配置文件(如Hibernate的.cfg.xml或MyBatis的mybatis-config.xml)加载数据库连接信息,并创建DAO实例。 2. **调用DAO**:当用户请求获取产品信息时,系统识别到需要调用DAO。...

Global site tag (gtag.js) - Google Analytics