今天在使用一个数据库时一是半会想不起来数据库的密码了,后来想起来在客户端工具heidisql上有保存过密码,下面讲解如何获取heidisql保存的密码。

HeidiSQL是一款开源的SQL管理工具,用于管理MYSQL,MSSQL 等数据库,很多管理工具都会把密码存在本地,HeidiSQL也是如此,但是只是经过非常简单的编码,解密的过程如下。

使用的是版本是HeidiSQL_11.0_64_Portable,配置会存在软件目录下的portable_settings.txt中,如果是安装的版的话,HeidiSQL安装版会配置信息存在以下注册表中:

HKEY_CURRENT_USER\Software\HeidiSQL\

密码会保存在以下节点下面。

HKEY_CURRENT_USER\Software\HeidiSQL\Servers

打开portable_settings.txt可以看到配置文件中有以下这样的ip 密码之类这样的信息

HeidiSQL配置文件节选:

Servers\192.168.1.1\SessionCreated<|||>1<|||>2020-04-23 09:11:48
Servers\192.168.1.1\Host<|||>1<|||>192.168.1.1
Servers\192.168.1.1\WindowsAuth<|||>3<|||>0
Servers\192.168.1.1\CleartextPluginEnabled<|||>3<|||>0
Servers\192.168.1.1\User<|||>1<|||>root
Servers\192.168.1.1\Password<|||>1<|||>6A6A6A9
Servers\192.168.1.1\LoginPrompt<|||>3<|||>0
Servers\192.168.1.1\Port<|||>1<|||>3306
Servers\192.168.1.1\NetType<|||>3<|||>0
Servers\192.168.1.1\Compressed<|||>3<|||>0
Servers\192.168.1.1\LocalTimeZone<|||>3<|||>0
Servers\192.168.1.1\QueryTimeout<|||>3<|||>30
Servers\192.168.1.1\KeepAlive<|||>3<|||>20
Servers\192.168.1.1\FullTableStatus<|||>3<|||>1
Servers\192.168.1.1\Databases<|||>1<|||>
Servers\192.168.1.1\Library<|||>1<|||>libmysql-6.1.dll
Servers\192.168.1.1\Comment<|||>1<|||>
Servers\192.168.1.1\StartupScriptFilename<|||>1<|||>
Servers\192.168.1.1\TreeBackground<|||>3<|||>536870911
Servers\192.168.1.1\SSHtunnelHost<|||>1<|||>
Servers\192.168.1.1\SSHtunnelHostPort<|||>3<|||>22
Servers\192.168.1.1\SSHtunnelUser<|||>1<|||>
Servers\192.168.1.1\SSHtunnelPassword<|||>1<|||>1
Servers\192.168.1.1\SSHtunnelTimeout<|||>3<|||>4
Servers\192.168.1.1\SSHtunnelPrivateKey<|||>1<|||>
Servers\192.168.1.1\SSHtunnelPort<|||>3<|||>3307
Servers\192.168.1.1\SSL_Active<|||>3<|||>0
Servers\192.168.1.1\SSL_Key<|||>1<|||>
Servers\192.168.1.1\SSL_Cert<|||>1<|||>
Servers\192.168.1.1\SSL_CA<|||>1<|||>
Servers\192.168.1.1\SSL_Cipher<|||>1<|||>
Servers\192.168.1.1\ServerVersionFull<|||>1<|||>5.7.29 - MySQL Community Server (GPL)
Servers\192.168.1.1\ConnectCount<|||>3<|||>7
Servers\192.168.1.1\ServerVersion<|||>3<|||>50729
Servers\192.168.1.1\LastConnect<|||>1<|||>2020-05-09 11:32:06

通过反复把密码填为a r 1 aaa aaaa rrrr 之类,终于发现了算出密码的规则,以密码aaa为例子,在配置文件可以得到6A6A6A9 6A转为10进制得到106 减最后一位的9得到97,刚好可以对应ASCII码上的字母a,有3个6A,所以还可以还原得到aaa。

也就是说前面的都是ASCII码,最后一位是偏移量,ASCII减偏移量就是对应的密码字符。

以下是在ipython中解码的演示

int("6A",16)
Out[1]: 106

106 - 9
Out[2]: 97

chr(97)
Out[3]: 'a'

以下是一个读取HeidiSQL 配置文件中的密码的python3代码:

# -*- coding: utf-8 -*-
"""
2020-5-09 13:32:54 AnAn
"""
import re
settings = r"C:\Program Files\HeidiSQL_11.0_64_Portable\portable_settings.txt"

with open(settings,encoding="utf8") as f:
    lines = [r.strip() for r in f.readlines() if "\\Password<" in r]
passwords = [re.split("\<\|\|\|\>",r)[-1] for r in lines]

def heidipass(code):
    ascii = code[:-1]
    d = int(code [-1])
    decode = lambda x:chr(int(x,16) - d)
    password = ''.join(map(decode,re.findall("\w{2}",ascii)))
    return password

for r in passwords:
    print(heidipass(r))

HeidiSQL官方网站: http://www.heidisql.com/
ASCII码对照表 http://tool.oschina.net/commons?type=4

最后修改:2020 年 05 月 09 日
如果觉得我的文章对你有用,请随意赞赏