1

我已经在我的应用程序上下文文件中添加了这个

<!-- 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。

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

4

2 回答 2

1

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

于 2014-02-11T12:08:09.747 回答
1

好的,详细说明:

  1. 当前,您将实体/类映射到属性未加密的数据库,如下所示:

    @实体

    公共类人 {
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    私人长 id;
    私有字符串名称;}

如果您打算切换到加密类型 (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

祝你好运 !

于 2014-02-14T12:29:49.060 回答