恢复存储在我的 DBeaver 连接中的数据库密码
Recover DB password stored in my DBeaver connection
我忘记了一个开发实例的密码(不负责任的..是的,我正在努力)。我已使用密码将连接保存在我的 DBeaver 中。我仍然可以使用该连接进行连接。 DBeaver 没有以纯文本形式显示它。无论如何我可以找回密码吗?要求 DBA 重置密码是最后的手段。我试图将粘贴复制到记事本,显然复制被禁用了。
编辑:对于 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 是您最不用担心的!
如果有包声明就编译
javac-d。 SimpleStringEncrypter.java
它会把它放在当前目录下的正确目录结构中
然后你可以给
java-cp。 packagename.SimpleStringEncrypter 它将 运行。
基本 java.
总之这个程序很棒,为我节省了很多时间。
对于 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 本地文件系统上的文件,对我来说是
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"...
如果您无法根据用户名识别哪个密码进入哪个数据库,则必须交叉 link id 名称,它最初也会输出到同级 data-sources.json
文件(应该已经是存在且未加密并包含数据库坐标)。
解密脚本,在 Python 中,针对 DBeaver 版本 6.1.3+,基于@rogerdpack 的回答:
https://gist.github.com/felipou/50b60309f99b70b1e28f6d22da5d8e61
对于较旧的 DBeaver 版本,还有另一个基于@so-random-dude 的回答的脚本:
https://gist.github.com/felipou/f5472ad5f6a414528b44beb102e17fb4
这可以用 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。
如果您不想要所有已保存的连接
只需从文件系统中删除 --\DBeaverData\workspace6\General 文件夹
这样它就不能再询问任何密码了。
并且工作区数据将丢失。
您将失去所有自定义设置和首选项。
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"
看看这个:
docker run -d -p 18080:8080 --name crack-dbeaver-password-18080 geekyouth/crack-dbeaver-password
这是获取所需目标路径上的 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 中。我仍然可以使用该连接进行连接。 DBeaver 没有以纯文本形式显示它。无论如何我可以找回密码吗?要求 DBA 重置密码是最后的手段。我试图将粘贴复制到记事本,显然复制被禁用了。
编辑:对于 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 是您最不用担心的!
如果有包声明就编译 javac-d。 SimpleStringEncrypter.java 它会把它放在当前目录下的正确目录结构中 然后你可以给 java-cp。 packagename.SimpleStringEncrypter 它将 运行。 基本 java.
总之这个程序很棒,为我节省了很多时间。
对于 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 本地文件系统上的文件,对我来说是
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"...
如果您无法根据用户名识别哪个密码进入哪个数据库,则必须交叉 link id 名称,它最初也会输出到同级 data-sources.json
文件(应该已经是存在且未加密并包含数据库坐标)。
解密脚本,在 Python 中,针对 DBeaver 版本 6.1.3+,基于@rogerdpack 的回答:
https://gist.github.com/felipou/50b60309f99b70b1e28f6d22da5d8e61
对于较旧的 DBeaver 版本,还有另一个基于@so-random-dude 的回答的脚本:
https://gist.github.com/felipou/f5472ad5f6a414528b44beb102e17fb4
这可以用 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。
如果您不想要所有已保存的连接
只需从文件系统中删除 --\DBeaverData\workspace6\General 文件夹 这样它就不能再询问任何密码了。 并且工作区数据将丢失。
您将失去所有自定义设置和首选项。
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"
看看这个:
docker run -d -p 18080:8080 --name crack-dbeaver-password-18080 geekyouth/crack-dbeaver-password
这是获取所需目标路径上的 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