我有一个 Java 代码来解密存储在 SQL Developer V17 连接 XML 中的密码。 V19 的加密方法或细节似乎已更改。 更新到 SQL Developer V19 后,相同的旧代码无法运行。 有人知道如何解密 SQL Developer V19 连接 XML 中存储的密码吗?
从以下位置的connections.json 文件中获取加密密码:
C:\Users
从文件中获取加密密钥
位置 C:\Users
示例:
使用以下网站解密密码。
在本地计算机上执行此操作的替代方法:
从以下位置的connections.json 文件中获取加密密码: C:\Users\AppData\Roaming\SQL Developer\system18.4.0.376.1900\o.jdeveloper.db.connection 示例: “密码”:“Ehi21wFkasdfc =”,
从文件product-preferences.xml中获取加密密钥 位置 C:\Users\AppData\Roaming\SQL 开发者\system18.4.0.376.1900\o.sqldeveloper
使用以下代码解密密码
package utils;
import java.security.MessageDigest;
import java.security.GeneralSecurityException;
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import javax.xml.bind.DatatypeConverter;
import java.util.Base64;
public class Decrypt_OracleSqlDevPW {
private static byte[] des_cbc_decrypt(
byte[] encrypted_password,
byte[] decryption_key,
byte[] iv)
throws GeneralSecurityException
{
Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(decryption_key, "DES"), new IvParameterSpec(iv));
return cipher.doFinal(encrypted_password);
}
private static byte[] decrypt_v4(
byte[] encrypted,
byte[] db_system_id)
throws GeneralSecurityException
{
byte[] encrypted_password = Base64.getDecoder().decode(encrypted);
byte[] salt = DatatypeConverter.parseHexBinary("051399429372e8ad");
// key = db_system_id + salt
byte[] key = new byte[db_system_id.length + salt.length];
System.arraycopy(db_system_id, 0, key, 0, db_system_id.length);
System.arraycopy(salt, 0, key, db_system_id.length, salt.length);
java.security.MessageDigest md = java.security.MessageDigest.getInstance("MD5");
for (int i=0; i<42; i++) {
key = md.digest(key);
}
// secret_key = key [0..7]
byte[] secret_key = new byte[8];
System.arraycopy(key, 0, secret_key, 0, 8);
// iv = key [8..]
byte[] iv = new byte[key.length - 8];
System.arraycopy(key, 8, iv, 0, key.length - 8);
return des_cbc_decrypt(encrypted_password, secret_key, iv);
}
public static void main(String[] argv) { try {
String encryptedPassword = "wwA5s2bU02lfY4aTg==";// password
String key = "8397631a-9e0f-42-afda-3fafcac1f193";//key in our local machine
byte[] encrypted = encryptedPassword.getBytes();
byte[] db_system_id = key.getBytes();
byte[] x = decrypt_v4(encrypted, db_system_id);
String password = new String(x);
System.out.println(password);
}
catch (Exception e) {
System.out.println(e.toString());
}
}
}