134 votes

Récupérer le mot de passe de la base de données stocké dans ma connexion DBeaver

J'ai oublié le mot de passe d'une instance de développement (irresponsable.. ouais, je suis en train de travailler dessus). J'ai la connexion enregistrée dans mon DBeaver avec le mot de passe. Je suis toujours capable de me connecter en utilisant cette connexion. DBeaver ne le montre pas en texte clair. Y a-t-il un moyen de récupérer le mot de passe? Demander au DBA de réinitialiser le mot de passe est le dernier recours. J'ai essayé de copier-coller dans le bloc-notes, mais apparemment la copie est désactivée.

2 votes

Cela fonctionne pour moi : bugdays.com/dbeaver-password-decrypter

0 votes

Cette question est destinée à un outil utilisé souvent par les programmeurs, il se trouve également être utilisé par d'autres personnes LOL. SU pourrait fonctionner aussi, mais je pense que c'est bien ici puisque la réponse est pratiquement une réponse de programmation.

0 votes

@rogerdpack DBeaver est peut-être souvent utilisé par les programmeurs, mais cela ne signifie pas que c'est un outil principalement utilisé par les programmeurs. Il est également utilisé par les administrateurs de base de données ou d'autres personnes interrogeant des bases de données.

231voto

so-random-dude Points 5411

Pour DBeaver 6.1.3+

Le fichier d'informations d'identification se trouve à ~/Library/DBeaverData/workspace6/General/.dbeaver/credentials-config.json (j'étais sur Mac) et il suit une stratégie de chiffrement différente de ses prédécesseurs. Veuillez consulter la réponse suivante pour voir comment le décrypter. Ça fonctionne comme un charme.

Avant DBeaver 6.1.3

Suivez ces étapes (Ma version de DBeaver était 3.5.8 et j'étais sur Mac OsX El Capitan)

  1. Localisez le fichier dans lequel DBeaver stocke les détails de connexion. Pour moi, c'était à cet emplacement ~/.dbeaver/General/.dbeaver-data-sources.xml. Ce fichier est caché, donc gardez cela à l'esprit lorsque vous le cherchez.
  2. Localisez le nœud de définition de la source de données qui vous intéresse dans ce fichier.
  3. Décryptez le mot de passe : Malheureusement, tout est en texte clair sauf le mot de passe; Le mot de passe est sous une forme cryptée. Déchiffrez-le en texte clair en utilisant cet outil.

Ou

J'ai mis ensemble un programme Java rapide et basique en copiant le cœur de la méthode de DBeaver pour décrypter le mot de passe. Une fois que vous avez la chaîne de mot de passe cryptée, exécutez simplement ce programme, il convertira le mot de passe en texte clair et l'imprimera

Comment l'exécuter

À la ligne numéro 13, remplacez simplement OwEKLE4jpQ== par le mot de passe crypté que vous trouvez dans le fichier .dbeaver-data-sources.xml pour votre source de données intéressée. Compilez et exécutez-le, il imprimera le mot de passe en texte clair.

https://github.com/jaisonpjohn/dbeaver-password-retriever/blob/master/SimpleStringEncrypter.java

Apparemment, c'est une erreur "populaire". J'ai donc déployé une fonction lambda AWS avec le code mentionné. Utilisez ceci à vos propres risques, vous ne saurez jamais si je surveille votre mot de passe ou non

curl https://lmqm83ysii.execute-api.us-west-2.amazonaws.com/prod/dbeaver-password-decrypter \
-X POST --data "OwEKLE4jpQ=="

Mieux encore, voici l'interface utilisateur https://bugdays.com/dbeaver-password-decrypter. Cela va sans dire, utilisez ceci à vos propres risques

0 votes

Je essaie de faire fonctionner ceci avec les étapes suivantes, mais cela ne fonctionne pas. J'ai modifié le programme pour inclure la chaîne cryptée du fichier. J'ai compilé le programme avec javac SimpleStringEncrypter.java. Ensuite, en essayant de l'exécuter avec javac SimpleStringEncrypter, je reçois l'erreur Impossible de trouver ou de charger la classe principale

0 votes

@Oranges13 C'est un problème étrange et je pense que cela n'a rien à voir avec ce programme. Je vous suggère de compiler et exécuter un programme helloworld avec succès, puis de remplacer le contenu de ce programme par le fichier donné ci-dessus et de le recompiler et de l'exécuter.

0 votes

J'ai dû commenter l'espace de noms dans le fichier pour qu'il fonctionne efficacement.

186voto

Tatsh Points 63

Cela peut être fait avec OpenSSL:

openssl aes-128-cbc -d \
  -K babb4a9f774ab853c96c2d653dfe544a \
  -iv 00000000000000000000000000000000 \
  -in credentials-config.json | \
  dd bs=1 skip=16 2>/dev/null

Exemple pour macOS en une seule ligne:

openssl aes-128-cbc -d -K babb4a9f774ab853c96c2d653dfe544a -iv 00000000000000000000000000000000 -in "${HOME}/Library/DBeaverData/workspace6/General/.dbeaver/credentials-config.json" | dd bs=1 skip=16 2>/dev/null

Pour Linux, changez le chemin ci-dessus en ~/.local/share/DBeaverData/workspace6/General/.dbeaver/credentials-config.json.

La clé est issue de la source et est convertie en hexadécimal. Cela peut être fait en Python:

>>> import struct
>>> struct.pack('<16b', -70, -69, 74, -97, 119, 74, -72, 83, -55, 108, 45, 101, 61, -2, 84, 74).hex()
'babb4a9f774ab853c96c2d653dfe544a'

Modifier: J'ai publié le script pour ceci ici.

4 votes

Fonctionne avec le nouveau 21+: En fait, testé avec : Versión 21.0.3.202104181339

2 votes

Fonctionne très bien avec la version Windows de dbeaver, je viens de l'exécuter dans WSL2.

0 votes

Fonctionne toujours en version 22 (22.0.1.202203181646) installée à partir du paquet rpm.

69voto

rogerdpack Points 12806

Pour DBeaver 6.1.3+ les informations d'identification sont désormais stockées dans un fichier "json" avec un cryptage différent.

Cela semblait faire l'affaire pour moi :

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 {

  // depuis la source DBeaver 23/08/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("syntaxe: param1: chemin complet de votre fichier credentials-config.json");
      System.exit(1);
    }
    System.out.println(decrypt(Files.readAllBytes(Paths.get(args[0]))));
  }

}

