Skip to content

পোস্ট

NHibernate শ্রোতাদের সাথে স্বচ্ছ এনক্রিপশন বাস্তবায়ন (ইন্টারসেপ্টর)

৩ নভেম্বর, ২০১৪ • 4 মিনিট পড়া

NHibernate শ্রোতাদের সাথে স্বচ্ছ এনক্রিপশন বাস্তবায়ন (ইন্টারসেপ্টর)

আপনি কি কখনও ডাটাবেসে ডেটা এনক্রিপ্ট করতে হয়েছে? এই পোস্টে, আমি nHibernate শ্রোতাদের ব্যবহার করে আপনার ডাটাবেসে এবং থেকে আসা ডেটা এনক্রিপ্ট এবং ডিক্রিপ্ট করার উপায় অন্বেষণ করব। ক্রিপ্টোগ্রাফি আপনার অ্যাপ্লিকেশনের জন্য স্বচ্ছ হবে।

আপনি এটি কেন করতে চাইবেন? SQL Server এর পণ্যে এনক্রিপশন বিল্ট-ইন আছে। এটি সত্য, কিন্তু যদি আপনি ক্লাউডে যাচ্ছেন এবং SQL Azure ব্যবহার করতে চান তাহলে আপনার কিছু ধরনের ক্রিপ্টোগ্রাফি কৌশল প্রয়োজন হবে। SQL Azure ডাটাবেস এনক্রিপশন সমর্থন করে না।

nHibernate শ্রোতা কি? আমি একটি শ্রোতাকে এমন কোড হিসাবে চিন্তা করি যা আমি nHibernate স্থায়িত্ব এবং ডেটা হাইড্রেশন জীবনচক্রে নির্দিষ্ট সম্প্রসারণযোগ্যতা পয়েন্টে ইনজেক্ট করতে পারি।

এই লেখার সময় nHibernate-এ নিম্নলিখিত সম্প্রসারণযোগ্যতা পয়েন্টগুলি উপলব্ধ।

  • IAutoFlushEventListener
  • IDeleteEventListener
  • IDirtyCheckEventListener
  • IEvictEventListener
  • IFlushEntityEventListener
  • IFlushEventListener
  • IInitializeCollectionEventListener
  • ILoadEventListener
  • ILockEventListener
  • IMergeEventListener
  • IPersistEventListener
  • IPostCollectionRecreateEventListener
  • IPostCollectionRemoveEventListener
  • IPostCollectionUpdateEventListener
  • IPostDeleteEventListener
  • IPostInsertEventListener
  • IPostLoadEventListener
  • IPostUpdateEventListener
  • IPreCollectionRecreateEventListener
  • IPreCollectionRemoveEventListener
  • IPreCollectionUpdateEventListener
  • IPreDeleteEventListener
  • IPreInsertEventListener
  • IPreLoadEventListener
  • IPreUpdateEventListener
  • IRefreshEventListener
  • IReplicateEventListener
  • ISaveOrUpdateEventListener

তালিকা ব্যাপক।

স্বচ্ছ ক্রিপ্টোগ্রাফি বাস্তবায়ন করতে, আমাদের ডেটা এনক্রিপ্ট এবং ডিক্রিপ্ট করার জন্য সঠিক জায়গা খুঁজে বের করতে হবে। ডেটা এনক্রিপ্ট করার জন্য আমরা IPostInsertEventListener এবং IPostUpdateEventListener ব্যবহার করব। এই ইভেন্টগুলির সাথে আমরা ডাটাবেসে যাওয়া নতুন ডেটা এবং আপডেট করা ডেটা ধরব। ডিক্রিপ্টের জন্য, আমরা IPreLoadEventListener ব্যবহার করব।

এই প্রদর্শনের জন্য আমরা এনক্রিপ্ট এবং ডিক্রিপ্টের জন্য DatabaseCryptography ক্লাস ব্যবহার করব। ক্রিপ্টোগ্রাফি বাস্তবায়ন এই নিবন্ধের জন্য গুরুত্বপূর্ণ নয়।

IPreLoadEventListener

public class PreLoadEventListener : IPreLoadEventListener
{
readonly DatabaseCryptography _crypto = new DatabaseCryptography();

///
/// Called when [pre load].
///

///The event. public void OnPreLoad(PreLoadEvent @event)
{
_crypto.DecryptProperty(@event.Entity, @event.Persister.PropertyNames, @event.State);
}
}

IPreInsertEventListener

public class PreInsertEventListener : IPreInsertEventListener
{
readonly DatabaseCryptography _crypto = new DatabaseCryptography();

///
/// Return true if the operation should be vetoed
///

///The event. /// true if XXXX, false otherwise.
public bool OnPreInsert(PreInsertEvent @event)
{
_crypto.EncryptProperties(@event.Entity, @event.State, @event.Persister.PropertyNames);

return false;
}
}

IPreUpdateEventListener

public class PreUpdateEventListener : IPreUpdateEventListener
{
readonly DatabaseCryptography _crypto = new DatabaseCryptography();

///
/// Return true if the operation should be vetoed
///

///The event. /// true if XXXX, false otherwise.
public bool OnPreUpdate(PreUpdateEvent @event)
{
_crypto.EncryptProperties(@event.Entity, @event.State, @event.Persister.PropertyNames);

return false;
}
}

এটি লক্ষ্য করা গুরুত্বপূর্ণ যে IPreUpdateEventListener এবং IPreInsertEventListener উভয়ই false রিটার্ন করতে হবে, অন্যথায় insert/update ইভেন্ট বাতিল হবে।

