欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

基于Go編寫一個(gè)可視化Navicat本地密碼解析器

 更新時(shí)間:2023年08月03日 09:56:28   作者:Throwable  
這篇文章主要給大家介紹了基于Go編寫一個(gè)可視化Navicat本地密碼解析器的方法,文中有詳細(xì)的代碼示例和圖文介紹,有需要的朋友可以參考閱讀本文

前提

開發(fā)小組在測試環(huán)境基于docker構(gòu)建和遷移一個(gè)MySQL8.x實(shí)例,過程中大意沒有記錄對應(yīng)的用戶密碼,然后發(fā)現(xiàn)某開發(fā)同事本地Navicat記錄了根用戶,于是搜索是否能夠反解析Navicat中的密碼掩碼(這里可以基本斷定Navicat對密碼是采用了對稱加密算法),于是發(fā)現(xiàn)了這個(gè)倉庫:

密碼的解密算法顯然是被泄露了,那么就可以利用起來。加之筆者之前花了一點(diǎn)點(diǎn)時(shí)間入門了一下Go,于是業(yè)余花了點(diǎn)時(shí)間編寫了一個(gè)GUI工具。這個(gè)工具主要功能是:在Windows系統(tǒng)下,自動讀取Navicat在注冊列表中寫入的所有(數(shù)據(jù)庫)服務(wù)器連接數(shù)據(jù)作為列表展示,對于每個(gè)服務(wù)器連接數(shù)據(jù)的密碼嘗試進(jìn)行解密。效果如下:

大致原理

參考how-does-navicat-encrypt-password倉庫,因?yàn)?code>Navicat兩種版本的對稱加密算法的具體算法、秘鑰和加密向量都被泄露了,得知:

  • 版本一(Low):使用Blowfish/ECB/NoPadding模式
  • 版本二(High):使用AES/CBC/PKCS5Padding模式

其中AES/CBC/PKCS5Padding實(shí)現(xiàn)是比較簡單的,Blowfish/ECB/NoPaddingGo的原生類庫中剛好缺少了ECB解碼器,只能仔細(xì)翻閱how-does-navicat-encrypt-passwordJava版本代碼

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系統(tǒng)注冊列表下的服務(wù)器連接數(shù)據(jù)列表,Navicat多個(gè)版本測試發(fā)現(xiàn)服務(wù)器連接數(shù)保存在注冊列表的Software\PremiumSoft\Navicat\Servers目錄下,只需要全量讀取出來并且按照每個(gè)服務(wù)器連接數(shù)據(jù)的明細(xì)k-v一步一步解析即可。這個(gè)解析過程的偽代碼如下:

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)
    // 數(shù)據(jù)庫的版本
    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{...})
}

小結(jié)

提醒 - 這個(gè)項(xiàng)目僅僅是提供參考和學(xué)習(xí),供個(gè)人本地開發(fā)時(shí)候使用,切勿用于竊取他人的數(shù)據(jù)庫密碼。項(xiàng)目倉庫:

順帶一提使用fyneGUI開發(fā)效果還可以,不過目前這個(gè)庫還存在比較多BUG,性能高的同時(shí)占用的資源也比較高。

以上就是基于Go編寫一個(gè)可視化Navicat本地密碼解析器的詳細(xì)內(nèi)容,更多關(guān)于Go編寫Navicat密碼解析器的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Go語言基礎(chǔ)變量的聲明及初始化示例詳解

    Go語言基礎(chǔ)變量的聲明及初始化示例詳解

    這篇文章主要為大家介紹了Go語言基礎(chǔ)變量的聲明及初始化示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助祝大家多多進(jìn)步,早日升職加薪
    2021-11-11
  • golang使用信號量熱更新的實(shí)現(xiàn)示例

    golang使用信號量熱更新的實(shí)現(xiàn)示例

    這篇文章主要介紹了golang使用信號量熱更新的實(shí)現(xiàn)示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-04-04
  • Golang HTML 模板使用指南示例詳解

    Golang HTML 模板使用指南示例詳解

    本文詳細(xì)介紹了Golang HTML模板的使用方法,包括基礎(chǔ)模板、高級模板、完整應(yīng)用示例、CSS樣式、JavaScript交互等,文章強(qiáng)調(diào)了模板組織、代碼復(fù)用、語義化HTML、響應(yīng)式設(shè)計(jì)、性能優(yōu)化等最佳實(shí)踐,感興趣的朋友跟隨小編一起看看吧
    2025-01-01
  • go語言匿名函數(shù)的使用

    go語言匿名函數(shù)的使用

    今天小編就為大家分享一篇關(guān)于go語言匿名函數(shù)的使用,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2019-04-04
  • Golang 經(jīng)典校驗(yàn)庫 validator 用法解析

    Golang 經(jīng)典校驗(yàn)庫 validator 用法解析

    這篇文章主要為大家介紹了Golang 經(jīng)典校驗(yàn)庫 validator 用法解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • 一文讓你理解go語言的Context

    一文讓你理解go語言的Context

    在Go語言中,Context(上下文)是一個(gè)類型,用于在程序中傳遞請求范圍的值、截止時(shí)間、取消信號和其他與請求相關(guān)的上下文信息,它在多個(gè)goroutine之間傳遞這些值,使得并發(fā)編程更加可靠和簡單,本文詳細(xì)介紹go語言的Context,需要的朋友可以參考下
    2023-05-05
  • Go整合captcha實(shí)現(xiàn)驗(yàn)證碼功能

    Go整合captcha實(shí)現(xiàn)驗(yàn)證碼功能

    最近在使用Go語言搞一個(gè)用戶登錄&注冊的功能,我們油然會產(chǎn)生一種增加驗(yàn)證碼的想法。后來在GitHub上找到了這個(gè)名叫captcha的插件,于是就利用文檔進(jìn)行了初步的學(xué)習(xí),并融入到自己的項(xiàng)目中,整個(gè)過程下來感覺這個(gè)插件的設(shè)計(jì)非常巧妙
    2023-03-03
  • 深入了解GoLang中的工廠設(shè)計(jì)模式

    深入了解GoLang中的工廠設(shè)計(jì)模式

    這篇文章主要介紹了深入了解GoLang中的工廠設(shè)計(jì)模式,工廠模式是一種常用的設(shè)計(jì)模式,它屬于創(chuàng)建型模式,它的主要目的是封裝對象的創(chuàng)建過程,將對象的創(chuàng)建過程與對象的使用過程分離,從而提高代碼的可維護(hù)性和可擴(kuò)展性,需要詳細(xì)了解可以參考下文
    2023-05-05
  • 利用systemd部署golang項(xiàng)目的實(shí)現(xiàn)方法

    利用systemd部署golang項(xiàng)目的實(shí)現(xiàn)方法

    這篇文章主要介紹了利用systemd部署golang項(xiàng)目的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11
  • Golang中g(shù)oroutine和channel使用介紹深入分析

    Golang中g(shù)oroutine和channel使用介紹深入分析

    一次只做一件事情并不是完成任務(wù)最快的方法,一些大的任務(wù)可以拆解成若干個(gè)小任務(wù),goroutine可以讓程序同時(shí)處理幾個(gè)不同的任務(wù),goroutine使用channel來協(xié)調(diào)它們的工作,channel允許goroutine互相發(fā)送數(shù)據(jù)并同步,這樣一個(gè)goroutine就不會領(lǐng)先于另一個(gè)goroutine
    2023-01-01

最新評論