Transmettez-lui le chemin de votre fichier credentials-config.json sur le système de fichiers local, pour moi c'était

 Compiler
 $ javac DecryptDbeaver.java
 Maintenant exécutez-le [ajustez les chemins pour cibler votre fichier credentials-config.json]
 $ java DecryptDbeaver ~/Library/DBeaverData/workspace6/General/.dbeaver/credentials-config.json
 Ou si java 11+ :
 $ java DecryptDbeaver.java ~/Library/DBeaverData/workspace6/General/.dbeaver/credentials-config.json

Cela affichera dans la console l'utilisateur et le mot de passe pour les connexions.

{"postgres-jdbc-some-id":{"#connection":{"user":"your_user_name","password":"your_password"...

Si vous ne reconnaissez pas quel mot de passe correspond à quelle DB en fonction du nom d'utilisateur, vous devez également croiser les noms d'identification qu'il affiche initialement avec le fichier data-sources.json associé (qui devrait déjà être présent et non crypté et contient les coordonnées de la base de données).

8 votes

Comme auparavant, voici la version Python (3) : gist.github.com/felipou/50b60309f99b70b1e28f6d22da5d8e61

5 votes

Un message pour les utilisateurs de Linux, le fichier se trouve dans /General/.dbeaver/credentials-config.json Le répertoire Workspace se trouve dans les préférences -> Général -> Workspace. Donc pour moi, c'était : ~/.local/share/DBeaverData/workspace6/General/.dbeaver/crede‌​ntials-config.json

2 votes

Dans une interface de ligne de commande (CLI), Java peut exécuter des fichiers Java maintenant : java DecryptDbeaver.java ~/.local/share/DBeaverData/workspace6/General/.dbeaver/crede‌​ntials-config.json

50voto

Fiach Reid Points 85

Pour les utilisateurs de Windows (Version testée 7.3.4, également testée 22.2.3)

Appuyez sur Fichier > Exporter > DBeaver > Projet

Changez le nom du fichier exporté en .zip et décompressez

Téléchargez OpenSSL et copiez \projects\General\.dbeaver\credentials-config.json dans le même dossier que le répertoire bin d'openssl

Ensuite, exécutez :

openssl aes-128-cbc -d -K babb4a9f774ab853c96c2d653dfe544a -iv 00000000000000000000000000000000 -in "credentials-config.json"

Si vous avez WSL installé, cette commande peut également être exécutée à partir d'une installation Linux avec openssl disponible (which openssl) depuis n'importe quel répertoire de l'installation Linux (Testé avec Ubuntu sur WSL2 en copiant le fichier vers \\wsl$\Ubuntu\home\me\dbeaver\credentials).

Il affichera par défaut dans le terminal, si vous avez besoin dans un fichier, ajoutez > nom_fichier_choisi.json à la commande.

0 votes

Il ne se passe rien. Où puis-je trouver le résultat

1 votes

Merci! Ca a fonctionné pour moi.

3 votes

Travailler également pour Ubuntu

21voto

felipou Points 569

Décrypter le script, en Python, pour la version 6.1.3+ de DBeaver, basé sur la réponse de @rogerdpack :

https://gist.github.com/felipou/50b60309f99b70b1e28f6d22da5d8e61

Pour les anciennes versions de DBeaver, il existe un autre script basé sur la réponse de @so-random-dude :

https://gist.github.com/felipou/f5472ad5f6a414528b44beb102e17fb4

0 votes

Ça fonctionne en python3

0 votes

Bonjour, j'ai vraiment besoin de votre solution, elle semble super. Mais je suis un débutant total et je fais tout de travers. J'ai trouvé mon mot de passe et je l'ai mis entre guillemets PASSWORD_ENCRYPTION_KEY = b"mon_mot_de_passe" et j'ai eu l'erreur "ligne 4, dans imprimer(sys.argv[1]) IndexError: liste index hors de portée", s'il vous plaît conseillez-moi, qu'est-ce que je rate ? (Dbeaver v6.0)

0 votes

Apparemment, vous avez essayé le script pour les anciennes versions de DBeaver, êtes-vous sûr que c'est celui que vous voulez ? Je ne me rappelle pas vraiment comment ça fonctionne, mais il semble que vous deviez passer le mot de passe crypté en argument. Le nouveau script ne le demande pas.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X