1、在webconfig文件中如何做到将连接数据库的字符串做成相对路径
2、如何在webconfig文件中加密数据库字连接符串中的passwd的值
如无法实现,请给出好的解决方案.

解决方案 »

  1.   

    是访问access数据库吗,那肯定要绝对路径了。
    如果在webconfig文件中加密passwd,那你使用时是不是还要解密?若那样,你直接把加密后的password写入webconfig文件中不就行了,加密算法自己定。
      

  2.   

    kongxing(我心飞翔) :是access数据库,你说“你直接把加密后的password写入webconfig文件中”还是不太明白,假如我的数据库密码为sss 如果我用SHA1,再假如值为CD3F0C85B158C08A2B113464991810CF2CDFC387
    在webconfig中为
    <add key="DatabasePath" value="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=f:\test\date\sanitation.mdb;Jet OLEDB:Database Password=sss;" />
    改为
    <add key="DatabasePath" value="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=f:\test\date\sanitation.mdb;Jet OLEDB:Database Password=CD3F0C85B158C08A2B113464991810CF2CDFC387;" />用ConfigurationSettings.AppSettings直接读出来的是个string值,如何还原为sss ?来打开数据库?
      

  3.   

    解答:
    1、做成绝对路径,只要在想加的地方加上Server.MapPath(""),这个是返回当前数据库的路径的,其实你还可以这样来做,Server.MapPath("/"),/代表返回程序的根目录的,这样位置肯定不会出错
    2、在Web.Config中加密密码,是可以的,你可以选择你需要加密的方式的,比如Sha或者Hash等方式,但是主要这个加密方式一定是需要是对称的,就是可以反向解开的附:技术文章,转帖。加密web.config中的信息
    我们都知道web.config可以保存连接字符串,我们在程序中也都是这么做的,web.config是XML,所以它有清晰的结构,是我们很容易可以读懂它,但是这也出现一个问题,我们数据库完全暴露给浏览该文件的人,这是我们所不希望的。我们可以使用一个简单有效的加密算法来加密这段连接字符,使直接浏览该文件的人不能清楚地看到这些信息。
           我们一般以下面的形式保存连接字符串:
          <appSettings>
              <add key="ConnectionString" value="server=localhost;database=test;pwd=sa;uid=sa;" />
          </appSettings>
          为了我们自己可以看得明白这些加密的字符我们需要一个额外的程序专门生成这些加密数据(这个额外的程序你可以写得很复杂但是为了说明问题,我们使用简单的base64编码数据,这其实不是加密数据,但是原理是一样的)。我们建立一个WinForm工程,专门用来生成明文到密文的(base64)转换,如果使用其它的加密算法可以替换这个加密过程。转换按钮里面的代码如下:
    private void button1_Click(object sender, System.EventArgs e) {
       byte[] data = System.Text.ASCIIEncoding.ASCII.GetBytes(this.textBox1.Text);
       string str  = Convert.ToBase64String(data);
       this.textBox2.Text = str;
      }
           其中textBox2里面就是变码以后的字符。我们可以将我们web.config里面的连接字符("server=localhost;database=test;pwd=sa;uid=sa;")取出来放在这个程序里面执行生成一个新的字符串(c2VydmVyPWxvY2FsaG9zdDtkYXRhYmFzZT10ZXN0O3B3ZD1zYTt1aWQ9c2E7)。
    之后我们用这个字符替换未编码的字符串。如下所示:
        <appSettings>
            <add key="ConnectionString"   value="c2VydmVyPWxvY2FsaG9zdDtkYXRhYmFzZT10ZXN0O3B3ZD1zYTt1aWQ9c2E7" />
        </appSettings>
           哈哈!看不见了吧!但是我们的程序也不认识了:-( 没关系我们自己知道加密算法所以我们的程序可以看懂,最后就是在程序中如何使用了,我们的程序需要理解这个字符串的意义,我们在数据访问层里面添加如下的工具方法
    private string GetConnectionString(){
       string strconn = System.Configuration.ConfigurationSettings.AppSettings["ConnectionString"];
       byte[] data = Convert.FromBase64String(strconn);
       string strRealConn = System.Text.ASCIIEncoding.ASCII.GetString(data);
       return strRealConn;
      }
    这样就可以得到真实的连接字符串了。
           上文一个简单的加密(伪加密,其实本文实现的是一个编码而非加密)的方法,也许可以骗过一些人的眼睛,但是对于了解内幕的人还是起步到什么保护的作用,所以你可以扩展这个算法,使用对称或者非对称的加密算法替换该案例里面的编码算法,这样基本上就万无一失了。要使用对成加密算法加密数据请参考http://www.csdn.net/Develop/read_article.asp?id=23386里面介绍了一些方法,用非对成加密请参考其他文章。
      

  4.   

    to:jhpxf(小小虾米) 看了你的转贴文章后有所启发,针对第一个问题,在webconfig中实现相对的数据库连接路径的确无法实现了吗?