Weiß jemand, was Verschlüsselungs- Technik ist JDeveloper / SQL Developer mit Anmeldeinformationen bestehen bleiben?

StackOverflow https://stackoverflow.com/questions/1032721

Frage

würde ich mehr als interessant für mich sein, welche Technik zu verstehen, wird hier verwendet wird, sensible Daten zu beharren, da ich eine ähnliche Lösung zu implementieren bin benötigen. Hier ist ein Beispiel Anschlusskonfiguration und die resultierende exportierte Snippet:

<?xml version = '1.0' encoding = 'UTF-8'?>
    <References xmlns="http://xmlns.oracle.com/adf/jndi">
        <Reference name="My Connection" className="oracle.jdeveloper.db.adapter.DatabaseProvider" xmlns="">
        <Factory className="oracle.jdeveloper.db.adapter.DatabaseProviderFactory"/>
        <RefAddresses>
            <StringRefAddr addrType="user">
                <Contents>username</Contents>
            </StringRefAddr>
            <StringRefAddr addrType="password">
                <Contents>054D4844D8549C0DB78EE1A98FE4E085B8A484D20A81F7DCF8</Contents>
            </StringRefAddr>
        <SKIPPED />
        </RefAddresses>
    </Reference>
</References>

Jede mögliche Beratung sehr geschätzt werden.

War es hilfreich?

Lösung

Für die Neugierigen, was Sie tatsächlich sehen, ist der geheime Schlüssel mit dem verschlüsselten Passwort verkettet. Zum Beispiel habe ich versucht, das Passwort „SAILBOAT“ Verschlüsselung mit:

DatabaseProviderHelper.goingOut("SAILBOAT")

In diesem speziellen Fall war das Ergebnis:

0527C290B40C41D71139B5E7A4446E94D7678359087249A463

Das erste Byte ist konstant:

05

Das nächste 8 Bytes stellt den zufällig erzeugten geheimen Schlüssel (für den DES-Verschlüsselungs):

27C290B40C41D711

Die restlichen Bytes sind das verschlüsselte Passwort:

39B5E7A4446E94D7678359087249A463

Daher das Passwort zu entschlüsseln, verwenden Sie einfach:

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

Andere Tipps

Beachten Sie, dass Tims Passwort-Hash oben nicht für „apps_ro“ ist - vermutlich schnitt er und von der falschen Stelle eingefügt ... Ich werde das reale Passwort, falls nicht per Post ist etwas, was er nicht mit anderen geteilt will

Ich hatte ein ähnliches Problem, meine db Anmeldeinformationen versucht, zentral zu speichern (für nicht sichere Datenbanken!) Und dann SQL-Entwickler XML-Dateien zu exportieren. Ich habe keine Ahnung, was der Algorithmus ist - aber Sie nicht wirklich brauchen, um den Algorithmus zu wissen, wie Sie gerade die Oracle Java-API selbst aufrufen können. Wenn Sie sqldeveloper haben, nur die richtigen Jar-Dateien packen:

cp /Applications/SQLDeveloper.App/Contents/Resources/sqldeveloper/BC4J/lib/db-ca.jar .
cp /Applications/SQLDeveloper.App/Contents/Resources/sqldeveloper/jlib/ojmisc.jar .

Dann entweder laden Sie sie in Ihrer Java-Anwendung, oder so etwas wie JRuby verwenden wie ich:

$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" 

Beachten Sie, dass der Algorithmus, was auch immer es ist, einen Zufallsfaktor hat so das gleiche Passwort zweimal verwendet zwei verschiedene Hexstring produzieren kann.

Diese Lösung funktioniert gut für mich ... Kopiert von: 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 <password>");
            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);
        }
    }
}

Da Lösung ist zu alt und funktioniert nur mit Version 2.x, aber jetzt nicht mehr. weil Oracle SQL Developer, geändert den Verschlüsselungsalgorithmus in der Version 3.x und 4.x.

Version 3

Die Passwörter werden in diesen Orten in der connections.xml Datei verschlüsselt gespeichert:

Windows: C:\Users\<USER>\AppData\Roaming\SQL Developer\system<VERSION>\o.jdeveloper.db.connection.<VERSION>\connections.xml
Linux: ~/.sqldeveloper/system<VERSION>/o.jdeveloper.db.connection.<VERSION>/connections.xml

Version 4

Passwörter gespeichert sind, in der oben genannten connections.xml Datei verschlüsseln, aber der Verschlüsselungsschlüssel verwendet eine maschine eindeutige Wert db.system.id im Produkt-preferences.xml Datei zugänglich hier:

