web-dev-qa-db-fra.com

Récupérer le mot de passe DB stocké dans ma connexion DBeaver

J'ai oublié le mot de passe d'une instance de développement (irresponsable .. ouais, je travaille dessus). J'ai la connexion enregistrée dans mon DBeaver avec le mot de passe. Je peux toujours me connecter en utilisant cette connexion. DBeaver ne l'affiche pas en texte brut. Puis-je de toute façon récupérer le mot de passe? Demander à DBA de réinitialiser le mot de passe est le dernier recours. J'ai essayé de copier-coller sur un bloc-notes, la copie est apparemment désactivée.

38
Git_gal

J'ai rencontré ce problème récemment. Suivez ces étapes (ma version DBeaver était 3.5.8 et c'était sur Mac OSX El Capitan)

  1. Recherchez 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é, alors gardez cela à l'esprit lorsque vous le recherchez.
  2. Localisez votre nœud de définition de source de données intéressé dans ce fichier.
  3. Déchiffrez le mot de passe: Malheureusement, tout est en texte brut sauf le mot de passe; Le mot de passe se présente sous une forme cryptée. Déchiffrez-le en texte brut à l'aide de cette outil .

Ou

J'ai mis en place un rapide et sale programme Java en copiant le noyau 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é, exécutez simplement ce programme, il convertira le mot de passe en texte brut et l'imprimera

Comment l'exécuter

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

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

Modifier

Apparemment, c'est une erreur "populaire". J'ai donc déployé une fonction lambda AWS avec le code susmentionné. 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=="

Modifier 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. Non-Https est le moindre de vos soucis! :)

111
so-random-dude

s'il y a une déclaration de package, compilez simplement javac -d. SimpleStringEncrypter.Java il le mettra dans la structure de répertoire correcte sous le répertoire courant. Ensuite, vous pouvez donner Java -cp. Nom_package.SimpleStringEncrypter et il s'exécutera. Java de base.

Quoi qu'il en soit, ce programme est fantastique et m'a fait gagner beaucoup de temps.

2
kedar

Pour DBeaver 6.1.3+, les crédits sont stockés dans un fichier "json" maintenant avec un cryptage différent.

Cela a semblé faire le travail pour moi:

package org.familysearch.digitalarchive.tapedriveservice;

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
  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("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 ~/Library/DBeaverData/workspace6/General/.dbeaver/credentials-config.json

Il répertorie l'utilisateur + passe pour les connexions. Si vous ne savez pas quel mot de passe va à quelle base de données, vous pouvez croiser les noms avec le frère data-sources.json fichier (non chiffré).

0
rogerdpack