恢复存储在我的DBeaver连接中的DB密码

151

我忘记了开发实例的密码(不负责任..是的,我正在解决这个问题)。我在DBeaver中保存了该连接并输入了密码。我仍然能够使用该连接进行连接。但DBeaver没有显示纯文本。有没有办法找回密码?请DBA重置密码是最后的手段。我试图复制粘贴到记事本,但显然无法复制。


2
这个对我有用:https://bugdays.com/dbeaver-password-decrypter - Luciana Campello
这个问题是针对程序员经常使用的工具,巧合的是其他人也在使用它 LOL。虽然 SU 也可能适用,但我认为在这里使用它很好,因为答案实际上是一个编程答案。 - rogerdpack
@rogerdpack DBeaver 可能经常被程序员使用,但这并不意味着它是主要被程序员使用的工具。它还被数据库管理员或其他查询数据库的人使用。 - Mark Rotteveel
在Windows上,这个命令可以运行:openssl aes-128-cbc -d -K babb4a9f774ab853c96c2d653dfe544a -iv 00000000000000000000000000000000 -in "%AppData%\DBeaverData\workspace6\General\.dbeaver\credentials-config.json"。你可以在这里下载Windows上的openssl - https://wiki.openssl.org/index.php/Binaries - undefined
9个回答

240

对于DBeaver 6.1.3及以上版本

凭证文件位于~/Library/DBeaverData/workspace6/General/.dbeaver/credentials-config.json(我的操作系统是Mac),与其前身采用不同的加密策略。请参考下一个答案以了解如何解密。它非常好用。

DBeaver 6.1.3之前的版本

按照以下步骤进行操作(我的DBeaver版本是3.5.8并且在Mac OsX El Capitan上):

  1. 找到DBeaver存储连接详细信息的文件,对我而言,它位于以下位置:~/.dbeaver/General/.dbeaver-data-sources.xml。由于这个文件是隐藏的,所以在查找时要记住这一点。
  2. 在该文件中找到您感兴趣的数据源定义节点。
  3. 解密密码:不幸的是,除了密码之外,其他所有内容都是明文。密码以某种加密形式存在。使用此工具将其解密为明文。

或者

我通过复制DBeaver方法核心编写了一个快速而不太规范的Java程序以解密密码。一旦您获得了加密的密码字符串,只需执行此程序,它将将密码转换为纯文本并打印出来。

如何运行它

在第13行中,只需用您在.dbeaver-data-sources.xml文件中找到的感兴趣数据源的加密密码替换OwEKLE4jpQ==。编译并运行它,它将输出明文密码。

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

显然,这是一个“普遍”的错误。因此,我部署了一个使用上述代码的AWS Lambda函数。请自行决定是否使用该函数,因为您永远不会知道我是否记录了您的密码。

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

更好的是,这里有用户界面https://bugdays.com/dbeaver-password-decrypter。不用说,使用此工具需自负风险。


1
@Oranges13 命名空间?你是指包名吗?谢谢,我已经从代码中删除了它。 - so-random-dude
16
我以你的代码为参考创建了一个等效的Python脚本:https://gist.github.com/felipou/f5472ad5f6a414528b44beb102e17fb4 这比我安装Java编译器所需的时间要快。 - felipou
2
@felipou,你的解决方案很棒,你应该将其发布为答案。 - NickZeng
8
从版本6.1.3开始,此方法已不再适用。根据 https://github.com/dbeaver/dbeaver/wiki/Admin-Manage-Connections 的说明,凭据现在加密存储在.dbeaver/credentials-config.json中。我认为这是一个加密的json文件(不是明文json)。 - Tim Ludwinski
1
使用版本 Version: 6.0.3.201904211926,cred文件位于~/.dbeaver4/General/.dbeaver-data-sources.xml - Jason Kim
显示剩余9条评论

223

这可以通过 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

密钥来自源代码并转换为十六进制。这可以在Python中完成:

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

编辑:我已经在这里发布了此脚本。


5
实际上,已经在新的21+版本进行了测试: 事实上,已与以下版本进行测试:Versión 21.0.3.202104181339 - Gonzalo
2
在 Windows 版本的 DBeaver 中运行得非常好,我刚刚在 WSL2 中运行了它。 - Preston
1
在 DBeaver 21.3 上工作,救了我的命 :D 谢谢。 - raphaklaus
21.0.0 windows 我得到了“bad decrypt 9776:error:06065064:digital envelope routines:EVP_DecryptFinal_ex:bad decrypt:./crypto/evp/evp_enc.c:468:" 在命令提示符和wsl2中也是如此。 - pooroldpedro
2
现在,解密密钥存储在 https://github.com/dbeaver/dbeaver/blob/8ed6d430a12ddc065a8bb69ec11babb152462f15/plugins/org.jkiss.dbeaver.registry/src/org/jkiss/dbeaver/registry/BaseProjectImpl.java#L77。 - Julyano Felipe
显示剩余6条评论

