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

Posted

技术标签:

【中文标题】恢复存储在我的 DBeaver 连接中的数据库密码【英文标题】:Recover DB password stored in my DBeaver connection 【发布时间】:2017-02-17 02:40:53 【问题描述】:

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

【问题讨论】:

这项工作适合我:bugdays.com/dbeaver-password-decrypter 【参考方案1】:

编辑:对于 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 上)

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

或者

我通过复制 DBeaver 的密码解密方法的核心,整理了一个快速而肮脏的Java program。一旦你有了加密的密码字符串,只需执行这个程序,它就会将密码转换为纯文本并打印出来

如何运行它

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

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=="

编辑 2

更好的是,这是 UI https://bugdays.com/dbeaver-password-decrypter。不用说,使用它需要您自担风险。非 Https 是您的后顾之忧! ?

【讨论】:

@Oranges13 命名空间?你的意思是包名?谢谢,我从代码中删除了它 我使用您的代码作为参考创建了一个等效的 python 脚本:gist.github.com/felipou/f5472ad5f6a414528b44beb102e17fb4 它比我安装 java 编译器要快:) @felipou 您的解决方案很棒,您应该将其发布为答案。 必须有链接http://dbeaver-password-decrypter.s3-website-us-west-2.amazonaws.com 从 6.1.3 版本开始,这不再有效。凭据现在根据以下内容加密存储在.dbeaver/credentials-config.json 中:github.com/dbeaver/dbeaver/wiki/Admin-Manage-Connections。我假设这是一个加密的 json 文件(它不是明文 json)。【参考方案2】:

如果有包声明就编译 爪哇 -d 。 SimpleStringEncrypter.java 它将把它放在当前目录下的正确目录结构中 然后你可以给 爪哇-cp。 packagename.SimpleStringEncrypter 它将运行。 基础java。

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

【讨论】:

【参考方案3】:

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


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

 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

它将用户+密码输出到控制台以进行连接。

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

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

【讨论】:

和以前一样,这里是 Python (3) 版本:gist.github.com/felipou/50b60309f99b70b1e28f6d22da5d8e61 Linux 用户注意事项,该文件位于 /General/.dbeaver/credentials-config.json 工作区目录可以在首选项 -> 常规 -> 工作区中找到。所以对我来说是:~/.local/share/DBeaverData/workspace6/General/.dbeaver/credentials-config.json【参考方案4】:

基于@rogerdpack 的回答,在 Python 中为 DBeaver 版本 6.1.3+ 解密脚本:

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

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

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

【讨论】:

您好,我真的需要您的解决方案,看起来很棒。但我是一个完全的初学者,这一切都错了。我找到了我的密码并将其放在引号 PASSWORD_ENCRYPTION_KEY = b"my_password" 之间,并得到错误“第 4 行,在 print(sys.argv[1]) IndexError: list index out of range”,请指教,什么我失踪了吗? (Dbeaver v6.0) 显然您尝试了旧 DBeaver 版本的脚本,您确定这是您想要的吗?我真的不记得它是如何工作的,但似乎您必须将加密密码作为参数传递。较新的脚本不需要这样做。【参考方案5】:

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

【讨论】:

适用于新的 21+:事实上,经过测试:版本 21.0.3.202104181339 在 Windows 版本的 dbeaver 上效果很好,我只是在 WSL2 中运行它。【参考方案6】:

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

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

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

【讨论】:

虽然它可能有用,但这与原始问题无关【参考方案7】:

对于 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"

【讨论】:

什么也没发生。在哪里可以找到结果 谢谢!为我工作。 同样适用于 Ubuntu【参考方案8】:

看看这家伙??

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

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

?太棒了!!!

【讨论】:

【参考方案9】:

这是在您想要的目标路径上获取解密版本的 dbeaver 凭据文件的命令:

openssl aes-128-cbc -d \
-K babb4a9f774ab853c96c2d653dfe544a \
-iv 00000000000000000000000000000000 \
-in path for the encrypted credentials file > \
your desired destination file

您会在桌面上找到dbeaver-credentials.json 文件。但是这个文件将只有用户名和密码的列表,没有数据库或服务器名称。你必须猜到。


对于 Ubuntu snap 软件包 dbeaver-ce

加密凭证文件的路径 = ~/snap/dbeaver-ce/current/.local/share/DBeaverData/workspace6/General/.dbeaver/credentials-config.json 您想要的目标文件 例如~/Desktop/dbeaver-credentials.json

【讨论】:

以上是关于恢复存储在我的 DBeaver 连接中的数据库密码的主要内容,如果未能解决你的问题,请参考以下文章

Navicat切换到DBeaver,如何同步连接信息

dbeaver修改时间合适

DBeaver 错误解决 maven 依赖项

dbeaver怎样连接数据库Oracle,MySqlSQLServer

DBeaver 通过 SSH 隧道连接

DBeaver连接Hive