希格工作室

2011年6月23日 星期四

Linq To Sql 加密連線資訊

在使用Linq To Sql拉出DataContext並且依我們的需要代入Table後
會自動生成一組連接資訊,如下圖:















同時亦會在Web.Config裡記錄連線的資訊


        由圖可知,記錄的資訊是包含帳密的完整的連線資訊,也許我們可以透過主機信任的方式,使得它不儲存密碼部份的機密資訊,但本篇不討論這部份(而且我也不確定這點),也許我們可以透過其它軟體,替Web.config做加密的動作,不過我只想要手動替這行連線字串加密,來保持我的隱密性就夠了,這就是我要的目的。

        先直接貼上程式碼

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data.Linq.Mapping;

namespace Library.LinkSource
{

    public partial class Link : MyDataContext
    {
        private static System.Data.Linq.Mapping.MappingSource mappingSource = new AttributeMappingSource();
        partial void OnCreated();
        public Link() :
            base(rtns(System.Configuration.ConfigurationManager.ConnectionStrings["SelfConnectionString"].ConnectionString), mappingSource)
  {
   OnCreated();
  }

        public Library.LinkSource.MyDataContext DataBase()
        {
            return new Library.LinkSource.MyDataContext(rtns(System.Configuration.ConfigurationManager.ConnectionStrings["SelfConnectionString"].ConnectionString));

        }

        public static string rtns(string s)
        {
            string xmlpath = func_Encryption.UserGroup.PrivateXmlKey;
            System.Xml.XmlDocument x = new System.Xml.XmlDocument();
            //x.Load(xmlpath);
            x.LoadXml(xmlpath);
            return func_Encryption.RSA.DecryptRSA(s, x.InnerXml);
        }
    }

}


MyDataContext是我建立的LinqToSQL所使用的dbml
SelfConnectionString是對應Web.Config的組態名稱
rtns(string s)是將從Web.Config取得的資料進行解密動作的方法,依照你個人設計方式去進行加解碼的動作,在我的範例裡,我另外事先寫好了加解碼的function讓我套用。

而我在Web.Config的原始字串,則是被我用RSA加密過的資料,一般來說除非取得我的私鑰,否則無法解析。


connectionString加密後的樣子:
<connectionStrings>
  <add name="SelfBlogConnectionString" connectionString="4E04EFD36139DFF903496A3C72B3E389914CC27617041075209CE2D819G197539F8A6E0E0F372D3D1446E451479A31FFBEA596DB99E2FDA7F32BFE817A6D5206C7BBC3771F861F3B5CFB52327AF118DF4CCBC0BB877561CFA243CA82372280E542BDEDAAE538E3443D79FB85B0B5FF2E21048658D7AAFAA7BA86CB20396C9610" providerName="System.Data.SqlClient"/>
 </connectionStrings>


當我要使用時


             Link conn = new Link();

            var sysc = from use in conn.DataBase().MyTable
                       select use;


其實講明白點,就只是在

Library.LinkSource.MyDataContext(rtns(System.Configuration.ConfigurationManager.ConnectionStrings["SelfConnectionString"].ConnectionString)

多加了一個rtns()的處理而已。