如何解决配置文件中的数据库连接串加密了问题

技术如何解决配置文件中的数据库连接串加密了问题这篇文章主要介绍“如何解决配置文件中的数据库连接串加密了问题”,在日常操作中,相信很多人在如何解决配置文件中的数据库连接串加密了问题问题上存在疑惑,小编查阅了各式资料,整理出

本文主要介绍“如何解决配置文件中的数据库连接字符串加密问题”。在日常操作中,相信很多人对于如何解决配置文件中数据库连接字符串加密的问题都有疑问。边肖查阅了各种资料,整理出简单易用的操作方法,希望能帮助大家解答“如何解决配置文件中数据库连接字符串加密的问题”的疑惑。接下来,请和边肖一起学习!

一:背景

1. 讲故事

几天前,在调试IOT机柜终端的一个bug时,发现app.config中的数据库连接字符串被加密了。因为调试的时候要切换数据库,所以需要把密文放在一个特殊的小工具上解密,在连接字符串上更改数据库名称后,还要加密粘贴到app.config中,非常烦人。内容如下:

修正bug后,我觉得这个东西可以防止。谁啊。我想,如果我私下遇到这样的麻烦,我也会防备绅士。对于我这样的人来说,加不加密等于不加密,所以我就把你从图书馆带走。

二:使用 ILSpy 去脱库

1. 从DAL/Repository层去反编译代码

要获得清晰的数据库连接字符串,可以从代码中反转它,例如,从DAL或Repository中找到连接字符串字段ConnectionString。我的终端程序是用wpf写的,采用了经典的三层架构,所以在bin下很容易找到,如下图:

如何解决配置文件中的数据库连接串加密了问题

然后用ILSPy反编译dll。

如何解决配置文件中的数据库连接串加密了问题

从上图可以看出,连接字符串的明文存储在: oledb helper . connectionstring中,然后可以看出程序中定义了一个Decrypt方法,专门用于解密连接字符串。哈哈,有了这个算法,可以从库中移除吗?以下代码显示:

class program { static void main(string[]args){ varstr=' xfes 27 am6 muw 48 IB 1 glmvqvubq 7/pp9n 4 xbzjsd u19 ydr/zdb 3m 7 kt6 had 7 F9 hlj/zeviizbmsu4o 5l 9g 03 y5 iub 6 klczi 7s 3 ndlwtic bxlf 5 quu/r8 zai rgnnzdwodfqulqy5 cf2x 8/MFDOcMNaZYMpTYeHsZoEERU/tp9t 3 n5 qljljlj控制台。写线(解密(字符串));} publicationstatistringdecrypt(string str){ if(!字符串。IsNullOrEmpty(str)){ desryposerviceprovider

 descsp = new DESCryptoServiceProvider();                 byte[] key = Encoding.Unicode.GetBytes("Oyea");                 byte[] data = Convert.FromBase64String(str);                 MemoryStream MStream = new MemoryStream();                 CryptoStream CStream = new CryptoStream(MStream, descsp.CreateDecryptor(key, key), CryptoStreamMode.Write);                 CStream.Write(data, 0, data.Length);                 CStream.FlushFinalBlock();                 return Encoding.Unicode.GetString(MStream.ToArray());             }             return "";         }     }

如何解决配置文件中的数据库连接串加密了问题

不过还好,数据库也是在客户那边独立部署的,不存在走外网的情况,不然就玩大了。。。接下来我们来看看如何去防范。

2. 加壳/混淆/加密狗

现在市面上商业版和免费版都提供了给C#代码进行加密和混淆,不过我没用过,我想最多在反编译代码后阅读性上增加了一些障碍,这也不过是时间问题罢了,毕竟SqlConnection,SqlCommand  这些FCL的类你是没法混淆的,我从这些类上反推可以很轻松的就能找到明文的 ConnectionString ,所以这条路我觉得是走不通的。

3. 将解密算法放在 server 端

既然 解密算法 埋在客户端你都能挖出来,那把它放在 server 端不就可以啦?在程序启动的时候,调用一下 webapi 进行解密,这样你总没辙了吧  ???哈哈,大家可以开动脑子想一想,这种方法可行不可行?诚然,解密算法搬走了,再用 ILSpy  去挖已经没有任何意义了,但这里有一个重要突破点,不管是用什么形式解密的,最后的连接串明文都是存放在 OleDbHelper.ConnectionString  这个静态变量中,对吧!接下来的问题就是有没有办法把进程中的这个静态变量给挖出来?你说的对,就是抓程序的 dump文件 用 windbg 去挖。

三:使用 windbg 去脱库

1. 思路

要想挖出 OleDbHelper.ConnectionString,其实也很简单,在 CLR via C#  第四章中关于对象类型和类型对象的解读有这么一张图,很经典。

