如何查看Navicat加密的数据库密码

2023-05-15 0 360

目录查看Navicat加密的数据库密码1、打开运行窗口,输入regedit,点击确认按钮,打开注册表编辑器2、在注册表中找到Navicat加密后的密码3、打开PHP在线运行工具,粘贴解密代码4. 修改倒数第三行NavicatPassword的版本值5、更改倒数第二行decrypt()方法中的字符串为Navicat加密后的密码6、点击执行,右侧得到解密后的密码附录:navicat找出加密的密码Navicat导出(推荐)解密密文

查看Navicat加密的数据库密码

背景:本机装的MySQL数据库密码忘记了,打开了Navicat连接过数据库,不过密码是加密的,既然能加密那就能解密,哈哈哈哈。

解密后发现密码居然是password,好尴尬

1、打开运行窗口,输入regedit,点击确认按钮,打开注册表编辑器

如何查看Navicat加密的数据库密码

2、在注册表中找到Navicat加密后的密码展开【HKEY_CURRENT_USER】展开【Software】展开【PremiumSoft】展开【NavicatPG】展开【Servers】选择 【MySQL】右侧找到 pwd,双击并复制数值数据

如何查看Navicat加密的数据库密码

如何查看Navicat加密的数据库密码

如何查看Navicat加密的数据库密码

如何查看Navicat加密的数据库密码

3、打开PHP在线运行工具,粘贴解密代码工具地址:https://tool.lu/coderunner复制解密代码到工具中<?phpclass NavicatPassword{ protected $version = 0; protected $aesKey = \’libcckeylibcckey\’; protected $aesIv = \’libcciv libcciv \’; protected $blowString = \’3DC5CA39\’; protected $blowKey = null; protected $blowIv = null; public function __construct($version = 12) { $this->version = $version; $this->blowKey = sha1(\’3DC5CA39\’, true); $this->blowIv = hex2bin(\’d9c7c3c8870d64bd\’); } public function encrypt($string) { $result = FALSE; switch ($this->version) { case 11: $result = $this->encryptEleven($string); break; case 12: $result = $this->encryptTwelve($string); break; default: break; } return $result; } protected function encryptEleven($string) { $round = intval(floor(strlen($string) / 8)); $leftLength = strlen($string) % 8; $result = \’\’; $currentVector = $this->blowIv; for ($i = 0; $i < $round; $i++) { $temp = $this->encryptBlock($this->xorBytes(substr($string, 8 * $i, 8), $currentVector)); $currentVector = $this->xorBytes($currentVector, $temp); $result .= $temp; } if ($leftLength) { $currentVector = $this->encryptBlock($currentVector); $result .= $this->xorBytes(substr($string, 8 * $i, $leftLength), $currentVector); } return strtoupper(bin2hex($result)); } protected function encryptBlock($block) { return openssl_encrypt($block, \’BF-ECB\’, $this->blowKey, OPENSSL_RAW_DATA|OPENSSL_NO_PADDING); } protected function decryptBlock($block) { return openssl_decrypt($block, \’BF-ECB\’, $this->blowKey, OPENSSL_RAW_DATA|OPENSSL_NO_PADDING); } protected function xorBytes($str1, $str2) { $result = \’\’; for ($i = 0; $i < strlen($str1); $i++) { $result .= chr(ord($str1[$i]) ^ ord($str2[$i])); } return $result; } protected function encryptTwelve($string) { $result = openssl_encrypt($string, \’AES-128-CBC\’, $this->aesKey, OPENSSL_RAW_DATA, $this->aesIv); return strtoupper(bin2hex($result)); } public function decrypt($string) { $result = FALSE; switch ($this->version) { case 11: $result = $this->decryptEleven($string); break; case 12: $result = $this->decryptTwelve($string); break; default: break; } return $result; } protected function decryptEleven($upperString) { $string = hex2bin(strtolower($upperString)); $round = intval(floor(strlen($string) / 8)); $leftLength = strlen($string) % 8; $result = \’\’; $currentVector = $this->blowIv; for ($i = 0; $i < $round; $i++) { $encryptedBlock = substr($string, 8 * $i, 8); $temp = $this->xorBytes($this->decryptBlock($encryptedBlock), $currentVector); $currentVector = $this->xorBytes($currentVector, $encryptedBlock); $result .= $temp; } if ($leftLength) { $currentVector = $this->encryptBlock($currentVector); $result .= $this->xorBytes(substr($string, 8 * $i, $leftLength), $currentVector); } return $result; } protected function decryptTwelve($upperString) { $string = hex2bin(strtolower($upperString)); return openssl_decrypt($string, \’AES-128-CBC\’, $this->aesKey, OPENSSL_RAW_DATA, $this->aesIv); }};//需要指定版本两种,11或12//$navicatPassword = new NavicatPassword(11);$navicatPassword = new NavicatPassword(12); //解密//$decode = $navicatPassword->decrypt(\’15057D7BA390\’);$decode = $navicatPassword->decrypt(\’E75BF077AB8BAA3AC2D5\’); // 替换成上一步的数据数值echo $decode.\”\\n\”;?>