এখন যে আমাদের শ্রোতারা বাস্তবায়িত হয়েছে আমাদের তাদের nHibernate এর সাথে নিবন্ধন করতে হবে। আমি FluentNHibernate ব্যবহার করছি তাই এটি ভিন্ন হবে যদি আপনি কাঁচা nHibernate ব্যবহার করছেন।

SessionFactory

public class SessionFactory
{
///
/// Creates the session factory.
///

/// ISessionFactory.
public static ISessionFactory CreateSessionFactory()
{
return Fluently.Configure()

.Database(MsSqlConfiguration.MsSql2012
.ConnectionString(c => c
.FromConnectionStringWithKey("DefaultConnection")))

.Mappings(m => m.FluentMappings.AddFromAssemblyOf())
.ExposeConfiguration(s =>
{
s.SetListener(ListenerType.PreUpdate, new PreUpdateEventListener());
s.SetListener(ListenerType.PreInsert, new PreInsertEventListener());
s.SetListener(ListenerType.PreLoad, new PreLoadEventListener());
})
.BuildConfiguration()
.BuildSessionFactory();
}

অ্যাপ্লিকেশন স্তরে ডেটা ডিক্রিপ্ট এবং এনক্রিপ্ট করার সময় এটি ডাটাবেসে ডেটা অকেজো করে তোলে। এনক্রিপ্ট করা ফিল্ডের মান পড়তে আপনাকে ডেটা অ্যাপ্লিকেশনে ফিরিয়ে আনতে হবে। আমরা এনক্রিপ্ট করা ফিল্ডগুলি সীমাবদ্ধ করতে চাই এবং আমরা শুধুমাত্র স্ট্রিং মান এনক্রিপ্ট করতে চাই। স্ট্রিং মান ছাড়া অন্য কিছু এনক্রিপ্ট করা জিনিসগুলি জটিল করে তোলে। এমন কিছুই নেই যা বলে আমরা তারিখ এনক্রিপ্ট করতে পারি না, কিন্তু এটি করার জন্য ডাটাবেসে তারিখ ফিল্ডকে একটি string(nvarchar বা varchar) ফিল্ডে পরিণত করতে হবে, এনক্রিপ্ট করা ডেটা ধরে রাখতে, একবার আমরা এটি করলে আমরা ডাটাবেস থেকে তারিখ ফিল্ডে কাজ করার ক্ষমতা হারাই।

কোন ফিল্ডগুলি আমরা এনক্রিপ্ট এবং ডিক্রিপ্ট করতে চাই তা চিহ্নিত করতে আমি মার্কার বৈশিষ্ট্য ব্যবহার করব।

Encrypt Attribute

public class EncryptAttribute : Attribute
{
}

Decrypt Attribute

public class DecryptAttribute : Attribute
{
}

EncryptAttribute এবং DecryptAttribute কর্মে দেখতে আমরা DatabaseCryptography ক্লাসে একটি ঝলক নেব।

DatabaseCryptography

public class DatabaseCryptography
{
    private readonly Crypto _crypto = ObjectFactory.GetInstance();

    ///
    /// Encrypts the properties.
    ///
    ///The entity. ///The state. ///The property names. 
    public void EncryptProperties(object entity, object[] state, string[] propertyNames)
    {
        Crypt(entity, propertyNames, s = >
        _crypto.Encrypt(s),
        state)
        ;
    }

    ///
    /// Crypts the specified entity.
    ///

    ///
    ///The entity. ///The state. ///The property names. ///The crypt.
    private void Crypt(object entity, string[] propertyNames, Func<string, string> crypt, object[] state) where T : Attribute
    {
        if (entity != null)
        {
            var properties = entity.GetType().GetProperties();

            foreach (var info in properties)
            {
                var attributes = info.GetCustomAttributes(typeof (T), true);

                if (attributes.Any())
                {
                    var name = info.Name;
                    var count = 0;

                    foreach (var s in propertyNames)
                    {
                        if (string.Equals(s, name, StringComparison.InvariantCultureIgnoreCase))
                        {
                            var val = Convert.ToString(state[count]);
                            if (!string.IsNullOrEmpty(val))
                            {

                                val = crypt(val);
                                state[count] = val;
                            }

                            break;
                        }

                        count++;
                    }
                }
            }
        }
    }

    ///
    /// Decrypts the property.
    ///
    ///The entity. ///The state. ///The property names. 
    public void DecryptProperies(object entity, string[] propertyNames, object[] state)
    {
        Crypt(entity, propertyNames, s = >
        _crypto.Decrypt(s),
        state)
        ;
    }

}

এটাই। এখন ডেটার এনক্রিপশন এবং ডিক্রিপশন অ্যাপ্লিকেশনের জন্য স্বচ্ছ হবে এবং আপনি পরবর্তী Facebook তৈরি করতে আপনার আনন্দময় উপায়ে যেতে পারেন।

লেখক: চাক কনওয়ে একজন এআই ইঞ্জিনিয়ার যার কাছে প্রায় ৩০ বছরের সফটওয়্যার ইঞ্জিনিয়ারিং অভিজ্ঞতা রয়েছে। তিনি ব্যবহারিক এআই সিস্টেম তৈরি করেন—কন্টেন্ট পাইপলাইন, অবকাঠামো এজেন্ট এবং সরঞ্জাম যা বাস্তব সমস্যার সমাধান করে—এবং তার শেখার বিষয়গুলি শেয়ার করেন। তার সাথে সোশ্যাল মিডিয়ায় সংযোগ করুন: X (@chuckconway) অথবা তাকে YouTube এবং SubStack এ দেখুন।

↑ শীর্ষে ফিরে যান

আপনি এটিও পছন্দ করতে পারেন