Trang chủ » CSharp » Mã hóa chuỗi kết nối vào webconfig trong Nhibernate

Mã hóa chuỗi kết nối vào webconfig trong Nhibernate


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 :

<property name="connection.connection_string">
      Chuỗi kết nối cơ sở dữ liệu ở đây

    </property>

Để 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[cipherTextBytes.Length];
           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["ApplicationServices"].ConnectionString;
                    conn= Crypto.Decrypt(connectionString,"sokhanh03");
                }
                return conn;
            }
        }       
       
    }

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

<property name="connection.provider">
      (Name space của MyConnectionProvider).MyConnectionProvider,Name space của MyConnectionProvider
      <!–NHibernate.Connection.DriverConnectionProvider–>
    </property>

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

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

<connectionStrings>
        <add name="ApplicationServices" connectionString="Chuỗi kết nối đã mã hóa với pass là sokhanh03" providerName="System.Data.SqlClient"/>
    </connectionStrings>

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

Chúc các bạn thành công!

Nếu vẫn không làm được vui lòng comment lại ở đây mình sẽ support cho 爆笑

Bình luận

Mời bạn điền thông tin vào ô dưới đây hoặc kích vào một biểu tượng để đăng nhập:

WordPress.com Logo

Bạn đang bình luận bằng tài khoản WordPress.com Log Out / Thay đổi )

Twitter picture

Bạn đang bình luận bằng tài khoản Twitter Log Out / Thay đổi )

Facebook photo

Bạn đang bình luận bằng tài khoản Facebook Log Out / Thay đổi )

Google+ photo

Bạn đang bình luận bằng tài khoản Google+ Log Out / Thay đổi )

Connecting to %s