4. 修改倒数第三行NavicatPassword的版本值

5、更改倒数第二行decrypt()方法中的字符串为Navicat加密后的密码

6、点击执行,右侧得到解密后的密码

如何查看Navicat加密的数据库密码

附录:navicat找出加密的密码Navicat(11.2.7、12.1.15、15.1.17、16.0.6上述版本均已通过测试)进入注册表进行查询

使用【Win】+ 【R】组合快捷键,快速打开运行命令框,在打开后面键入命令:【Regedit】打开注册表编辑器

文件路径:

计算机\\HKEY_CURRENT_USER\\SOFTWARE\\PremiumSoft\\Navicat\\Servers\\

以Navicat16为例,通过上方路径,找到注册表中存储密码值的位置(如下图),选中要查看密码的连接名称,双击Pwd项,复制对应的值,至此获得了密文

如何查看Navicat加密的数据库密码

Navicat导出(推荐)

以Navicat16为例,菜单栏上点击文件,选择导出连接…,一定要选中导出密码!!!导出格式为*.ncx(该ncx本质上是xml文件,文件中包含连接的全部信息)

注:Navicat11版本没有勾选导出密码选项,直接导出即可;Navicat12+版本要勾选【导出密码】选项!

如何查看Navicat加密的数据库密码

如何查看Navicat加密的数据库密码

解密密文

Go

https://www.nhooo.com/tool/java8/

运行代码

Go

