Saltar al contenido

¿Alguien sabe qué técnica de cifrado está usando JDeveloper/SQL Developer para conservar las credenciales?

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);
        
    

Valoraciones y reseñas

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *