هل يعرف أحد ما هي تقنية التشفير التي يستخدمها JDeveloper/SQL Developer لاستمرار بيانات الاعتماد؟

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

سؤال

سيكون من المثير للاهتمام بالنسبة لي أن أفهم التقنية المستخدمة هنا للاحتفاظ بالبيانات المعقولة لأنني بحاجة إلى تنفيذ حل مماثل.فيما يلي نموذج لتكوين الاتصال والمقتطف الناتج الذي تم تصديره:

Oracle SQL Developer Connections

<?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>

أي نصيحة محل تقدير حقا.

هل كانت مفيدة؟

المحلول

لالغريب، ما ترونه هو في الواقع المفتاح السري متصلا مع كلمة مرور مشفرة. على سبيل المثال، حاولت تشفير كلمة المرور "المراكب الشراعية" باستخدام:

DatabaseProviderHelper.goingOut("SAILBOAT")

في هذه الحالة بالذات، وكانت النتيجة:

0527C290B40C41D71139B5E7A4446E94D7678359087249A463

والبايت الأول هو ثابت:

05

وحدات البايت 8 القادمة تمثل مفتاح السر الذي تم إنشاؤه بشكل عشوائي (لالشفرات DES):

27C290B40C41D711

وحدات البايت المتبقية هي كلمة مرور مشفرة:

39B5E7A4446E94D7678359087249A463

لذلك، لفك تشفير كلمة المرور، يمكنك ببساطة استخدام هذا:

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

نصائح أخرى

لاحظ أن كلمة السر البعثرة تيم أعلاه ليس ل "apps_ro" - يفترض انه قص ولصق من المكان الخطأ ... وأنا لن الرد على كلمة السر الحقيقية في حال شيء لأنه لا يريد المشتركة

وكان لي مشكلة مماثلة، في محاولة لتخزين أوراق اعتماد ديسيبل بلدي مركزي (لقواعد بيانات غير آمنة!) ومن ثم تصدير ملفات XML المطور SQL. ليس لدي أي فكرة عما هو خوارزمية - ومع ذلك، لا تحتاج حقا أن تعرف الخوارزمية، كما يمكنك أن مجرد دعوة جافا API أوراكل نفسك. إذا كان لديك SQLDeveloper، فقط انتزاع الملفات جرة الصحيحة:

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

وبعد ذلك إما تحميلها في التطبيق جافا، أو استخدام شيء من هذا القبيل JRuby كما أفعل:

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

لاحظ أن الخوارزمية، أيا كان، لديه عامل عشوائي حتى نفس كلمة المرور المستخدمة مرتين يمكن أن تنتج سلسلتين عرافة مختلفة.

وهذا الحل يعمل كبيرة بالنسبة لي ... نسخ من: 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);
        }
    }
}

الحل المقدم قديم جدًا ولا يعمل إلا مع الإصدار 2.x ولكن ليس الآن.نظرًا لأن Oracle SQL Developer، قام بتغيير خوارزمية التشفير في الإصدار 3.x و4.x.

الإصدار 3

يتم تخزين كلمات المرور مشفرة في ملف Connections.xml في تلك المواقع:

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

الإصدار 4

يتم تخزين كلمات المرور مشفرة في ملف Connections.xml المذكور أعلاه ولكن مفتاح التشفير يستخدم قيمة فريدة للجهاز db.system.id في ملف Product-preferences.xml الذي يمكن الوصول إليه هنا:

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

لفك تشفير أحدث ملف مشفر يمكنك استخدامه أرني كلمة المرور ملحق لمطور SQL.أو فك تشفير الملف مع برنامج فك تشفير كلمة مرور مطور SQL

والرمز نفس أعطت kornelissietsma، ولكن مكتوبة على جافا:

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

ويمكن تنفيذها على النحو التالي:

# 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

وطرق وصفها في إجابات أخرى للأسف لا يعمل في SQL المطور 4.x. هناك التمديد الذي يعمل على كل 3.x و 4.x من الإصدارات وأنه من السهل جدا للاستخدام:

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

وأنا لست متأكدا من ذلك ولكنني اعتقدت دائما التجزئة لا يمكن فك تشفير، فقط مقارنة التجزئة آخر. MD5 يولد التجزئة. كلمة المرور المحفوظة في SQL المطور تحتاج إلى فك وإرسالها إلى الخادم. وبالتالي فإن إجراءات DES3Encrypt وDES3Decrypt في حزمة dbms_obfuscation_toolkit هي أفضل رهان. ولكن فك ينبغي أن تسمى قبل توصيل إلى قاعدة بيانات، لذلك فمن المحتمل ان يكون حزمة التشفير جافا مع وسائل DES.

وهنا قصاصة الثعبان إذا بالتجديف أي شخص. انها ترجمة سبيل المثال آدم بينتر في أعلاه. ويستخدم 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:])

وأنا لا أعرف، لكنني لن يفاجأ إذا كان <لأ href = "http://download-west.oracle.com/docs/cd/B19306_01/appdev.102/b14258/d_obtool. هتم "يختلط =" نوفولو noreferrer "> DBMS_OBFUSCATION_TOOLKIT تستخدم شيئا من هذا القبيل:

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

وطول التجزئة هو 50 حرفا عرافة، والتي هي 200 بت، لذلك قد يكون تجزئة كلمة المرور مع الملح، وإرفاق مسبقا مع الملح، مثل:

salt | hash(salt | password)

وحيث | يعني سلسلة.

ومجرد تكهنات وإن كان. تخميني سيكون من الملح 40 بت وتجزئة SHA-1، منذ SHA-1 تنتج علامات الرقم 160-بت.

وسيكون من المفيد تقديم بعض البيانات الإدخال / الإخراج اختبار للتحقق ضد!

ومعلوماتك كلمة المرور "apps_ro" تشفير على النحو التالي:

     <StringRefAddr addrType="password">
        <Contents>051DC8A88C574538CC4AEE32D326E9480659C06CEC271EA6D7</Contents>
     </StringRefAddr>
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top