2014-04-08 5 views
13

मैं कोशिश कर रहा था और साथ इकाई की रूपरेखा कोड पहले एसक्यूएल डेटा को एन्क्रिप्ट करने के लिए एक अच्छा दृष्टिकोण यह पता लगाने में नाकाम रहने के। मुझे इसका प्रस्ताव देना होगा कि मैं Azure में होस्टिंग कर रहा हूं और मूल SQL एन्क्रिप्शन तक पहुंच नहीं है।मैं एंटिटी फ्रेमवर्क कोड में डेटा को एन्क्रिप्ट कैसे करूं?

SecurEntity से एक पृष्ठ लेते हुए, मैंने पूरी तरह से एक दृष्टिकोण लागू किया है जो इकाइयों की एन्क्रिप्टिंग/डिक्रिप्टिंग को संभालने के लिए सेव चेंज और ऑब्जेक्टमैटेरियलाइज्ड का उपयोग करता है, लेकिन परीक्षण में मैंने पाया है कि यह उपयोग करने के लिए बहुत अविश्वसनीय है।

public Value { get; set; } 

[NotMapped] 
public DecryptedValue 
{ 
    get { return Decrypt(this.Value); } 
    set { this.Value = Encrypt(value); } 
} 

यह सबसे निश्चित रूप से होगा:

public override int SaveChanges() 
{ 
    var pendingEntities = ((IObjectContextAdapter)this).ObjectContext.ObjectStateManager 
     .GetObjectStateEntries(EntityState.Added | EntityState.Modified) 
     .Where(en => !en.IsRelationship).ToList(); 

    foreach (var entry in pendingEntities) //Encrypt all pending changes 
     EncryptEntity(entry.Entity); 

    int result = base.SaveChanges(); 

    foreach (var entry in pendingEntities) //Decrypt updated entities for continued use 
     DecryptEntity(entry.Entity); 

    return result; 
} 

void ObjectMaterialized(object sender, ObjectMaterializedEventArgs e) 
{ 
    DecryptEntity(e.Entity); 
} 

मैं अन्य पदों कि मैन्युअल एन्क्रिप्ट/माध्यमिक गुण के माध्यम से डिक्रिप्ट, इसलिए की तरह देखा है:

यहाँ कार्यान्वयन के कुछ का एक नमूना है काम, लेकिन मुझे यह दृष्टिकोण आदर्श लगता है ... आदर्श से कम। इस दृष्टिकोण का उपयोग करते समय, सभी डेवलपर्स को सभी एन्क्रिप्टेड गुणों से गुज़रना पड़ता है ताकि वे यह पता लगा सकें कि वे किसका उपयोग कर सकते हैं।

सबसे आदर्श समाधान हो मेरे डेटा पहुंच के स्तर पर प्रत्येक मान की हो रही है/सेटिंग को ओवरराइड करने में सक्षम होना करने के लिए होगा। क्या इसे करने का कोई तरीका है? यदि नहीं, तो मैं एंटिटी फ्रेमवर्क के साथ डेटा एन्क्रिप्शन को कैसे कार्यान्वित कर सकता हूं - कोड पहले ताकि इसे बनाए रखना और काम करना आसान हो?

+3

बारे में पता एक घातक सुरक्षा दोष है कि SecurEntity का वर्तमान क्रियान्वयन, जिसका अर्थ है कि प्रमाण पत्र से उत्पन्न कुंजी वास्तव में इस्तेमाल कभी नहीं किया है हो सकता है। एक त्वरित और गंदा ठीक लिए, https://securentity.codeplex.com/workitem/7376 –

उत्तर

10

मेरे पास अच्छी खबर है। अस्थिरता मैं SaveChanges/ObjectMaterialized दृष्टिकोण के साथ सामना कर रहा था तथ्य यह है कि जब तक DetectChanges() DbContext वास्तव में बचाने के प्रदर्शन नहीं बुलाया जाता है की वजह से था।

ObjectStateManager से जोड़े गए/संशोधित रिकॉर्ड खींचने से पहले मैं DetectChanges() पर कॉल करके इसे ठीक करने में सक्षम था। इसने किसी ऑब्जेक्ट स्टेट अजीबताओं को मंजूरी दे दी जो असंगत एन्क्रिप्शन व्यवहार पैदा कर रहे थे।

जिसके परिणामस्वरूप कोड किया जा रहा है:

public override int SaveChanges() 
{ 
    var contextAdapter = ((IObjectContextAdapter)this); 

    contextAdapter.ObjectContext.DetectChanges(); 

    var pendingEntities = contextAdapter.ObjectContext.ObjectStateManager 
     .GetObjectStateEntries(EntityState.Added | EntityState.Modified) 
     .Where(en => !en.IsRelationship).ToList(); 

    foreach (var entry in pendingEntities) //Encrypt all pending changes 
     EncryptEntity(entry.Entity); 

    int result = base.SaveChanges(); 

    foreach (var entry in pendingEntities) //Decrypt updated entities for continued use 
     DecryptEntity(entry.Entity); 

    return result; 
} 

संपादित - सभी संस्थाओं एन्क्रिप्ट करने के लिए मेरी एंड-टू-एंड समाधान को देखने के लिए एक नमूना DataContext जोड़ा गया। नोट: गुणों को एन्क्रिप्ट करने के लिए आपको कस्टम विशेषता का उपयोग करने की आवश्यकता नहीं है। Source

+1

देख वहाँ ओवरराइड करने के लिए सभी गुण तरीकों उन्हें डिक्रिप्ट करने के लिए मिलता है एक तरीका है? मैं हम इसे वैश्विक स्तर पर, फिर पाश गुण को ओवरराइड और किसी भी स्ट्रिंग गुण डिक्रिप्ट कर सकते हैं, प्रति वस्तु आधार एक पर यह करने के लिए करना चाहते हैं न? –

+0

मुझे यकीन है कि आप जो चाह रहे हैं नहीं कर रहा हूँ, लेकिन यह जब वे सहेजे जाते हैं/EntityFramework में लिया गया सभी वस्तुओं के गुणों को संशोधित करने के लिए संभव है। मेरे नमूना कोड में यह वास्तव में 'एन्क्रिप्टेड एंटीटी' और 'डिक्रिप्ट एंटीटी' क्या है। मैं उन दो विधियों को संदर्भ के लिए अपने उत्तर में जोड़ दूंगा। –

+0

यह आप EncryptionService के अपने संस्करण को साझा करने के लिए संभव है? यदि नहीं, तो क्या आप इसे प्राप्त करने के तरीके पर मुझे कुछ मार्गदर्शन दे सकते हैं? मैंने इसकी तलाश करने की कोशिश की है लेकिन एन्क्रिप्शन कुंजी आदि को स्टोर करने के लिए चीजों पर ज्यादा सफलता नहीं मिली है। –

संबंधित मुद्दे