76

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文件的路径传递给它,对于我来说是这样的

 Compile it
 $ javac DecryptDbeaver.java
 Now run it [adjusts the paths to target your credentials-config.json file]
 $ java DecryptDbeaver ~/Library/DBeaverData/workspace6/General/.dbeaver/credentials-config.json
 Or if java 11+:
 $ java DecryptDbeaver.java ~/Library/DBeaverData/workspace6/General/.dbeaver/credentials-config.json

它将在控制台输出连接的用户+密码。

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

如果您无法根据用户名识别哪个密码属于哪个数据库,则必须交叉链接最初还会输出到同级data-sources.json文件的id名称(该文件应该已经存在且未加密,并包含数据库坐标)。


8
以下是Python(3)版本的链接:https://gist.github.com/felipou/50b60309f99b70b1e28f6d22da5d8e61 - felipou
5
Linux用户请注意,该文件位于<workspace>/General/.dbeaver/credentials-config.json。工作区目录可以在“首选项”->“通用”->“工作区”中找到。因此,对于我来说,它是:~/.local/share/DBeaverData/workspace6/General/.dbeaver/credentials-config.json。 - Aaron Chamberlain
2
在一个CLI中,Java现在可以运行Java文件:java DecryptDbeaver.java ~/.local/share/DBeaverData/workspace6/General/.dbeaver/credentials-config.json - pdem
有人有重新编码JSON的解决方案吗?目标是通过脚本设置凭据并从外部源获取它们。 - J4Y-M
在Windows上,路径是:C:\Users\{username}\AppData\Roaming\DBeaverData\workspace6\General\.dbeaver\credentials-config.json - Jasper Citi
@J4Y-M 或许可以像其他答案中那样使用 OpenSSL,但是相反的方式? :) - rogerdpack

64

对于Windows用户(已测试版本7.3.4,也已测试22.2.3),请按以下步骤操作:

点击文件 > 导出 > DBeaver > 项目

将导出文件的名称更改为.zip,并解压缩

下载OpenSSL,并将\projects\General\.dbeaver\credentials-config.json复制到openssl的bin目录所在的同一文件夹中

然后运行:

openssl aes-128-cbc -d -K babb4a9f774ab853c96c2d653dfe544a -iv 00000000000000000000000000000000 -in "credentials-config.json"
如果您已经安装了WSL,那么此命令也可以在Linux安装上运行,并且需要从Linux安装中的任何目录(测试过使用正在运行的Ubuntu在WSL2上并将文件复制到 \\wsl$\Ubuntu\home\me\dbeaver\credentials)中可用的openssl中运行。 如果您需要将命令输出保存到文件中,可以在命令后添加 > 文件名.json

什么也没有发生。我在哪里可以找到结果? - Lore
3
同样为Ubuntu工作。 - TalESid
2
确认正常工作! - petrosmm
不需要导出,只需从“credentials-config.json”文件中解密(您可以在此处找到它:%appdata%\DBeaverData\workspace6\General.dbeaver)。 - leon22
如果你有GitBash,就不需要在Windows上安装OpenSSL。在GitBash的安装文件夹中有一个OpenSSL的版本:https://dev59.com/-VUL5IYBdhLWcg3wQGDd - Svein Terje Gaup
显示剩余2条评论

9
这是获取 DBeaver 凭据文件解密版本并将其保存至目标路径的命令:
openssl aes-128-cbc -d \
-K babb4a9f774ab853c96c2d653dfe544a \
-iv 00000000000000000000000000000000 \
-in {path for the encrypted credentials file} > \
{your desired destination file}
  • 您期望的目标文件位置,例如 ~/Desktop/dbeaver-credentials.json

您将在桌面上找到 dbeaver-credentials.json 文件。但是该文件仅包含一些连接语句(如 mysql5-17be86ca5ea-294e2a427af47fc4)的用户名和密码列表。没有数据库或服务器名称。您需要根据对象 ID 查找连接。


对于 Ubuntu 的 snapdbeaver-ce

  • 加密凭证文件的路径 = ~/snap/dbeaver-ce/current/.local/share/DBeaverData/workspace6/General/.dbeaver/credentials-config.json

8

对于Linux操作系统用户,在终端中运行以下命令:

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

只需将字符串"path_to/credentials-config.json"替换为实际文件的路径,您将得到如下内容:

{"mysql8-17e009389a8-5fc414bd64e183f4":{"#connection":{"user":"root","password":"root"}},"mysql8-18099236fdf-3c3fc761c6fdde":{"#connection":{"user":"user.name","password":"your_secret_password"},"network/ssh_tunnel":{"user":"sql","jumpServer0.password":""}}}%

4
如果有包声明,只需编译javac -d . SimpleStringEncrypter.java即可。它将在当前目录下的正确目录结构中放置它。然后你可以使用java -cp . packagename.SimpleStringEncrypter运行它。基本的Java。无论如何,这个程序很棒,为我节省了很多时间。

3

-5

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

只需从文件系统中删除--\DBeaverData\workspace6\General文件夹,这样它就不会再次询问任何密码。 工作区数据也将丢失。

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


1
虽然这可能有用,但与原始问题无关。 - dankilev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接