我已将此添加到我的应用程序上下文文件
中<!-- 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。
将新条目存储到数据库表并获取相同条目时,它工作正常,但问题是如何加密旧数据。
答案 0 :(得分:1)
您创建一个连接到数据库的新应用程序,获取所有现有行,并在使用加密器加密字段后逐个更新它们。完成此更新后,您可以使用新的typedef来处理这些加密字段。
答案 1 :(得分:1)
好的,详细说明:
目前您已将实体/类映射到未加密的保护的数据库,如下所示:
@Entity
公共类人员{
@Id
@GeneratedValue(策略= GenerationType.AUTO)
私人长身份;
私有字符串名称;
}
如果你打算转换为加密类型(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
祝你好运!