1.最近研究了下利用SQLite为db文件简单的加密和解密
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的异常处理,个人已验证,可以直接拿去用。
时间: 2024-10-20 10:40:06