我在数据库中有一个加密值,我想在发送到前端之前解密它。
当我第一次将值保存为加密时,它在数据库中看起来像-kKwj477382jle34nw
。但是,如果我调用我在此函数中进行解密的getClientByUsername()
函数,当我在将对象发送到前端之前在对象中设置解密值时,数据库中的值也会自动更改。
@Transactional
public ResponseEntity <Client> getClientByUsername(String username) throws Exception {
Client loggedClient = clientDAO.findByUsername(username);
String data = loggedClient.getCreditCardNo();
if (null != data) {
@SuppressWarnings("static-access")
byte[] encrypted = base64.decodeBase64(data);
SecretKeySpec secretKeySpec = new SecretKeySpec(encryptionKey.getBytes(), algorithm);
Cipher cipher = Cipher.getInstance(algorithm);
cipher.init(Cipher.DECRYPT_MODE, secretKeySpec);
decrypted = cipher.doFinal(encrypted);
loggedClient.setCreditCardNo(new String(decrypted));
}
return new ResponseEntity < Client > (loggedClient, HttpStatus.OK);
}
以下是我将值保存为加密的方式:
@Transactional
public boolean clientUpdate(String client) {
str = updateclient.getCreditCardNo();
if (null != str) {
SecretKeySpec secretKeySpec = new SecretKeySpec(encryptionKey.getBytes("UTF-8"), algorithm);
Cipher cipher = Cipher.getInstance(algorithm);
cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec);
encrypted = cipher.doFinal(str.getBytes("UTF-8"));
updateclient.setCreditCardNo(base64.encodeToString(encrypted));
return clientDAO.updateProfileClient(updateclient);
}
如何在调用setter时阻止hibernate更改值?
更新
@PersistenceContext
private EntityManager entityManager;
public Client findByUsername(String username) throws Exception {
Query query = entityManager.createNamedQuery("Client.findByUsername");
query.setParameter("username", username);
List result = query.getResultList();
return result.size() > 0 ? (Client) result.get(0) : null;
}
答案 0 :(得分:2)
你需要从Hibernate的会话中evict这个对象:
void evict(Object object) throws HibernateException
从会话缓存中删除此实例。对实例的更改 不会与数据库同步。此操作级联到 关联映射的关联实例 级联= “逐出”。
P.S。试想,你也可以考虑另一种方法。您可以在bean中创建一个标记为@Transient
的字段,即与数据库分离,并将其命名为creditCardNoDecrypted
。加密字段标记为@JsonIngore
(或用于序列化的任何内容)。