Thông thường khi sử dụng Nhibernate để phát triển ứng dụng web hay ứng dụng winform chúng ta thường bỏ chuỗi kết nối ở file hibernate.cfg.xml , mình thấy bỏ thế nào không an toàn nên sau khi google với tìm hiểu mình đã tìm ra cách để bỏ vào webconfig và mã hóa chuỗi kết nối này cho nó an toàn nhằm tránh shell

*

Thông thường thì chuỗi kết nối cơ sở dữ liệu thường bỏ ở file hibernate.cfg.xml như sau :

      Chuỗi kết nối cơ sở dữ liệu ở đây

   

Để mã hóa chuỗi kết nối ta viết một lớp là Crypto để mã hóa và giải mã trước đã

public static class Crypto    {        const string InitialVector = “4AQYuEmZ3Q7gNHdj”;               public static string Encrypt(string data,string pass)        {            if (string.IsNullOrEmpty(data)) return “”;

           var initialVectorBytes = Encoding.ASCII.GetBytes(InitialVector);            var plainTextBytes = Encoding.UTF8.GetBytes(data);            var keyBytes = Encoding.ASCII.GetBytes(pass);

           var symmetricKey = new RijndaelManaged();            symmetricKey.Mode = CipherMode.CBC;            byte cipherTextBytes = null;            using (var encryptor = symmetricKey.CreateEncryptor(keyBytes, initialVectorBytes))            {                using (var memStream = new MemoryStream())                {                    using (var cryptoStream = new CryptoStream(memStream, encryptor, CryptoStreamMode.Write))                    {                        cryptoStream.Write(plainTextBytes, 0, plainTextBytes.Length);                        cryptoStream.FlushFinalBlock();                        cipherTextBytes = memStream.ToArray();                        memStream.Close();                        cryptoStream.Close();                    }                }            }            symmetricKey.Clear();            return Convert.ToBase64String(cipherTextBytes);                 }             public static string Decrypt(string data,pass)        {            if (string.IsNullOrEmpty(data)) return “”;

           var initialVectorBytes = Encoding.ASCII.GetBytes(InitialVector);            var cipherTextBytes = Convert.FromBase64String(data);            var keyBytes = Encoding.ASCII.GetBytes(pass);

           var symmetricKey = new RijndaelManaged();            symmetricKey.Mode = CipherMode.CBC;            var plainTextBytes = new byte;            var byteCount = 0;            using (var decryptor = symmetricKey.CreateDecryptor(keyBytes, initialVectorBytes))            {                using (var memStream = new MemoryStream(cipherTextBytes))                {                    using (var cryptoStream = new CryptoStream(memStream, decryptor, CryptoStreamMode.Read))                    {                        byteCount = cryptoStream.Read(plainTextBytes, 0, plainTextBytes.Length);                        memStream.Close();                        cryptoStream.Close();                    }                }            }            symmetricKey.Clear();            return Encoding.UTF8.GetString(plainTextBytes, 0, byteCount);                   }        }

Mục đích của lớp này là mã hóa theo pass và giải mã theo pass một chuỗi, mục đích là mã hóa chuỗi kết nối.

Để sửa lại phương thức lấy chuỗi kết nối ta override lại lớp NHibernate.Connection.DriverConnectionProvider như sau :

public class MyConnectionProvider : NHibernate.Connection.DriverConnectionProvider     {         static string conn = “”;         protected override string ConnectionString         {             get             {                 if (string.IsNullOrEmpty(conn))                 {

                    string connectionString = ConfigurationManager.ConnectionStrings.ConnectionString;                     conn= Crypto.Decrypt(connectionString,”sokhanh03″);                 }                 return conn;             }         }                    }

Sửa file hibernate.cfg.xml như sau :

      (Name space của MyConnectionProvider).MyConnectionProvider,Name space của MyConnectionProvider          

Chú ý comment lại dòng NHibernate.Connection.DriverConnectionProvider

Sau đó vào file webconfig hay app.config sửa lại thành :

           

Như vậy ta đã chuyển chuỗi kết nối từ file hibernate.cfg.xml sang file webconfig(app.config) đã mã hóa, sau đó tiến hành code bình thường.

Mục đích của việt này là tránh việc bị shell đọc file webconfig và lấy chuỗi kết nối

Chuyên mục: Hỏi Đáp