Восстановить пароль БД, сохраненный в моем подключении DBeaver
Я забыл пароль экземпляра dev (безответственно.. да, я работаю над этим). Я сохранил соединение в моем DBeaver с паролем. Я все еще могу подключиться, используя это соединение. DBeaver не показывает его в виде обычного текста. Могу ли я восстановить пароль? Попросить администратора базы данных сбросить пароль - последнее средство. Я попытался скопировать вставить в блокнот, копирование отключено, видимо.
Ответы
Ответ 1
Изменение: для DBeaver 6.1. 3+
Файл учетных данных находится ~/Library/DBeaverData/workspace6/General/.dbeaver/credentials-config.json (я был на Mac) и использует другую стратегию шифрования, чем его предшественники. Пожалуйста, обратитесь к следующему ответу, чтобы увидеть, как расшифровать. это работает как шарм.
Pre- DBeaver 6.1.3
Выполните следующие действия (моя версия DBeaver была 3.5.8, и она была на Mac OSX El Capitan)
- Найдите файл, в котором DBeaver хранит сведения о соединении. За
я был в этом месте
~/.dbeaver/General/.dbeaver-data-sources.xml
. Этот файл скрыт,
так что имейте это в виду при поиске.
- Найдите интересующий вас узел определения источника данных в этом файле.
- Расшифруйте пароль: К сожалению, все текстовое, кроме пароля; Пароль в какой-то зашифрованной форме. Расшифруйте его как обычный текст с помощью этого инструмента.
Или
Я собрал быструю и грязную Java-программу, скопировав ядро метода DBeaver для расшифровки пароля. Когда у вас есть строка с зашифрованным паролем, просто запустите эту программу, она преобразует пароль в обычный текст и печатает его
Как запустить это
В строке номер 13 просто замените OwEKLE4jpQ==
на любой зашифрованный пароль, который вы найдете в файле .dbeaver-data-sources.xml
для интересующего вас источника данных. Скомпилируйте его и запустите, он напечатает простой текстовый пароль.
https://github.com/jaisonpjohn/dbeaver-password-retriever/blob/master/SimpleStringEncrypter.java
Изменить
Видимо, это "популярная" ошибка. Поэтому я развернул лямбда-функцию AWS с вышеуказанным кодом. Используйте это на свой страх и риск, вы никогда не узнаете, регистрирует ли я ваш пароль или нет: D
curl https://lmqm83ysii.execute-api.us-west-2.amazonaws.com/prod/dbeaver-password-decrypter \
-X POST --data "OwEKLE4jpQ=="
Изменить 2
Еще лучше, вот интерфейс http://dbeaver-password-decrypter.s3-website-us-west-2.amazonaws.com/. Это само собой разумеется, используйте это на свой страх и риск. Non-Https меньше всего беспокоит вас! :)
Ответ 2
Для DBeaver 6.1. 3+ кредиты теперь хранятся в файле "json" с другим шифрованием.
Это, кажется, сделало работу для меня:
import javax.crypto.*;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.security.*;
public class DecryptDbeaver {
// from the DBeaver source 8/23/19 https://github.com/dbeaver/dbeaver/blob/57cec8ddfdbbf311261ebd0c7f957fdcd80a085f/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/impl/app/DefaultSecureStorage.java#L31
private static final byte[] LOCAL_KEY_CACHE = new byte[] { -70, -69, 74, -97, 119, 74, -72, 83, -55, 108, 45, 101, 61, -2, 84, 74 };
static String decrypt(byte[] contents) throws InvalidAlgorithmParameterException, InvalidKeyException, IOException, NoSuchPaddingException, NoSuchAlgorithmException {
try (InputStream byteStream = new ByteArrayInputStream(contents)) {
byte[] fileIv = new byte[16];
byteStream.read(fileIv);
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
SecretKey aes = new SecretKeySpec(LOCAL_KEY_CACHE, "AES");
cipher.init(Cipher.DECRYPT_MODE, aes, new IvParameterSpec(fileIv));
try (CipherInputStream cipherIn = new CipherInputStream(byteStream, cipher)) {
return inputStreamToString(cipherIn);
}
}
}
static String inputStreamToString(java.io.InputStream is) {
java.util.Scanner s = new java.util.Scanner(is).useDelimiter("\\A");
return s.hasNext() ? s.next() : "";
}
public static void main(String[] args) throws Exception {
if (args.length != 1) {
System.err.println("syntax: param1: full path to your credentials-config.json file");
System.exit(1);
}
System.out.println(decrypt(Files.readAllBytes(Paths.get(args[0]))));
}
}
Передайте путь к файлу credentials-config.json в локальной файловой системе, для меня это было
javac DecryptDbeaver.java # compile it
java DecryptDbeaver ~/Library/DBeaverData/workspace6/General/.dbeaver/credentials-config.json
Он выведет на консоль пользователя + пропуск для подключений. Если вы не знаете, какой пароль идет в какую БД, вы должны связать имена идентификаторов, которые он также выводит, с одноуровневым файлом data-sources.json
(который уже должен присутствовать и быть незашифрованным).
Ответ 3
если есть объявление пакета, просто скомпилируйте
Javac -d. SimpleStringEncrypter.java
это поместит это в правильную структуру каталога под текущим каталогом
Тогда вы можете дать
Ява -cp. packagename.SimpleStringEncrypter, и он будет работать.
Базовая Java.
В любом случае, эта программа фантастическая и сэкономила мне много времени.
Ответ 4
Сценарий расшифровки в Python для DBeaver версии 6.1. 3+ на основе ответа @rogerdpack:
https://gist.github.com/felipou/50b60309f99b70b1e28f6d22da5d8e61
Для более старых версий DBeaver существует другой скрипт, основанный на ответе @so-random-dude:
https://gist.github.com/felipou/f5472ad5f6a414528b44beb102e17fb4