Si te encuentras con alguna parte que no comprendes puedes dejarnos un comentario y trataremos de ayudarte lo más rápido posible.
Solución:
Para los curiosos, lo que en realidad estás viendo es el secreto. key concatenado con la contraseña cifrada. Por ejemplo, intenté encriptar la contraseña “SAILBOAT” usando:
DatabaseProviderHelper.goingOut("SAILBOAT")
En este caso particular, el resultado fue:
0527C290B40C41D71139B5E7A4446E94D7678359087249A463
El primer byte es constante:
05
Los siguientes 8 bytes representan el secreto generado aleatoriamente key (para el cifrado DES):
27C290B40C41D711
Los bytes restantes son la contraseña cifrada:
39B5E7A4446E94D7678359087249A463
Por lo tanto, para descifrar la contraseña, simplemente use esto:
public static byte[] decryptPassword(byte[] result) throws GeneralSecurityException
byte constant = result[0];
if (constant != 5)
throw new IllegalArgumentException();
byte[] secretKey = new byte[8];
System.arraycopy(result, 1, secretKey, 0, 8);
byte[] encryptedPassword = new byte[result.length - 9];
System.arraycopy(result, 9, encryptedPassword, 0, encryptedPassword.length);
byte[] iv = new byte[8];
for (int i = 0; i < iv.length; i++)
iv[i] = 0;
Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(secretKey, "DES"), new IvParameterSpec(iv));
return cipher.doFinal(encryptedPassword);
Tenga en cuenta que el hash de la contraseña de Tim anterior no es para "apps_ro"; presumiblemente, cortó y pegó desde el lugar equivocado... ¡No publicaré la contraseña real en caso de que sea algo que no quiera compartir!
Tuve un problema similar, tratando de almacenar mis credenciales de db de forma centralizada (¡para bases de datos no seguras!) y luego exportando archivos xml de desarrollador sql. No tengo idea de cuál es el algoritmo; sin embargo, realmente no necesita conocer el algoritmo, ya que puede llamar usted mismo a la API Java de Oracle. Si tiene SQLDeveloper, solo tome los archivos Jar correctos:
cp /Applications/SQLDeveloper.App/Contents/Resources/sqldeveloper/BC4J/lib/db-ca.jar .
cp /Applications/SQLDeveloper.App/Contents/Resources/sqldeveloper/jlib/ojmisc.jar .
Luego, cárguelos en su aplicación Java o use algo como JRuby como yo:
$jirb
> require 'java'
> require 'ojmisc.jar'
> require 'db-ca.jar'
> Java::oracle.jdevimpl.db.adapter.DatabaseProviderHelper.goingOut("password")
=> "059D45F5EB78C99875F6F6E3C3F66F71352B0EB4668D7DEBF8"
> Java::oracle.jdevimpl.db.adapter.DatabaseProviderHelper.goingOut("password")
=> "055CBB58B69B477714239157A1F95FDDD6E5B453BEB69E5D49"
> Java::oracle.jdevimpl.db.adapter.DatabaseProviderHelper.comingIn("059D45F5EB78C99875F6F6E3C3F66F71352B0EB4668D7DEBF8")
=> "password"
> Java::oracle.jdevimpl.db.adapter.DatabaseProviderHelper.comingIn("055CBB58B69B477714239157A1F95FDDD6E5B453BEB69E5D49")
=> "password"
Tenga en cuenta que el algoritmo, sea lo que sea, tiene un factor aleatorio, por lo que la misma contraseña utilizada dos veces puede producir dos cadenas hexadecimales diferentes.
Esta solución me funciona muy bien... Copiado de: http://www.mischiefblog.com/?p=912
import javax.crypto.*;
import javax.crypto.spec.*;
import java.security.*;
/**
* Decrypt passwords stored in Oracle SQL Developer. This is intended for
* password recovery.
*
* Passwords are stored in
* ~/.sqldeveloper/system2.1.1.64.39/o.jdeveloper.db.connection
* .11.1.1.2.36.55.30/connections.xml
*/
public class Decrypt
public static byte[] decryptPassword(byte[] result)
throws GeneralSecurityException
byte constant = result[0];
if (constant != (byte) 5)
throw new IllegalArgumentException();
byte[] secretKey = new byte[8];
System.arraycopy(result, 1, secretKey, 0, 8);
byte[] encryptedPassword = new byte[result.length - 9];
System.arraycopy(result, 9, encryptedPassword, 0,
encryptedPassword.length);
byte[] iv = new byte[8];
for (int i = 0; i < iv.length; i++)
iv[i] = 0;
Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(secretKey, "DES"),
new IvParameterSpec(iv));
return cipher.doFinal(encryptedPassword);
public static void main(String[] args)
if (args.length != 1)
System.err.println("Usage: java Decrypt ");
System.exit(1);
if (args[0].length() % 2 != 0)
System.err
.println("Password must consist of hex pairs. Length is odd (not even).");
System.exit(2);
byte[] secret = new byte[args[0].length() / 2];
for (int i = 0; i < args[0].length(); i += 2)
String pair = args[0].substring(i, i + 2);
secret[i / 2] = (byte) (Integer.parseInt(pair, 16));
try
System.out.println(new String(decryptPassword(secret)));
catch (GeneralSecurityException e)
e.printStackTrace();
System.exit(3);