Python 解密 Navicat导出的数据库连接,Navicat数据库连接导入DBeaver。
最近公司收到Navicat律师告知书,让停止使用Navicat,用了那么久的数据库连接工具,不得不换其他的。
最终选择了开源的DBeaver。
下载链接:https://dbeaver.io
下载开源版本:

也可以用这个地址:
https://objects.githubusercontent.com/github-production-release-asset-2e65be/44662669/30fdb247-57eb-4183-b836-19d8d625434e?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=releaseassetproduction%2F20241219%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20241219T061958Z&X-Amz-Expires=300&X-Amz-Signature=f55c4bc0a182291a6e29415848ed64ef95a4e3f039e02c8214c6c1de88627af3&X-Amz-SignedHeaders=host&response-content-disposition=attachment%3B%20filename%3Ddbeaver-ce-24.3.0-x86_64-setup.exe&response-content-type=application%2Foctet-stream
若不能使用的话,自己进入上面的页面下载。
收费版本去这:https://dbeaver.com/download/,收费的有5个版本,都挺贵的。收费的话,还是navicat便宜。
-----------------------------------------------------------------------------------
安装完DBeaver后,把Navicat导出的connections.ncx文件直接导入DBeaver。直接访问提示连接失败,因为connections.ncx文件里的密码都是加密的。
如图:

网上找了许久方法,有PHP的,复制代码去线上执行,反正跑不动,有python的,但也搞不定。
后来自己写了一个,大家可以直接使用:
#!/usr/bin/env python3
import sys
from Crypto.Hash import SHA1
from Crypto.Cipher import AES, Blowfish
from Crypto.Util import strxor, Padding
import xml.etree.ElementTree as ET
class Navicat11Crypto:
def __init__(self, Key = b'3DC5CA39'):
self._Key = SHA1.new(Key).digest()
self._Cipher = Blowfish.new(self._Key, Blowfish.MODE_ECB)
self._IV = self._Cipher.encrypt(b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF')
def decrypt_string(self, s: str):
if type(s) != str:
raise TypeError('Parameter s must be str.')
else:
plaintext = b''
ciphertext = bytes.fromhex(s)
cv = self._IV
full_round, left_length = divmod(len(ciphertext), 8)
for i in range(0, full_round * 8, 8):
t = self._Cipher.decrypt(ciphertext[i:i + 8])
t = strxor.strxor(t, cv)
plaintext += t
cv = strxor.strxor(cv, ciphertext[i:i + 8])
if left_length != 0:
cv = self._Cipher.encrypt(cv)
plaintext += strxor.strxor(ciphertext[8 * full_round:], cv[:left_length])
return plaintext.decode('ascii')
if __name__ == '__main__':
pc = Navicat11Crypto()
xml_path_x = r'C:\Users\xxxx\connections-all-20241219.ncx'
xml_path_y = r"C:\Users\xxxxx\connections.ncx"
tree = ET.parse(xml_path_y)
root_element = tree.getroot()
for child in root_element:
print('---------------------------------')
print('ConnectionName:', child.attrib['ConnectionName'])
print('Host:', child.attrib['Host'])
print('Port:', child.attrib['Port'])
print('UserName:', child.attrib['UserName'])
Password1 = pc.decrypt_string(child.attrib['Password'])
print('Password:', Password1)
print('SSH_Host:', child.attrib['SSH_Host'])
print('SSH_Port:', child.attrib['SSH_Port'])
print('SSH_UserName:', child.attrib['SSH_UserName'])
Password2 = pc.decrypt_string(child.attrib['SSH_Password'])
print('SSH_Password:', Password2)
print('------------------------------------')
执行结果:

得到密码后,替换密码即可:

另外,通过导入navicat的数据库连接文件,ssh默认没有加载,需要自己手动配置。

本文来自博客园,作者:drewgg,转载请注明原文链接:https://www.cnblogs.com/drewgg/p/18617750

浙公网安备 33010602011771号