基于Go编写一个可视化Navicat本地密码解析器

这篇具有很好参考价值的文章主要介绍了基于Go编写一个可视化Navicat本地密码解析器。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前提

开发小组在测试环境基于docker构建和迁移一个MySQL8.x实例,过程中大意没有记录对应的用户密码,然后发现某开发同事本地Navicat记录了根用户,于是搜索是否能够反解析Navicat中的密码掩码(这里可以基本断定Navicat对密码是采用了对称加密算法),于是发现了这个仓库:

  • how-does-navicat-encrypt-password

密码的解密算法显然是被泄露了,那么就可以利用起来。加之笔者之前花了一点点时间入门了一下Go,于是业余花了点时间编写了一个GUI工具。这个工具主要功能是:在Windows系统下,自动读取Navicat在注册列表中写入的所有(数据库)服务器连接数据作为列表展示,对于每个服务器连接数据的密码尝试进行解密。效果如下:

基于Go编写一个可视化Navicat本地密码解析器,golang,开发语言,后端
navicat-watcher-1.png

大致原理

参考how-does-navicat-encrypt-password仓库,因为Navicat两种版本的对称加密算法的具体算法、秘钥和加密向量都被泄露了,得知:

  • 版本一(Low):使用Blowfish/ECB/NoPadding模式

  • 版本二(High):使用AES/CBC/PKCS5Padding模式

其中AES/CBC/PKCS5Padding实现是比较简单的,Blowfish/ECB/NoPaddingGo的原生类库中刚好缺少了ECB解码器,只能仔细翻阅how-does-navicat-encrypt-passwordJava版本代码并且强行转换为Go实现:

func (l *LowVersionCipher) Decrypt(input string) (string, error) {
 ciphertext, err := hex.DecodeString(input)
 if err != nil {
  return "", err
 }
 if len(ciphertext)%8 != 0 {
  return "", errors.New("ciphertext length must be a multiple of 8")
 }
 plaintext := make([]byte, len(ciphertext))
 cv := make([]byte, len(l.iv))
 copy(cv, l.iv)
 blocksLen := len(ciphertext) / blowfish.BlockSize
 leftLen := len(ciphertext) % blowfish.BlockSize
 decrypter := NewECBDecrypter(l.cipher)
 for i := 0; i < blocksLen; i++ {
  temp := make([]byte, blowfish.BlockSize)
  copy(temp, ciphertext[i*blowfish.BlockSize:(i+1)*blowfish.BlockSize])
  if err != nil {
   panic(err)
  }
  decrypter.CryptBlocks(temp, temp)
  xorBytes(temp, cv)
  copy(plaintext[i*blowfish.BlockSize:(i+1)*blowfish.BlockSize], temp)
  for j := 0; j < len(cv); j++ {
   cv[j] ^= ciphertext[i*blowfish.BlockSize+j]
  }
 }

 if leftLen != 0 {
  decrypter.CryptBlocks(cv, cv)
  temp := make([]byte, leftLen)
  copy(temp, ciphertext[blocksLen*blowfish.BlockSize:])
  xorBytes(temp, cv[:leftLen])
  copy(plaintext[blocksLen*blowfish.BlockSize:], temp)
 }

 return string(plaintext), nil
}

func xorBytes(a []byte, b []byte) {
 for i := 0; i < len(a); i++ {
  aVal := int(a[i]) & 0xff // convert byte to integer
  bVal := int(b[i]) & 0xff
  a[i] = byte(aVal ^ bVal) // xor aVal and bVal and typecast to byte
 }
}

接着基于golang.org/x/sys/windows/registry加载Windows系统注册列表下的服务器连接数据列表,Navicat多个版本测试发现服务器连接数保存在注册列表的Software\PremiumSoft\Navicat\Servers目录下,只需要全量读取出来并且按照每个服务器连接数据的明细k-v一步一步解析即可。这个解析过程的伪代码如下:

