在Winform開發框架中實現對數據庫的加密支持


在很多情況下,我們需要對數據庫進行加密,特別是Access數據庫、Sqlite數據庫,這些直接部署在客戶端的數據,因為數據也是客戶的資產,數據庫總是存在很多相關的秘密或者重要的業務數據,所以一般來說,數據庫是比較敏感的。由於我的Winform開發框架數據庫訪問模塊中采用了EnterpriseLibrary模塊,因此其實也可以使用其中的Crytography Application Block進行加解密處理。

由於不想引入太多這些額外的模塊,或者為了簡化客戶端的配置考慮,直接在EnterpriseLibrary模塊內部對數據庫連接字符串,增加密碼部分,也是一個有效的方法,本文通過介紹這種方式,實現對加密Access數據庫連接字符串的處理,並能順利訪問帶密碼的Access數據庫。

1、數據庫選擇

如果要加密的是Access數據庫,必須選擇Access2007以上版本,這個版本的密碼是經過128位的特殊處理,目前好像還是比較難破解,也好像沒有找到合適的破解工具,如果是Access2000,那破解密碼的工具真是多了去的了。

Access2007版本的數據庫引擎,一般沒有安裝Office2007的電腦,是需要特別安裝AccessDatabaseEngine這個驅動的。否則會提示“The 'Microsoft.ACE.OLEDB.12.0' provider is not registered on the local machine.”(未在本地計算機上注冊“microsoft.ACE.oledb.12.0”提供程序)的錯誤。到微軟網站下載對應版本的驅動即可。

如果要加密的是Sqlite數據庫,那么也是可以比較有效的,他的密碼也是比較難於破解的。

上面兩種客戶端數據庫,打開后先通過軟件本身的功能進行加密,密碼我們在開發初期就設定即可,客戶一般不需要了解,他們或者其他人員復制出去,也無法單獨使用,確保了數據庫的安全性。

2、數據庫加密處理

1)Access的數據庫加密 

如果是對Access的數據庫加密,記住選擇Access2007以上的格式,然后以獨占方式打開Access文件,如下圖所示。

然后在數據庫工具選項里面,選擇用密碼進行加密,在彈出的對話框輸入你的密碼即可。

Office2007的密碼強度還是不錯的,至少我找了好幾個工具,沒能順利破解出我的密碼內容。

2)Sqlite數據庫加密

Sqlite的數據庫加密也很簡單,我這里使用Sqlite Developer打開已有數據庫,然后在數據庫右鍵上選擇Set Encryption Key,在彈出的對話框中輸入密碼即可。

我曾經專門針對Sqlite數據庫機密機制做了一些了解,好像強度還是不錯,而且據說性能損失是很少的。我在開發測試的時候,性能方面確實看不出太大的干擾。

3、連接字符串增加加密內容

由於我們希望數據庫配置項盡可能簡潔,因此可以不用在配置文件中指定訪問密碼,這樣也避免了加密字符串的泄密問題,我們可以通過動態設置數據庫訪問對象Database 的數據庫訪問密碼屬性進行內存上處理。如下代碼所示是對Access數據庫連接字符串進行增加加密字符串的操作。

        #region 連接字符串加密
        /// <summary>
        /// 根據配置數據庫配置名稱生成Database對象
        /// </summary>
        /// <returns></returns>
        protected virtual Database CreateDatabase()
        {
            Database db = null;
            if (string.IsNullOrEmpty(dbConfigName))
            {
                db = DatabaseFactory.CreateDatabase();
            }
            else
            {
                db = DatabaseFactory.CreateDatabase(dbConfigName);
            }

            DbConnectionStringBuilder sb = db.DbProviderFactory.CreateConnectionStringBuilder();
            sb.ConnectionString = GetConnectionString();
            GenericDatabase newDb = new GenericDatabase(sb.ToString(), db.DbProviderFactory);
            db = newDb;

            return db;
        }

        /// <summary>
        /// 動態改變或者連接字符串
        /// </summary>
        /// <returns></returns>
        protected virtual string GetConnectionString()
        {
            string connectionString = "";
            DatabaseSettings setting = ConfigurationManager.GetSection("dataConfiguration") as DatabaseSettings;
            if(setting != null)
            {
                string defaultConnection = setting.DefaultDatabase;
                connectionString = ConfigurationManager.ConnectionStrings[defaultConnection].ConnectionString;

                //嘗試加密或者解密
                if(!connectionString.EndsWith(";"))
                {
                    connectionString += ";";
                }
                connectionString += string.Format("Jet OLEDB:Database Password=testpassword;");
            }

            return connectionString;
        }

        #endregion

通過在訪問數據庫的時候,動態增加加密的連接字符串,在系統的配置文件上,就和普通的沒什么差別了,如下所示

  <connectionStrings>
    <!--路徑符號|DataDirectory|代表當前運行目錄-->
<add name="Access" providerName="System.Data.OleDb"
         connectionString="Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|\Database1.accdb;User ID=Admin;"/>
    <add name="sqlite" providerName="System.Data.SQLite" connectionString="Data Source=|DataDirectory|\ForumMis.db;Version=3;"/>

  </connectionStrings>

上面配置文件,Access數據庫用的是2007格式的,所以用了Provider=Microsoft.ACE.OLEDB.12.0,如果是Access2000的話,那么就是Provider=Microsoft.Jet.OLEDB.4.0(基於安全原因,不用)。

Sqlite數據庫的操作也類似, 它的加密字符串例子如下:Data Source=c:\mydb.db;Version=3;Password=myPassword;。

通過動態在連接字符串中增加加密字符串的方式,對於這些部署到客戶端的數據庫,第一個是提高安全性,用戶分析不到那種加密類型;第二個是用戶連接字符串不受干擾,可以正常閱讀;第三是不用引入更多的模塊和代碼去實現。

以上只是我Winform開發框架用到的數據庫字機密機制的一種,供大家參考和指正。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM