Thông thường xuyên khi thực hiện Nhibernate để trở nên tân tiến ứng dụng website hay áp dụng winform chúng ta thường bỏ chuỗi kết nối ở tệp tin hibernate.cfg.xml , bản thân thấy vứt thế làm sao không bình an nên sau thời điểm google với tò mò mình vẫn tìm ra phương pháp để bỏ vào webconfig với mã hóa chuỗi liên kết này mang đến nó bình an nhằm kiêng shell


*

Thông hay thì chuỗi kết nối cơ sở dữ liệu thường quăng quật ở tệp tin hibernate.cfg.xml như sau :

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

Để mã hóa chuỗi liên kết ta viết một tấm là Crypto để mã hóa và lời giải 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 tiêu là mã hóa chuỗi kết nối.

Để sửa lại cách 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ú ý bình luận lại chiếc NHibernate.Connection.DriverConnectionProvider

Sau kia vào file webconfig xuất xắc app.config sửa lại thành :

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

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