如何解决配置文件中的数据库连接串加密了问题

从上图中可以看到,静态字段是在 Manager 类型对象 中,实例字段都是在 Manager 对象 中,对照这张图,我只需要通过 windbg 找到  OleDbHelper 类型对象,也就是所谓的 EEClass。

2. windbg 挖矿实战

使用 !name2ee 找到 Decrypt 方法描述符(MethodDesc)

0:000>  !name2ee xxx.Utilities.dll xxx.Utilities.Database.OleDbHelper.Decrypt Module:      08ed7cdc Assembly:    xxx.Utilities.dll Token:       060002aa MethodDesc:  08ed83b0 Name:        xxx.Utilities.Database.OleDbHelper.Decrypt(System.String) JITTED Code Address: 048b6af0

上面的 MethodDesc: 08ed83b0 就是方法描述符的地址。

使用 !dumpmd 导出方法描述符的详细信息,找到 OleDbHelper类型对象 的 EEClass 地址

0:000> !dumpmd 08ed83b0 Method Name:  xxx.Utilities.Database.OleDbHelper.Decrypt(System.String) Class:        08ecab30 MethodTable:  08ed8468 mdToken:      060002aa Module:       08ed7cdc IsJitted:     yes CodeAddr:     048b6af0 Transparency: Critical

上面的 Class: 08ecab30 就是 OleDbHelper类型对象 在堆上的内存地址。

使用 !dumpclass 导出 Class: 08ecab30 ,从而找到 OleDbHelper类的静态字段

0:000> !dumpclass 08ecab30 Class Name:      xxx.Utilities.Database.OleDbHelper mdToken:         02000033 File:            D:\code\A18001\Source\Main\TunnelClient\bin\Debug\xxx.Utilities.dll Parent Class:    795115b0 Module:          08ed7cdc Method Table:    08ed8468 Vtable Slots:    4 Total Method Slots:  6 Class Attributes:    100081  Abstract, Transparency:        Critical NumInstanceFields:   0 NumStaticFields:     2       MT    Field   Offset                 Type VT     Attr    Value Name 799bfd60  4000152       74        System.String  0   static 04c28270 ConnectionString 799bfd60  4000153       78        System.String  0   static 04c299e8 SecurityConnectionString

从上面导出信息中可以看到 OleDbHelper类中 有两个静态字段: ConnectionString 和  SecurityConnectionString。

使用 !do 打印出两个静态字段

如何解决配置文件中的数据库连接串加密了问题

看到没有,上图中的两个紫色框框就是明文的 ConnectionString 哈,怎么样??不?。

到此,关于“如何解决配置文件中的数据库连接串加密了问题”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!

内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/42848.html

(0)

相关推荐

  • sin105度等于多少,sin105度等于多少

    技术sin105度等于多少,sin105度等于多少sin105度等于√2/4+√6/4sin105度等于多少。计算过程如下:根据三角函数两角和公式sin105°=sin(60°+45°) =sin60°*cos45°+s

    生活 2021年10月30日
  • 如何用Python爬取全网baisi趣图

    技术如何用Python爬取全网baisi趣图今天就跟大家聊聊有关如何用Python爬取全网baisi趣图,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。前言bais

    攻略 2021年10月25日
  • 三戒是哪三戒,柳宗元的\”三戒\”是什么?

    技术三戒是哪三戒,柳宗元的\三戒\是什么?柳宗元的《三戒》包括《临江之麋》三戒是哪三戒、《永某氏之鼠》和 《黔之驴》 这一组三篇寓言,是作者贬谪永州时所写。题名“三戒”,可能是取《论语》“君子有三戒”之意。文前的小序,已

    生活 2021年10月22日
  • 水尤清冽,小石潭记原文一句一句翻译

    技术水尤清冽,小石潭记原文一句一句翻译《小石潭记》一、全文翻译水尤清冽。
    原文:从小丘西行百二十步,隔篁竹闻水声,如鸣佩环,心乐之。
    译文:从小丘向西行走一百二十步,隔着竹林,听见水声,好象挂在身上的玉佩、玉环相互碰撞发

    生活 2021年10月22日
  • Sqlserver 2014 alwayson架构如何添加辅助节点上的数据库

    技术Sqlserver 2014 alwayson架构如何添加辅助节点上的数据库本篇文章给大家分享的是有关Sqlserver 2014 alwayson 架构如何添加辅助节点上的数据库,小编觉得挺实用的,因此分享给大家学

    攻略 2021年11月29日
  • mysql从共享表空间修改为单个表的表空间存储方式是什么

    技术mysql从共享表空间修改为单个表的表空间存储方式是什么本篇文章为大家展示了mysql从共享表空间修改为单个表的表空间存储方式是什么,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收

    攻略 2021年11月16日