Кто-нибудь знает, какой метод шифрования используется JDeveloper/SQL Developer, чтобы сохранить учетные данные?
Я был бы более чем интересен для меня, чтобы понять, какая техника используется здесь для сохранения разумных данных, так как мне нужно реализовать аналогичное решение. Здесь приведен пример конфигурации соединения и полученного экспортированного фрагмента:
Соединения разработчиков Oracle SQL http://i44.tinypic.com/2lcwpkg.gif
<?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>
Любые советы будут действительно оценены.
Ответы
Ответ 1
Для любопытных то, что вы на самом деле видите, это секретный ключ, связанный с зашифрованным паролем. Например, я попробовал шифровать пароль "SAILBOAT", используя:
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);
}
Ответ 2
Обратите внимание, что хеш пароля Tim не указан для "apps_ro" - по-видимому, он вырезал и вставил из-за неправильного места... Я не буду публиковать реальный пароль, если это то, что он не хочет разделять!
У меня была аналогичная проблема, пытаясь сохранить мои учетные данные db централизованно (для незащищенных баз данных!), а затем экспортировать XML файлы sql-разработчиков. Я понятия не имею, что такое алгоритм, однако вам не нужно знать алгоритм, так как вы можете просто вызвать API-интерфейс Oracle java. Если у вас есть SQLDeveloper, просто возьмите нужные файлы Jar:
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"
Обратите внимание, что алгоритм, какой бы он ни был, имеет случайный коэффициент, поэтому один и тот же пароль, используемый дважды, может генерировать две разные шестнадцатеричные строки.
Ответ 3
Это решение отлично подходит для меня...
Скопировано из:
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);
}
}
}
Ответ 4
Тот же код, что и 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
Ответ 5
Способы, описанные в других ответах, к сожалению, не работают в SQL Developer 4.x. Расширение Theres, которое работает как в версиях 3.x, так и 4.x и очень простое в использовании:
https://github.com/tomecode/show-me-password-sqldev-jdev
Ответ 6
Данное решение слишком старое и работает только с версией 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 Developer. Или расшифруйте файл с помощью Дешифратор пароля разработчика SQL
Ответ 7
Я не уверен в этом, но я всегда думал, что хеши нельзя расшифровать, только по сравнению с другим хэшем. MD5 генерирует хэш. Сохраненный пароль в SQL Developer необходимо расшифровать и отправить на сервер. Таким образом, процедуры DES3Encrypt и DES3Decrypt в пакете dbms_obfuscation_toolkit - лучшая ставка. Но дешифратор следует вызывать перед подключением к базе данных, поэтому он, вероятно, является Java-криптовым пакетом с методами DES.
Ответ 8
Длина хэша составляет 50 шестнадцатеричных символов, что составляет 200 бит, поэтому это может быть хэш пароля с солью, добавленный солью, например:
salt | hash(salt | password)
где | означает конкатенацию.
Просто спекуляция. Я предполагаю, что это будет 40-битная соль и хэш SHA-1, поскольку SHA-1 создает 160-битные хэши.
Было бы полезно предоставить некоторые тестовые данные ввода/вывода для проверки на!
Ответ 9
Здесь приведен фрагмент питона, если кто-то интересуется.
Это перевод примера 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:])
Ответ 10
Я не знаю, но я не удивлюсь, если бы было DBMS_OBFUSCATION_TOOLKIT используется примерно так:
l_hash := dbms_obfuscation_toolkit.md5(input_string=>:username||:password);
Ответ 11
FYI пароль 'apps_ro' шифруется как:
<StringRefAddr addrType="password">
<Contents>051DC8A88C574538CC4AEE32D326E9480659C06CEC271EA6D7</Contents>
</StringRefAddr>