Skip to content

पोस्ट

NHibernate Listeners (Interceptors) के साथ पारदर्शी एन्क्रिप्शन लागू करना

3 नवंबर 2014 • 5 मिनट पढ़ना

NHibernate Listeners (Interceptors) के साथ पारदर्शी एन्क्रिप्शन लागू करना

क्या आपको कभी डेटाबेस में डेटा को एन्क्रिप्ट करना पड़ा है? इस पोस्ट में, मैं यह देखूंगा कि nHibernate Listeners का उपयोग करके डेटा को कैसे एन्क्रिप्ट और डिक्रिप्ट किया जाए जो आपके डेटाबेस से आ रहा है और जा रहा है। क्रिप्टोग्राफी आपके एप्लिकेशन के लिए पारदर्शी होगी।

आप ऐसा क्यों करना चाहेंगे? SQL Server के पास उत्पाद में एन्क्रिप्शन बनाया हुआ है। यह सच है, लेकिन अगर आप क्लाउड में जा रहे हैं और SQL Azure का उपयोग करना चाहते हैं तो आपको किसी प्रकार की क्रिप्टोग्राफी रणनीति की आवश्यकता होगी। SQL Azure डेटाबेस एन्क्रिप्शन का समर्थन नहीं करता है।

nHibernate Listener क्या है? मैं एक Listener को कोड के एक टुकड़े के रूप में सोचता हूं जिसे मैं nHibernate persistence और data hydration lifecycle में विशिष्ट extensibility points में इंजेक्ट कर सकता हूं।

इस लेखन के समय nHibernate में निम्नलिखित extensibility points उपलब्ध हैं।

  • 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 का उपयोग करेंगे। इन events के साथ हम नए डेटा और अपडेट किए गए डेटा को डेटाबेस में जाते हुए पकड़ेंगे। डिक्रिप्ट करने के लिए, हम IPreLoadEventListener का उपयोग करेंगे।

इस प्रदर्शन के लिए हम एन्क्रिप्ट और डिक्रिप्ट करने के लिए DatabaseCryptography class का उपयोग करेंगे। क्रिप्टोग्राफी कार्यान्वयन इस लेख के लिए महत्वपूर्ण नहीं है।

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 return करना चाहिए, अन्यथा insert/update event को abort कर दिया जाएगा।

अब जब हमारे पास Listeners लागू हैं, तो हमें उन्हें nHibernate के साथ पंजीकृत करने की आवश्यकता है। मैं FluentNHibernate का उपयोग कर रहा हूं इसलिए यह अलग होगा यदि आप raw 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 values को एन्क्रिप्ट करना चाहते हैं। string values के अलावा कुछ भी एन्क्रिप्ट करना चीजों को जटिल बनाता है। कुछ भी नहीं कह रहा है कि हम dates को एन्क्रिप्ट नहीं कर सकते, लेकिन ऐसा करने के लिए डेटाबेस में date field को एक string(nvarchar या varchar) field बनना होगा, एन्क्रिप्ट किए गए डेटा को रखने के लिए, एक बार जब हम ऐसा करते हैं तो हम डेटाबेस से date field पर operate करने की क्षमता खो देते हैं।

यह पहचानने के लिए कि कौन से फ़ील्ड को एन्क्रिप्ट और डिक्रिप्ट करना है, मैं marker attributes का उपयोग करूंगा।

Encrypt Attribute

public class EncryptAttribute : Attribute
{
}

Decrypted Attribute

public class DecryptAttribute : Attribute
{
}

EncryptAttribute और DecryptedAttribute को action में देखने के लिए हम DatabaseCryptography class में एक झलक लेंगे।

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 को बनाने के लिए अपने रास्ते पर जा सकते हैं।

लेखक: Chuck Conway एक AI इंजीनियर हैं जिनके पास सॉफ्टवेयर इंजीनियरिंग का लगभग 30 साल का अनुभव है। वह व्यावहारिक AI सिस्टम बनाते हैं—कंटेंट पाइपलाइन, इंफ्रास्ट्रक्चर एजेंट, और ऐसे टूल जो वास्तविक समस्याओं को हल करते हैं—और अपनी सीख को साझा करते हैं। सोशल मीडिया पर उनसे जुड़ें: X (@chuckconway) या YouTube और SubStack पर उनसे मिलें।

↑ शीर्ष पर वापस जाएं

आपको यह भी पसंद आ सकता है