Jan 7, 2011

Ανάκτηση αποθηκευμένων (saved) passwords από συνδέσεις σε SQL Developer και JDeveloper

Χρησιμοποιώ τον Oracle SQL Developer για να συνδέομαι σε διάφορες βάσεις πελατών μου. Χθες βρέθηκα στην εξής κατάσταση: χρειάστηκε να τρέξω ένα SQL script σε μια βάση από command-line, για την οποία δεν είχα σημειώσει το password του SYSTEM. Για καλή μου τύχη, είχα βέβαια δημιουργήσει παλαιότερα μια σύνδεση στον SQL Developer, αλλά ως γνωστόν το password δεν εμφανίζεται σε αναγνώσιμη μορφή.

Οι συνδέσεις αποθηκεύονται σε ένα ειδικό αρχείο ονόματι connections.xml και ορίζονται στο HOME του χρήστη. Στην έκδοση 2.1 του SQL Developer βρίσκονται στην διαδρομή $ΗΟΜΕ/.sqldeveloper/system2.1.0.63.73/o.jdeveloper.db.connection.11.1.1.2.36.55.30/connections.xml Ανοίγοντας αυτό το αρχείο, βρίσκουμε σε κρυπτογραφημένη μορφή (encrypted) τα passwords των συνδέσεων μας.

Προκειμένου να αποκωδικοποιήσουμε (decrypt) αυτό το password, υπάρχει μια θαυμάσια απάντηση στο stackoverflow.com (http://stackoverflow.com/questions/1032721/does-anybody-know-what-encrypting-technique-is-jdeveloper-sql-developer-using-to) που συνοψίζεται στην κατασκευή ενός προγράμματος, το οποίο περιμένει ως είσοδο ένα κρυπτογραφημένο password, και τυπώνει την αποκρυπτογραφημένη μορφή του. Ακολουθεί μια τροποποίηση του, ώστε να γίνει πιο γενικό.

import oracle.jdevimpl.db.adapter.DatabaseProviderHelper;
import java.io.*;

class Decode {
String pass = "";

public Decode() {
System.out.print("Please type encrypted password:");
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
         try {
String encyptedPass = br.readLine();
pass = DatabaseProviderHelper.comingIn(encryptedPass);
System.out.println(pass);
} catch (IOException ioe) {
System.out.println("IO error trying to read encrypted password!");
System.exit(1);
}
}

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


To πρόγραμμα που μόλις δημιουργήσαμε θα το κάνουμε compile:
javac -cp $SQL_DEVELOPER_HOME/modules/oracle.adf.model_11.1.1/db-ca.jar:$SQL_DEVELOPER_HOME/modules/oracle.ldap_11.1.1/ojmisc.jar Decode.java

και τελικά θα το τρέξουμε:
java -cp $SQL_DEVELOPER_HOME/modules/oracle.adf.model_11.1.1/db-ca.jar:$SQL_DEVELOPER_HOME/modules/oracle.ldap_11.1.1/ojmisc.jar:. Decode

Επειδή και ο JDeveloper χρησιμοποιεί τον ίδιο αλγόριθμο για να αποθηκεύει τα passwords των συνδέσεων, μπορούμε πάλι να χρησιμοποιήσουμε το ίδιο πρόγραμμα για να βρούμε την τιμή ενός password.

No comments: