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

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

查看Navicat加密的数据库密码

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

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

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

2、在注册表中找到Navicat加密后的密码

  • 展开【HKEY_CURRENT_USER】
  • 展开【Software】
  • 展开【PremiumSoft】
  • 展开【NavicatPG】
  • 展开【Servers】
  • 选择 【MySQL】
  • 右侧找到 pwd,双击并复制数值数据

3、打开PHP在线运行工具,粘贴解密代码

<?php
class 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(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导出(推荐)

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

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

解密密文

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)

相关推荐

  • Navicat连接MySQL提示1045错误解决(重置MySQL密码)

    错误提示:1045-Access denied for user 'root' 'localhost'(using password: YES) navicat连接MySQL数据时遇到1045错误,一般是因为输入的用户名或者密码错误被拒绝访问,此时可以重置MySQL数据库的密码解决. 在windows的操作步骤如下: 1.找到mysql的my.ini文件,在mysqld关键字下面添加skip-grant-tables,如下图所示: 该命令作用是跳过授权表,也就是输入任意字符账号密码都可以进入my

  • Windows7下安装使用MySQL8.0.16修改密码、连接Navicat问题

    在安装MySQL时遇到几个问题,网上查找的答案大同小异,并没有很好的解决我的问题,完成之余记录下来方便以后查看. 1.官网下载8.0.16版本MySQL 2.解压缩并将解压的文件放在C:\Program Files\MySQL下 3.配置环境变量,将C:\Program Files\MySQL\bin 添加到系统变量path中 4.添加配置文件,在MySQL根目录下创建my.ini 文件内容如下,修改'basedir='.'datadir='地址 [mysqld] # 设置3306端口 port

  • Navicat修改MySQL数据库密码的多种方法

    方法1: 用SET PASSWORD命令 首先登录MySQL. 格式:mysql> set password for 用户名@localhost = password('新密码'); 例子:mysql> set password for root@localhost = password('123'); 方法2:用mysqladmin 格式:mysqladmin -u用户名 -p旧密码 password 新密码 例子:mysqladmin -uroot -p123456 password 12

  • 安装mysql8.0.11及修改root密码、连接navicat for mysql的思路详解

    1.1. 下载: 官网下载zip包,我下载的是64位的: 下载地址:https://dev.mysql.com/downloads/mysql/ 下载zip的包: 下载后解压:(解压在哪个盘都可以的) 我放在了这里 E:\web\mysql-8.0.11-winx64 ,顺便缩短了文件名,所以为 E:\web\mysql-8.0.11. 1.3. 生成data文件: 以管理员身份运行cmd 程序--输入cmd 找到cmd.exe 右键以管理员身份运行 进入E:\web\mysql-8.0.11\

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

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

  • SpringBoot中使用com.alibaba.druid.filter.config.ConfigTools对数据库密码加密的方法

    SpringBoot中使用com.alibaba.druid.filter.config.ConfigTools对数据库密码加密 1.在本地Maven仓库中打开Powershell2.输入命令,然后点击回车3.将生成公钥和加密的数据库密码配置到SpringBoot项目中的yml配置文件中druid的pom版本 1.在本地Maven仓库中打开Powershell 2.输入命令,然后点击回车 scotttiger为未加密的数据库密码 privateKey为生成的私钥 publicKey为生成的公钥

  • SrpingDruid数据源加密数据库密码的示例代码

    前言 在工作中遇到这样一个问题:开发过程中将数据库的账号.密码等信息配置在了一个单独的properties配置文件中(使用明文).但运维人员要求在配置文件中的密码一律不得出现明文. 环境 Spring 4.2.6.RELEASE MyBatis 3.4.1 Druid 1.0.14 改造思路 一般spring容器启动时,通过PropertyPlaceholderConfigurer类读取jdbc.properties文件里的数据库配置信息.通过这个原理,我们把加密后的数据库配置信息放到jdbc.

  • springboot 整合druid数据库密码加密功能的实现代码

    在之前给大家介绍过Springboot Druid 自定义加密数据库密码的几种方案,感兴趣的朋友可以点击查看下,今天通过本文给大家介绍springboot 整合druid数据库密码加密功能,具体内容如下所示: 1.依赖引入 <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.1

  • SpringBoot配置文件中数据库密码加密两种方案(推荐)

    SpringBoot项目经常将连接数据库的密码明文放在配置文件里,安全性就比较低一些,尤其在一些企业对安全性要求很高,因此我们就考虑如何对密码进行加密. 介绍两种加密方式:jasypt 可加密配置文件中所有属性值; druid 自带了加解密,可对数据库密码进行加密. jasypt 加解密 jasypt 是一个简单易用的加解密Java库,可以快速集成到 Spring 项目中.可以快速集成到 Spring Boot 项目中,并提供了自动配置,使用非常简单. 步骤如下: 1)引入maven依赖 <de

  • jasypt 集成SpringBoot 数据库密码加密操作

    昨天看到一片文章,说是某某旗下酒店数据库因为程序员不小心,把数据库明文密码上传到了GitHub上,导致酒店数据注册资料.入住信息,开房记录被下载倒卖的消息. 作为程序员,开发的时候为了简单,账户明明都设置很简单,基本上数据库密码都是明文的,没做什么操作,至少我待过的公司都是这样,无论是测试环境还是线上环境,想想,这个也是一大安全隐患,在此,趁现在不忙,做些基于springboot的数据库密码加密. 1.pom.xml添加jar包(不同jdk选择不同的版本): <!-- jdk8 版本 整合jas

  • Springboot Druid 自定义加密数据库密码的几种方案

    前言 开发过程中,配置的数据库密码通常是明文形式,这样首先第一个安全性不好(相对来说),不符合一个开发规范(如项目中不能出现明文账号密码),其实就是当出现特殊需求时,比如要对非运维人员开方服务器部分权限,但是又涉及项目部署的目录时,容易泄漏数据库密码,虽然一般生产环境中,数据库往往放入内网,访问只能通过内网访问,但是不管怎么说账号密码直接让人知道总归不好,甚至有些项目需要部署到客户环境中,但是可能共用一个公共数据库(数据库只向指定服务器开放外网端口或组建内网环境),这样的情况下,如果数据库密码再

  • springboot对数据库密码加密的实现

    我是黑帽子K,话不多说直接上加密.如有不对,欢迎指正. 开发的同学们都知道,例如项目依赖的信息,数据库信息一般是保存在配置文件中,而且都是明文,因此需要进行加密处理,今天在这里介绍下jasypt集成springboot加密的配置. 首先,这些都是建立在你的springboot项目是能正常运行的前提下. 第一步:pom文件加入依赖,如图: 这里提供一个版本, <dependency> <groupId>com.github.ulisesbocchio</groupId>

  • SpringBoot配置数据库密码加密的实现

    你在使用 MyBatis 的过程中,是否有想过多个数据源应该如何配置,如何去实现?出于这个好奇心,我在 Druid Wiki 的数据库多数据源中知晓 Spring 提供了对多数据源的支持,基于 Spring 提供的 AbstractRoutingDataSource,可以自己实现数据源的切换. 一.配置动态数据源 下面就如何配置动态数据源提供一个简单的实现: org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource,

随机推荐