const NsPath = `Software\PremiumSoft\Navicat\Servers`
nsp, _ := registry.OpenKey(registry.CURRENT_USER, NsPath, registry.READ)
subKeys, _ := nsp.ReadSubKeyNames(999)
var servers []*Server
for _, subKey := range subKeys {
    serverPath := strings.Join([]string{NsPath, subKey}, `\`)
    sp, _ := registry.OpenKey(registry.CURRENT_USER, serverPath, registry.READ)
    // 数据库的版本
    serverVersion, _, _ := sp.GetIntegerValue("ServerVersion")
    // host
    host, _, _ := sp.GetStringValue("Host")
    // 用户名
    username, _, _ := sp.GetStringValue("UserName")
    // 密码密文
    pwd, _, _ := sp.GetStringValue("Pwd")
    // 端口,一般是3306
    port, _, _ := sp.GetIntegerValue("Port")
    realPwd := pwd
    if (len(pwd) > 0){
        // 解密得到密码明文
        realPwd, _ = cipher.Decrypt(pwd)
    }
    servers = append(servers, &Server{...})
}

小结

「提醒」 - 这个项目仅仅是提供参考和学习,供个人本地开发时候使用,切勿用于窃取他人的数据库密码。项目仓库:

  • navicat-watcher

顺带一提使用fyne做GUI开发效果还可以,不过目前这个库还存在比较多BUG,性能高的同时占用的资源也比较高。

(本文完 c-1-d e-a-20230802 很久没写文章了)文章来源地址https://www.toymoban.com/news/detail-626638.html

到了这里,关于基于Go编写一个可视化Navicat本地密码解析器的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 配置使用Navicat或PLSQL可视化工具远程连接Oracle

    本文讲解的是在没有 Oracle 环境,如何使用可视化工具配置远程连接服务器 Oracle 数据库。 很多时候,我们需要使用SQL客户端工具连接服务器的 Oracle,由于本地没有安装 Oracle ,没有连接 Oracle 的 oci.dll 文件,导致使用可视化工具(如 Navicat 、 PLSQL 等)连接不上 Oracle。 Oracl

    2024年02月01日
    浏览(49)
  • mysql添加索引的方法(Navicat可视化加索引和sql语句加索引)

    使用索引的场景: 阿里云日志里出现了慢sql  然后发现publish_works_id字段会经常用于一些关联,所以决定把这个字段加上索引,优化sql 可视化navicat操作字段加索引,选择字段所在的表,第一步:右键-设计表 第二步:点击索引  第三步:添加索引 下面是通过sql语句添加索引的方法: 1、普

    2024年02月05日
    浏览(34)
  • MySQL5.7数据库、Navicat Premium1.6可视化工具安装教程【详细教程】

    MySQL: MySQL5.7.23 Navicat Premium: Navicat Premium16 NavicatCracker: NavicatCracker16.0.7.0 注:这里MySQL版本最好选择5.7.23的 1、双击打开文件mysql-installer-community-5.7.23.0.msi : 2、选择安装类型,选择自定义安装 3、选择安装的产品和功能 1、依次点开 “MySQL Servers”“MySQL Servers”“MySQL Ser

    2024年02月13日
    浏览(59)
  • 一款C++编写的数据可视化库Matplot++

    它是基于著名的 Matplotlib 库(Python 中广泛使用的绘图库)构建的,旨在提供类似于 Matplotlib 的功能,但专门为 C++ 设计。Matplot++ 支持多种图表类型,包括线图、散点图、条形图、直方图、误差线图等,使数据可视化在 C++ 应用程序中变得简单。 源代码:传送门 说明文档:传

    2024年02月04日
    浏览(37)
  • 可视化界面Tkinter编写你的小程序

    本文将会介绍 Tkinter 模块的使用。Tkinter 模块是 Python 的标准 Tk GUI 工具包的接口。其中Tkinter 是唯一一个 Python 内置的标准库,虽然它做出来的 GUI 看上去比较不美观,但鉴于它可在多平台运行(Windows、Linux、macOS),因此我们可以用它来开发一些简单的小程序;而且tk中使用的

    2024年02月09日
    浏览(35)
  • 正则可视化工具:学习和编写正则表达式的利器

    正则表达式是一种强大的文本匹配和处理工具,但对于初学者和非专业开发者来说,编写和理解正则表达式可能是一项具有挑战性的任务。为了帮助人们更好地学习和编写正则表达式,正则可视化工具应运而生。本文将探讨正则可视化工具的优点,分析其在学习和编写正则表

    2024年02月19日
    浏览(36)
  • 爬虫入门指南(8): 编写天气数据爬虫程序,实现可视化分析

    天气变化是生活中一个重要的因素,了解天气状况可以帮助我们合理安排活动和做出决策。本文介绍了如何使用Python编写一个简单的天气数据爬虫程序,通过爬取指定网站上的天气数据,并使用Matplotlib库对数据进行可视化分析。通过这个例子,我们不仅可以学习Python的相关库

    2024年02月12日
    浏览(46)
  • YOLOV5 部署:QT的可视化界面推理(根据UI窗口编写内部函数)

    上一章,UI的可视化界面已经创建好了。并且通过UI文件编译成了python可以处理的py文件,为了方便使用,我们新建了qt_inference 对ui的py脚本进行调用,效果如下 UI可视化的生成:YOLOV5 部署:QT的可视化界面推理(创建UI,并编译成py文件)-CSDN博客 本章将接着上面操作,完成一

    2024年04月08日
    浏览(36)
  • go语言恶意代码检测系统--对接前端可视化与算法检测部分

    恶意代码检测系统。 功能点 详细描述 注册账号 未注册用户注册成为产品用户,从而具备享有产品各项服务的资格 登录账号 用户登录产品,获得产品提供的各项服务 上传恶意样本 用户可以将上传自己的收集到的恶意样本及其样本属性,网站会对该恶意样本进行保存 获取恶

    2024年02月12日
    浏览(43)
  • 【R语言】——基因GO/KEGG功能富集结果可视化(保姆级教程)

    上期“原来基因功能富集分析这么简单”介绍如何使用DAVID在线分析工具对基因进行GO/KEGG功能富集分析。本期则介绍使用R语言ggplot包对DAVID在线分析工具所获得的基因GO/KEGG功能富集结果进行可视化。 1 数据准备 数据输入格式(xlsx格式): 注:DAVID导出来的“%”这列为“Ge

    2024年02月13日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包