Windows: C:\Users\<USER>\AppData\Roaming\SQL Developer\system<VERSION>\o.sqldeveloper.<VERSION>\product-preferences.xml
Linux: ~/.sqldeveloper/system<VERSION>/o.sqldeveloper.<VERSION>/product-preferences.xml

Um neueste verschlüsselte Datei entschlüsseln Sie verwenden können, zeigen Passwort Erweiterung für SQL Developer. Oder Entschlüsseln von Dateien mit SQL Developer Passwort decryptor

Der gleiche Code wie kornelissietsma gegeben hat, aber geschrieben auf Java:

import oracle.jdevimpl.db.adapter.DatabaseProviderHelper;

class Decode {
    String pass = ""; 

    public Decode() {
        pass = DatabaseProviderHelper.comingIn("HASH");
        System.out.println(pass);
    }   

    public static void main(String[] args){
        new Decode();
    }   
}

kann wie folgt ausgeführt werden:

# javac -classpath .:/full/path/to/sqldeveloper/BC4J/lib/db-ca.jar:/full/path/to/sqldeveloper/jlib/ojmisc.jar sqldeveloper_hash_decode.java
# java -classpath .:/full/path/to/sqldeveloper/BC4J/lib/db-ca.jar:/full/path/to/sqldeveloper/jlib/ojmisc.jar Decode

Methoden in anderen Antworten beschrieben leider nicht funktioniert in SQL Developer 4.x. Es gibt Erweiterung, die auf beiden 3.x und 4.x-Versionen funktioniert, und es ist sehr einfach zu bedienen:

https://github.com/tomecode/show-me-password- sqldev-jdev

Ich bin darüber nicht sicher, aber ich habe immer gedacht, Hashes nicht entschlüsselt werden kann, nur im Vergleich zu anderen Hash. MD5 erzeugt einen Hash. Das gespeicherte Passwort in SQL Developer benötigt werden, um den Server entschlüsselt und senden. So sind die DES3Encrypt und DES3Decrypt Verfahren in dbms_obfuscation_toolkit Paket sind eine bessere Wette. Aber die Entschlüsselung sollte an eine Datenbank vor dem Anschluss aufgerufen werden, so ist es wahrscheinlich ein Java Krypto-Paket mit DER Methode.

Hier ist ein Python-Schnipsel, wenn jemand intersted ist. Es ist eine Übersetzung von Adam Paynter des Beispiel oben. Es verwendet pyDes

import os
import pyDes

import binascii

if __name__ == '__main__':
    # Encrypt example
    zero = '\0\0\0\0\0\0\0\0'
    key = os.urandom(8)
    plainText = 'open sesame'
    cipher = pyDes.des(key, mode=pyDes.CBC, IV=zero, padmode=pyDes.PAD_PKCS5)

    cipherText = '\5%s%s' % (key, cipher.encrypt(plainText))
    cipherHex = binascii.hexlify(cipherText)

    # This is what SQLDeveloper stores in XML
    print cipherHex

    # Decrypt above
    cipherText = binascii.unhexlify(cipherHex)
    assert cipherHex[0:2] == '05'
    key = cipherText[1:1+8]
    cipher = pyDes.des(key, mode=pyDes.CBC, IV=zero, padmode=pyDes.PAD_PKCS5)
    print cipher.decrypt(cipherText[1+8:])

Ich weiß nicht, aber ich wäre nicht überrascht, wenn es DBMS_OBFUSCATION_TOOLKIT etwas wie folgt verwendet werden:

l_hash := dbms_obfuscation_toolkit.md5(input_string=>:username||:password);

Die Länge des Hash-50 hex Zeichen, die 200 Bits ist, so kann sie mit einem Salz, mit dem Salz der voran der Hash des Passworts sein, wie:

salt | hash(salt | password)

Dabei gilt | Verkettung bedeutet.

Just Spekulation though. Meine Vermutung wäre ein 40-Bit-Salz und einen SHA-1-Hash, da SHA-1 160-Bit-Hash-Werte erzeugt.

Wäre hilfreich, einige Eingabe / Ausgabe-Testdaten bereitzustellen, gegen! Überprüfen

FYI das Passwort 'apps_ro' verschlüsselt als:

     <StringRefAddr addrType="password">
        <Contents>051DC8A88C574538CC4AEE32D326E9480659C06CEC271EA6D7</Contents>
     </StringRefAddr>
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top