82 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 oui, j'y travaille). 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 l'affiche pas en texte clair. Existe-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 un bloc-notes, mais la copie est apparemment désactivée.

1 votes

191voto

so-random-dude Points 5411

J'ai été confronté à ce problème récemment. Suivez ces étapes (ma version de DBeaver était 3.5.8 et elle était sur Mac OSX El Capitan)

  1. Localisez le fichier dans lequel DBeaver stocke les détails de la connexion. Pour moi, c'était à cet endroit ~/.dbeaver/General/.dbeaver-data-sources.xml . Ce fichier est caché, donc gardez cela à l'esprit lorsque vous le recherchez.
  2. Localisez le nœud 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, qui est en quelque sorte crypté. J'ai mis en place une méthode rapide et sale Programme Java 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 mots 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

Sur la ligne numéro 13, remplacez simplement OwEKLE4jpQ== avec n'importe quel mot de passe crypté que vous trouvez dans .dbeaver-data-sources.xml pour la source de données qui vous intéresse. Compilez-le et exécutez-le, il imprimera le mot de passe en texte clair.

https://github.com/so-random-dude/oneoffcodes/blob/master/SimpleStringEncrypter.java

Modifier

Apparemment, c'est une erreur "populaire". J'ai donc déployé une fonction lambda AWS avec le code ci-dessus. Utilisez-le à vos risques et périls, vous ne saurez jamais si j'enregistre votre mot de passe ou non :D

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

Edit 2

Encore mieux, voici l'interface utilisateur http://dbeaver-password-decrypter.s3-website-us-west-2.amazonaws.com/ . Cela va sans dire, utilisez-le à vos risques et périls. Le non-Https est le dernier de vos soucis ! :)

0 votes

J'essaie de le faire fonctionner en suivant les étapes suivantes, mais ça ne marche pas. J'ai modifié le programme pour inclure la chaîne cryptée du fichier. J'ai compilé le programme avec javac SimpleStringEncrypter.java . Puis j'essaie de l'exécuter avec javac SimpleStringEncrypter Je reçois l'erreur Could not find or load main class

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 d'exécuter un programme Helloworld avec succès, puis de remplacer le contenu de ce programme par le fichier ci-dessus, de le recompiler et de l'exécuter.

0 votes

J'ai dû commenter l'espace de nom dans le fichier pour que cela fonctionne efficacement.

57voto

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 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 de la source et est converti 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'

Edit : J'ai publié le script pour cela ici .

55voto

rogerdpack Points 12806

Pour DBeaver 6.1.3+, les références sont stockées dans un fichier "json" avec un cryptage différent.

Cela semble 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 {

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

}

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

 compile it
 $ javac DecryptDbeaver.java
 run it [adjusts the paths to target your credentials-config.json file]
 $ java DecryptDbeaver ~/Library/DBeaverData/workspace6/General/.dbeaver/credentials-config.json

Il affichera sur 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 savez pas quel mot de passe va à quelle base de données en fonction du nom d'utilisateur, vous devez établir un lien croisé entre les noms d'identification qu'il produit initialement et les noms d'autres personnes. data-sources.json (qui devrait déjà être présent et non crypté et qui contient les coordonnées de la base de données).

19voto

felipou Points 569

Décryptage du script, en Python, pour DBeaver version 6.1.3+, 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

5voto

Fiach Reid Points 85

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

Appuyez sur Fichier > Exportation > DBeaver > Projet

Changez le nom du fichier d'exportation en .zip, et décompressez-le.

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

Alors cours :

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

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