1.最近研究了下利用SQLite爲db文件簡單的加密和解密sql
1 private static SQLiteConnection GetConnection() 2 { 3 SQLiteConnection conn; 4 string password = dataProvider.ConfigSearch(ConfigCode.SYS_File_ENCRYPTION_PASSWORD, true)[0].Value; 5 string dbFile = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData), ConfigCode.CLIENT_DATA_PATH); 6 string dbPath = Path.GetDirectoryName(dbFile); 7 if (!Directory.Exists(dbPath)) 8 { 9 Directory.CreateDirectory(dbPath); 10 } 11 if (!File.Exists(dbFile)) 12 { 13 //數據庫不存在,則建立 14 SQLiteConnection.CreateFile(dbFile); 15 CommonUtils.SetAccessControlList(dbFile); 16 conn = new SQLiteConnection(string.Format("Data Source={0};Pooling=true;FailIfMissing=false", dbFile)); 17 conn.Open(); 18 conn.ChangePassword(password); 19 if (string.IsNullOrEmpty(install_db_sql)) 20 { 21 install_db_sql = Path.Combine(Path.GetDirectoryName(typeof(SQLiteProvider).Assembly.Location), "setup.sql"); 22 } 23 24 foreach (string line in File.ReadAllText(install_db_sql).Split(new char[] { ';' })) 25 { 26 if (String.IsNullOrEmpty(line)) 27 { 28 continue; 29 } 30 SQLiteCommand cmd = conn.CreateCommand(); 31 cmd.CommandText = line; 32 cmd.CommandType = CommandType.Text; 33 cmd.ExecuteNonQuery(); 34 cmd.Dispose(); 35 } 36 } 37 else 38 { 39 try 40 { 41 conn = new SQLiteConnection(string.Format("Data Source={0};Pooling=true;FailIfMissing=false", dbFile)); 42 conn.SetPassword(password); 43 conn.Open(); 44 conn.ChangePassword(password); 45 } 46 catch (Exception) 47 { 48 conn = new SQLiteConnection(string.Format("Data Source={0};Pooling=true;FailIfMissing=false", dbFile)); 49 conn.Open(); 50 } 51 52 } 53 return conn; 54 }
這裏爲了兼顧之前沒有加密的數據庫文件,特地作了處理,若是數據庫不存在,直接建立,加密就不存在這個問題,主要是針對已經存在的數據庫有個try...catch的異常處理,我的已驗證,能夠直接拿去用。數據庫