加密数据库中的旧数据

时间:2014-02-11 10:47:19

标签: java spring hibernate jasypt

我已将此添加到我的应用程序上下文文件

<!-- Added to encrypt user identification fields using jasypt -->
    <bean id="stringEncryptor"  class="org.jasypt.encryption.pbe.StandardPBEStringEncryptor" lazy-init="false">
    <property name="algorithm" value="PBEWithMD5AndDES" />
    <property name="password" value="contactKey" />
  </bean>

  <bean id="hibernateEncryptor" class="org.jasypt.hibernate.encryptor.HibernatePBEStringEncryptor" lazy-init="false">
    <!-- This property value must match "encryptorRegisteredName" used when defining hibernate user types -->
    <property name="registeredName" value="jasyptHibernateEncryptor" />
    <property name="encryptor" ref="stringEncryptor" />
  </bean>`

This below coded added in hibernate mapping file
`<typedef name="encryptedString" class="org.jasypt.hibernate.type.EncryptedStringType">
        <param name="encryptorRegisteredName">jasyptHibernateEncryptor</param>
    </typedef>

我们在我的应用程序中使用带有Hibernate的spring,但我们想在我的应用程序中实现jasyptHibernateEncryptorin。

将新条目存储到数据库表并获取相同条目时,它工作正常,但问题是如何加密旧数据。

2 个答案:

答案 0 :(得分:1)

您创建一个连接到数据库的新应用程序,获取所有现有行,并在使用加密器加密字段后逐个更新它们。完成此更新后,您可以使用新的typedef来处理这些加密字段。

答案 1 :(得分:1)

好的,详细说明:

  1. 目前您已将实体/类映射到未加密的保护的数据库,如下所示:

    @Entity

    公共类人员{
    @Id
    @GeneratedValue(策略= GenerationType.AUTO)
    私人长身份;
    私有字符串名称; }

  2. 如果你打算转换为加密类型(jasypt),你需要先加密所有当前的 数据库中的值,代码如下所示:

    public class Exec {
        public static void main(String[] args) {
    
            SessionFactory sf = HibernateUtil.getSessionFactory(true);
            Session session = null;
            try {
                session = sf.openSession();         
    
    
                //configure the jasypt string encryptor - different type use different encryptors
                StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor();
                encryptor.setAlgorithm("PBEWithMD5AndDES");
                encryptor.setPassword("123456");
                encryptor.setKeyObtentionIterations(1000);          
                encryptor.initialize();
    //                        get all unencrypted data from db and encrypt them - here just the name property of the Person is encrypted.
                session.beginTransaction();
                    List<Person> persons = session.createQuery("select p from Person p").list();
                for(Person pers : persons){
                    pers.setName(encryptor.encrypt(pers.getName()));
                    session.save(pers);             
                }
    
                session.getTransaction().commit();
            } catch (Exception ex) {
                try {
                    ex.printStackTrace();
                    session.getTransaction().rollback();
                } catch (Exception ex2) {
                    ex2.printStackTrace();
                }
            } finally {
                session.close();
                HibernateUtil.shutdown();
            }
    
        }
    }
    

    加密所需的值后,切换Person实体以使用加密类型,如下所示:

    @org.hibernate.annotations.TypeDefs({
        @org.hibernate.annotations.TypeDef(name="EncryptedString",
                typeClass=EncryptedStringType.class,
                parameters={@Parameter(name="algorithm",value="PBEWithMD5AndDES"),@Parameter(name="password",value="123456"),@Parameter(name="keyObtentionIterations",value="1000")})
    })
    @Entity
    public class Person {
        @Id
        @GeneratedValue(strategy=GenerationType.AUTO)
        private long id;
    
        @Type(type="EncryptedString")
        private String name;
    
        public long getId() {
            return id;
        }
    // ... getters and setters
    }
    

    确保加密项的参数在定义和代码中是相同的: 相同的算法,相同的密码,相同的密钥迭代迭代参数。 之后,您可以照常使用Person实体,因为加密对您使用的java持久性代码是透明的。

    此代码的一个工作示例,您可以使用此命令从svn签出:

    svn checkout http://hibernate-jasypt-database-encryption.googlecode.com/svn/trunk/ hibernate-jasypt-database-encryption-read-only

    祝你好运!