gpt4 book ai didi

java - AES_DECRYPT 不适用于 linux : maybe linked to Hibernate

转载 作者:可可西里 更新时间:2023-11-01 07:07:03 32 4
gpt4 key购买 nike

我在我的数据库中加密了数据,我正在尝试执行一个允许我在 phpmyadmin 中以明文形式显示值的请求。

我使用以下请求:

 SELECT CAST(AES_DECRYPT(`my_encrypted_colum`, UNHEX('pass_in_hexa') AS CHAR) AS clear_value 
FROM `my_table`

当我在开发环境 (windows) 上使用它时,它运行良好。但是一旦我在预生产环境 (linux) 上使用它,我就会得到所有值的 NULL

我很确定它与不同的环境有关,但我不知道是什么。我什至不知道哪个函数没有按预期运行:UNHEX 或 AES_DECRYPT(我猜是 UNHEX)?

这是我的开发环境和预生产环境的配置:

开发:

Serveur : localhost via TCP/IP
Type de serveur : MySQL
Version du serveur : 5.6.15-log - MySQL Community Server (GPL)
Version du protocole : 10
Utilisateur : root@localhost
Jeu de caractères du serveur : UTF-8 Unicode (utf8)

Apache/2.2.25 (Win32) PHP/5.3.19
Version du client de base de données : libmysql - mysqlnd 5.0.8-dev - 20102224 - $Id: 65fe78e70ce53d27a6cd578597722950e490b0d0 $
Extension PHP : mysqli

预生产:

Serveur: Localhost via UNIX socket
Logiciel: MySQL
Version du logiciel: 5.6.14 - MySQL Community Server (GPL)
Version du protocole: 10
Utilisateur: root@localhost
Jeu de caractères du serveur: UTF-8 Unicode (utf8)

Apache/2.2.15 (CentOS)
Version du client de base de données: libmysql - 5.1.72
Extension PHP: mysqli

编辑:

我继续我的研究,它缝合了 AES_DECRYPT 和 UNHEX 方法无罪。事实上,如果我直接在 phpMyAdmin 的表中添加加密值,如下所示:

 INSERT INTO `my_table` (`my_encrypted_column`) VALUES (AES_ENCRYPT('blabla', UNHEX('pass_in_hexa'))

然后我设法使用之前的 SELECT 请求正确检索数据。

这意味着问题一定出在我最初插入数据的方式上。为此,我使用了 Hibernate 和 nullSafeSet 方法。

困扰我的是:如果我保存数据的方式有问题,为什么它在 Windows 上工作但在 Linux 上不工作

下面是我对 nullSafeSet 和 nullSafeGet 的实现

private static final String CIPHER_ALGORITHM = "AES";

// nullSafeSet
protected void noNullSet(PreparedStatement st, Object value, int index, SessionImplementor si) throws SQLException {
byte[] clearText = ((String) value).getBytes(Charset.forName("UTF-8"));

try {
Cipher encryptCipher = Cipher.getInstance(CIPHER_ALGORITHM);
encryptCipher.init(Cipher.ENCRYPT_MODE, getKey(cle));
st.setBytes(index, encryptCipher.doFinal(clearText));
}
catch (GeneralSecurityException e) {
throw new RuntimeException("should never happen", e);
}
}

@Override
public Object nullSafeGet(ResultSet rs, String[] names, SessionImplementor si, Object owner) throws HibernateException, SQLException {
byte[] bytes = rs.getBytes(names[0]);
try {
Cipher decryptCipher = Cipher.getInstance(CIPHER_ALGORITHM);
decryptCipher.init(Cipher.DECRYPT_MODE, getKey(cle));
if (bytes != null) {
return new String(decryptCipher.doFinal(bytes), Charset.forName("UTF-8"));
}
else {
return new String();
}

}
catch (GeneralSecurityException e) {
throw new RuntimeException("Mauvaise clé");
}
}

private static SecretKeySpec getKey(String secretKey) {
final byte[] finalKey = new byte[16];
int i = 0;
for (byte b : secretKey.getBytes()) {
// XOR
finalKey[i++ % 16] ^= b;
}
return new SecretKeySpec(finalKey, "AES");
}

您知道可能导致问题的原因吗?

最佳答案

检查:

  • 如果您在这些数据库中有相同的数据。从您的开发人员连接到 preprod 数据库并检查它是否有效。从 preprod 连接到您的开发数据库并检查它是否有效。这样你应该缩小问题范围:数据库与环境
  • jvm 加密权限。也许你的开发 jvm 可以使用强加密而 preprod 不能
  • 区分大小写:一些数据库(不确定 mysql)将表存储在文件中。 windows不区分大小写,linux不是。我过去见过这样的问题

关于java - AES_DECRYPT 不适用于 linux : maybe linked to Hibernate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27988312/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com