import javax.crypto.Cipher;import javax.crypto.spec.IvParameterSpec;import javax.crypto.spec.SecretKeySpec;import javax.xml.bind.DatatypeConverter;import java.nio.charset.StandardCharsets;import java.security.MessageDigest;import java.util.Arrays;public class Main { public static void main(String []args) {//navicat11解密 Navicat11Cipher de = new Navicat11Cipher(); System.out.println(de.decryptString(\”密文放此处\”));//navicat12+解密 Navicat12Cipher de12 = new Navicat12Cipher(); System.out.println(de12.decryptString(\”密文放此处\”)); } static class Navicat11Cipher { public static final String DefaultUserKey = \”3DC5CA39\”; private static byte[] _IV; private static SecretKeySpec _Key; private static Cipher _Encryptor; private static Cipher _Decryptor; private static void initKey(String UserKey) { try { MessageDigest sha1 = MessageDigest.getInstance(\”SHA1\”);byte[] userkey_data = UserKey.getBytes(StandardCharsets.UTF_8); sha1.update(userkey_data, 0, userkey_data.length); _Key = new SecretKeySpec(sha1.digest(), \”Blowfish\”); } catch (Exception e) { e.printStackTrace(); } } private static void initChiperEncrypt() { try {// Must use NoPadding _Encryptor = Cipher.getInstance(\”Blowfish/ECB/NoPadding\”); _Encryptor.init(Cipher.ENCRYPT_MODE, _Key); } catch (Exception e) { e.printStackTrace(); } } private static void initChiperDecrypt() { try {// Must use NoPadding _Decryptor = Cipher.getInstance(\”Blowfish/ECB/NoPadding\”); _Decryptor.init(Cipher.DECRYPT_MODE, _Key); } catch (Exception e) { e.printStackTrace(); } } private static void initIV() { try {byte[] initVec = DatatypeConverter.parseHexBinary(\”FFFFFFFFFFFFFFFF\”); _IV = _Encryptor.doFinal(initVec); } catch (Exception e) { e.printStackTrace(); } } private void xorBytes(byte[] a, byte[] b) {for (int i = 0; i < a.length; i++) {int aVal = a[i] & 0xff; // convert byte to integerint bVal = b[i] & 0xff; a[i] = (byte) (aVal ^ bVal); // xor aVal and bVal and typecast to byte } } private void xorBytes(byte[] a, byte[] b, int l) {for (int i = 0; i < l; i++) {int aVal = a[i] & 0xff; // convert byte to integerint bVal = b[i] & 0xff; a[i] = (byte) (aVal ^ bVal); // xor aVal and bVal and typecast to byte } } static { initKey(DefaultUserKey); initChiperEncrypt(); initChiperDecrypt(); initIV(); } private byte[] Encrypt(byte[] inData) { try {byte[] CV = Arrays.copyOf(_IV, _IV.length);byte[] ret = newbyte[inData.length];int blocks_len = inData.length / 8;int left_len = inData.length % 8;for (int i = 0; i < blocks_len; i++) {byte[] temp = Arrays.copyOfRange(inData, i * 8, (i * 8) + 8); xorBytes(temp, CV); temp = _Encryptor.doFinal(temp); xorBytes(CV, temp); System.arraycopy(temp, 0, ret, i * 8, 8); }if (left_len != 0) { CV = _Encryptor.doFinal(CV);byte[] temp = Arrays.copyOfRange(inData, blocks_len * 8, (blocks_len * 8) + left_len); xorBytes(temp, CV, left_len); System.arraycopy(temp, 0, ret, blocks_len * 8, temp.length); }return ret; } catch (Exception e) { e.printStackTrace();return null; } } public String encryptString(String inputString) { try {byte[] inData = inputString.getBytes(StandardCharsets.UTF_8);byte[] outData = Encrypt(inData);return DatatypeConverter.printHexBinary(outData); } catch (Exception e) { e.printStackTrace();return\”\”; } } private byte[] Decrypt(byte[] inData) { try {byte[] CV = Arrays.copyOf(_IV, _IV.length);byte[] ret = newbyte[inData.length];int blocks_len = inData.length / 8;int left_len = inData.length % 8;for (int i = 0; i < blocks_len; i++) {byte[] temp = Arrays.copyOfRange(inData, i * 8, (i * 8) + 8); temp = _Decryptor.doFinal(temp); xorBytes(temp, CV); System.arraycopy(temp, 0, ret, i * 8, 8);for (int j = 0; j < CV.length; j++) { CV[j] = (byte) (CV[j] ^ inData[i * 8 + j]); } }if (left_len != 0) { CV = _Encryptor.doFinal(CV);byte[] temp = Arrays.copyOfRange(inData, blocks_len * 8, (blocks_len * 8) + left_len); xorBytes(temp, CV, left_len);for (int j = 0; j < temp.length; j++) { ret[blocks_len * 8 + j] = temp[j]; } }return ret; } catch (Exception e) { e.printStackTrace();return null; } } public String decryptString(String hexString) { try {byte[] inData = DatatypeConverter.parseHexBinary(hexString);byte[] outData = Decrypt(inData);returnnew String(outData, StandardCharsets.UTF_8); } catch (Exception e) { e.printStackTrace();return\”\”; } } } static class Navicat12Cipher { private static SecretKeySpec _AesKey; private static IvParameterSpec _AesIV; static { _AesKey = new SecretKeySpec(\”libcckeylibcckey\”.getBytes(StandardCharsets.UTF_8), \”AES\”); _AesIV = new IvParameterSpec(\”libcciv libcciv \”.getBytes(StandardCharsets.UTF_8)); } public String encryptString(String plaintext) { try { Cipher cipher = Cipher.getInstance(\”AES/CBC/PKCS5Padding\”); cipher.init(Cipher.ENCRYPT_MODE, _AesKey, _AesIV);byte[] ret = cipher.doFinal(plaintext.getBytes(StandardCharsets.UTF_8));return DatatypeConverter.printHexBinary(ret); } catch (Exception e) { e.printStackTrace();return\”\”; } } public String decryptString(String ciphertext) { try { Cipher cipher = Cipher.getInstance(\”AES/CBC/PKCS5Padding\”); cipher.init(Cipher.DECRYPT_MODE, _AesKey, _AesIV);byte[] ret = cipher.doFinal(DatatypeConverter.parseHexBinary(ciphertext));returnnew String(ret, StandardCharsets.UTF_8); } catch (Exception e) { e.printStackTrace();return\”\”; } } }}

到此这篇关于如何查看Navicat加密的数据库密码的文章就介绍到这了,更多相关Navicat查看数据库密码内容请搜索悠久资源以前的文章或继续浏览下面的相关文章希望大家以后多多支持悠久资源!

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

悠久资源 数据库其它 如何查看Navicat加密的数据库密码 https://www.u-9.cn/sql/sqlqt/21633.html

常见问题

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务

  • 0 +

    访问总数

  • 0 +

    会员总数

  • 0 +

    文章总数

  • 0 +

    今日发布

  • 0 +

    本周发布

  • 0 +

    运行天数

注册会员,众多资源免费下载