恢复存储在我的DBeaver连接中的数据库密码

时间:2016-10-08 03:33:15

标签: database encryption passwords dbeaver

我忘记了开发实例的密码(不负责任......是的,我正在研究它)。我使用密码保存在我的DBeaver中的连接。我仍然可以使用该连接进行连接。 DBeaver没有以纯文本显示它。无论如何我可以检索密码吗?要求DBA重置密码是最后的手段。我试图将粘贴复制到记事本中,显然禁用了复制。

8 个答案:

答案 0 :(得分:82)

我最近遇到了这个问题。请按照以下步骤操作(我的DBeaver版本为3.5.8,它在Mac OSX El Capitan上)

  1. 找到DBeaver存储连接详细信息的文件。对于 我,它在这个位置 ~/.dbeaver/General/.dbeaver-data-sources.xml。这个文件是隐藏的, 所以当你寻找时请记住这一点。
  2. 在该文件中找到您感兴趣的数据源定义节点。
  3. 解密密码:不幸的是,除密码外,一切都是纯文本;密码是某种加密形式。使用此tool将其解密为纯文本。
  4. 或者

    我通过复制DBeaver解密密码的方法,将一个快速而又脏的Java program放在一起。获得加密密码字符串后,只需执行此程序,它就会将密码转换为纯文本并打印出来

    如何运行

    在第13行,只需将OwEKLE4jpQ==替换为您在感兴趣的数据源的.dbeaver-data-sources.xml文件中找到的任何加密密码。编译并运行它,它将打印纯文本密码。

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

    修改

    显然,这是一个受欢迎的"错误。所以我已经使用上述代码部署了一个AWS lambda函数。使用此风险需要您自担风险,您永远不会知道我是否记录了您的密码:D

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

    编辑2

    更好的是,这是UI http://dbeaver-password-decrypter.s3-website-us-west-2.amazonaws.com/。不言而喻,使用此风险需要您自担风险。非Https是你最不担心的! :)

答案 1 :(得分:9)

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

}

在本地文件系统上将您的凭据-config.json文件的路径传递给我,对我来说是

 javac DecryptDbeaver.java # compile it
 java DecryptDbeaver ~/Library/DBeaverData/workspace6/General/.dbeaver/credentials-config.json

它将向控制台输出用于连接的用户密码。如果您不知道哪个密码进入哪个数据库,则必须将其ID名称交叉链接,并将其名称输出到同级data-sources.json文件(该文件应该已经存在并且未加密)。

答案 2 :(得分:7)

这可以通过OpenSSL完成:

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

macOS的一行示例:

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

对于Linux,将上述路径更改为~/.local/share/DBeaverData/workspace6/General/.dbeaver/credentials-config.json

密钥来自the source,并转换为十六进制。这可以在Python中完成:

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

编辑:我已经发布了the script for this here

答案 3 :(得分:3)

基于@rogerdpack的答案,使用Python解密DBeaver 6.1.3+版的脚本:

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

对于较旧的DBeaver版本,还有另一个基于@ so-random-dude答案的脚本:

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

答案 4 :(得分:2)

对于 Windows 用户(测试版 7.3.4)

按文件 > 导出 > DBeaver > 项目

将导出文件的名称改为.zip,然后解压

下载OpenSSL,将\projects\General.dbeaver\credentials-config.json复制到openssl的bin目录下

然后运行:

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

答案 5 :(得分:0)

如果有包声明,只需编译 javac -d。 SimpleStringEncrypter.java 它将放置在当前目录下的正确目录结构中 那你可以给 java -cp。 packagename.SimpleStringEncrypter,它将运行。 基本的Java。

无论如何,这个程序很棒,为我节省了很多时间。

答案 6 :(得分:0)

看这家伙??

docker run -d -p 18080:8080 --name crack-dbeaver-password-18080 geekyouth/crack-dbeaver-password:1.0.2

https://github.com/geekyouth/crack-dbeaver-password

? 太棒了!!!

答案 7 :(得分:-1)

如果您不想要所有已保存的连接

只需从文件系统中删除 --\DBeaverData\workspace6\General 文件夹 以便它不能再次询问任何密码。 并且工作区数据将丢失。

您将失去所有自定义设置和首选项。