JDeveloper/SQL 개발자가 자격 증명을 유지하기 위해 어떤 암호화 기술인지 아는 사람이 있습니까?

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

다른 팁

위의 Tim의 비밀번호 해시는 "Apps_ro"에 대한 것이 아닙니다. 아마도 그가 잘못된 장소에서 자르고 붙여 넣었을 것입니다 ... 그가 공유하지 않기를 원하지 않는 경우 실제 비밀번호를 게시하지 않을 것입니다!

비슷한 문제가 있었는데, DB 자격 증명을 중앙에서 저장하려고 시도한 다음 (보안 데이터베이스가 아닌 경우!) SQL 개발자 XML 파일을 내보내 었습니다. 알고리즘이 무엇인지 모르겠습니다. 그러나 Oracle Java API를 직접 호출 할 수 있으므로 알고리즘을 알 필요는 없습니다. sqldeveloper가있는 경우 올바른 항아리 파일을 잡습니다.

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

그런 다음 Java 앱에로드하거나 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" 

알고리즘은 무엇이든간에 임의의 요인이 있으므로 두 번 사용하는 동일한 암호가 두 개의 다른 16 진 문자열을 생성 할 수 있습니다.

이 솔루션은 저에게 훌륭하게 작동합니다 ... 복사 : :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 파일에 암호화 된 저장되지만 암호화 키는 Accessible에서 액세스 할 수있는 Machine-Unique value db.system.id를 사용합니다.

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와 동일한 코드가 제공했지만 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();
    }   
}

다음과 같이 실행할 수 있습니다.

# 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 Developer 4.x에서 작동하지 않습니다. 3.x 및 4.x 버전 모두에서 작동하는 확장 기능이 있으며 사용하기가 매우 쉽습니다.

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

나는 이것에 대해 확신하지 못하지만 항상 해시가 암호 해독 될 수 없다고 생각했다. MD5는 해시를 생성합니다. SQL 개발자의 저장된 비밀번호는 해독하고 서버로 보내야합니다. 따라서 dbms_obfuscation_toolkit 패키지의 des3encrypt 및 des3decrypt 절차가 더 나은 내기입니다. 그러나 데이터베이스에 연결하기 전에 해독제를 호출해야하므로 DES 메소드가있는 Java Crypto 패키지 일 수 있습니다.

누구든지 파이썬 스 니펫이 있습니다. 번역입니다 Adam Paynter 's 위의 예. 사용합니다 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:])

모르겠지만, 그랬다면 놀라지 않을거야 dbms_obfuscation_toolkit 다음과 같이 사용되는 것 :

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

해시의 길이는 50 개의 16 진 문자이므로 200 비트이므로 소금이 달린 암호 해시 일 수 있습니다.

salt | hash(salt | password)

여기서 | 연결을 의미합니다.

그래도 추측. SHA-1이 160 비트 해시를 생산하기 때문에 내 추측은 40 비트 소금과 SHA-1 해시 일 것입니다.

확인할 입력/출력 테스트 데이터를 제공하는 데 도움이됩니다!

fyi 비밀번호 'apps_ro'는 다음과 같이 암호화됩니다.

     <StringRefAddr addrType="password">
        <Contents>051DC8A88C574538CC4AEE32D326E9480659C06CEC271EA6D7</Contents>
     </StringRefAddr>
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top