• 正则表达式匹配并替换字符串


    场景:

    2012年在做广州地铁协同办公项目时,客户觉得明文的数据库链接用户密码配置在web.config里面不安全;其实.NET里的web.config在IIS中有所限制,对安全性还是有保障的。但是客户既然有这样稍微“变态”的需求,那我们就考虑怎么去把它实现吧。

    存在的技术难点:

    (1)web.config中配置的数据库链接用户密码必须是经过特殊加密的

    (2)从第一点出发,既然要加密,那是选择MD5之类的不可逆加密,还是选择AES256之类的可逆加密呢?由于在数据访问层中连接数据库进行数据交互必须是有效的明文用户和其密码,所以我们选择AES256之类的可逆加密,加密解密算法可以进一步自定义,这里就不讲解如何实现,相信online search下就很多相关文章了

    好了,话不多说,代码实践见真理:

    例如加密前为:eip_hr_user123,加密后为:3OHOG6W9NgpJTriw4x6JDg==
    dataconfiguration.config配置文件内容:
     1 <configuration>
     2     <configSections>
     3         <section name="dataConfiguration" type="Microsoft.Practices.EnterpriseLibrary.Data.Configuration.DatabaseSettings, Microsoft.Practices.EnterpriseLibrary.Data, Version=3.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
     4     </configSections>
     5     <dataConfiguration defaultDatabase="ORADBConnection" />
     6     <connectionStrings>
     7         <add name="ORADBConnection" connectionString="Persist Security Info=True;User ID=eip_hr_user;Password=3OHOG6W9NgpJTriw4x6JDg==;Data Source=prd"
     8       providerName="System.Data.OracleClient" />
     9     </connectionStrings>
    10 </configuration>

    .NET中使用正则表达式匹配并替换字符串,其实在JavaScript中也可以用这样的正则表达式,只是写法大同小异而已:

     1 internal Database oraDB
     2 {
     3     get
     4     {
     5         if (_oradb != null) return _oradb;
     6         FileConfigurationSource dataSource = new FileConfigurationSource("dataconfiguration.config");
     7         ConnectionStringsSection csSection = (ConnectionStringsSection)dataSource.GetSection("connectionStrings");
     8         ConnectionStringSettings csSettings = csSection.ConnectionStrings["ORADBConnection"];
     9         if (csSettings != null)
    10         {
    11             string connectionStr = csSettings.ConnectionString;
    12             //author: Kenmu
    13             //created time: 2012-09-24
    14             //function: 针对密码进行加密的情况,必须解密 begin
    15             string pwd;
    16             Regex r = new Regex("Password=(?<Pwd>[^;]+)", RegexOptions.IgnoreCase);//?<Pwd>为标示符,不参与匹配的;+?表示非贪婪匹配
    17             Match m = r.Match(connectionStr);
    18             if (m.Success)
    19             {
    20                 pwd = m.Groups["Pwd"].Value; //获取到密文
    21                 try
    22                 {
    23                     connectionStr = connectionStr.Replace(string.Format("={0}", pwd), string.Format("={0}", Cryptogram.DecryptPassword(pwd))); //对密文进行解密操作,Cryptogram.DecryptPassword为自定义的可逆解密方法
    24                 }
    25                 catch
    26                 {
    27                 }
    28             }
    29             //function: 针对密码进行加密的情况,必须解密 end
    30             _oradb = new OracleDatabase(connectionStr);
    31         }
    32         return _oradb;
    33     }
    34 }
  • 相关阅读:
    线程的基础知识
    并行编程与PLINQ
    swing组件中数据更新与UI更新的关系
    关于EDT和SwingUtilities的invokeLater和invokeAndWait
    内容页访问母版页页控件的方法
    asp.net 中一般应用处理程序使用session
    正则表达式学习日记
    C#中马赛克算法
    初学C与C在TC2.0上运行的注意事项
    delphi7中两个BT的Bug
  • 原文地址:https://www.cnblogs.com/huangjianwu/p/4539666.html
Copyright © 2020-2023  润新知