2010-07-15 13 views
9

पृष्ठभूमि जानकारी डेटा एन्क्रिप्ट करने के नेटिव PHP समारोह ओवरलोडिंग:

मैं डेवलपर्स की एक टीम है कि एक वेब अनुप्रयोग है कि दुकानों और HIPAA (चिकित्सा) डेटा को पुन: प्राप्त चलाता है का हिस्सा हूँ। हाल ही में, एचआईपीएए दिशानिर्देशों को एक नीति शामिल करने के लिए अद्यतन किया गया था जिसके लिए सभी पहचानकर्ता ग्राहक जानकारी को "आराम पर" (डेटाबेस में संग्रहीत और एक्सेस नहीं किया जा रहा है) के रूप में एन्क्रिप्ट किया जाना आवश्यक है।के लिए HIPAA अनुपालन

प्रारंभिक समस्या

पहली समस्या से निपटने के लिए हम एक तरह से डेटा एक भंग की स्थिति में सुरक्षित बनाता है कि में डेटा एन्क्रिप्ट दो तरह का सबसे अच्छा तरीका निर्धारित करने गया था।

प्रारंभिक समाधान

तेज समाधान हम साथ आया mcrypt उपयोग करने के लिए डेटा इससे पहले कि हम यह डेटाबेस में डाला एन्क्रिप्ट करने के लिए किया गया था।

नई समस्या

आवेदन हम विकसित कर रहे हैं, (के रूप में वेब अनुप्रयोगों जाना) काफी पुराना है और प्रक्रियात्मक प्रोग्रामिंग का एक बहुत डालने के लिए, अद्यतन, पुनः प्राप्त mysql_query समारोह पर भारी निर्भरता के साथ ही उपयोग करता है और डेटा हटाएं हमारे पास डेटाबेस-एब्स्ट्रक्शन-लेयर पर हमारे कोड का अनुवाद करने का समय या विलासिता नहीं है। इसलिए, इस एन्क्रिप्शन/डिक्रिप्शन सिस्टम को लागू करने का एकमात्र तरीका mcrypt के माध्यम से एन्क्रिप्ट किए गए डेटा का उपयोग करने के लिए सभी सीआरयूडी क्वेरी मैन्युअल रूप से संपादित करना है। यह बहुत अक्षम और अत्यंत त्रुटि-प्रवण है।

हमारे प्रस्तावित समाधान

हमने निर्णय लिया है कि हमारे समस्या को हल करने का सबसे तेज और सबसे प्रभावी तरीका है हमारे खुद के तैयार करने से एक के साथ देशी mysql_query समारोह अधिलेखित करने के लिए है। हमारे नए फ़ंक्शन में, हम सर्वर को क्वेरी भेजने/परिणामसेट लौटने से पहले डेटा मानों को एन्क्रिप्ट/डिक्रिप्ट करेंगे।

आप लोगों

  1. में कहाँ आ यह हमारी प्रारंभिक समस्या को हल करने के लिए सबसे अच्छा समाधान है?
  2. आप मौजूदा, कोर PHP फ़ंक्शन को ओवरराइट करने के बारे में कैसे जाते हैं?
+0

तो समस्या, जबकि यह DB सर्वर पर स्थानांतरित किया गया है डेटा एन्क्रिप्ट करने के लिए है? या इसे एन्क्रिप्टेड फैशन में स्टोर करें? –

+0

इसे एन्क्रिप्टेड फैशन में संग्रहीत करने के लिए और फिर आसानी से पुनर्प्राप्त करें, डिक्रिप्ट करें और इसे आवश्यकतानुसार प्रदर्शित करें। –

+0

मुझे लगता है कि आप गलत परत पर ऐसा कर रहे हैं। क्या आपने पूरे MySQL डेटाबेस को एन्क्रिप्ट करने पर विचार किया था? इसके लिए कुछ समाधानों पर चर्चा की गई है [इस सवाल] (http://stackoverflow.com/questions/143750/mysql-and-data-file-encryption)। –

उत्तर

3

यद्यपि आप पहले कहा गया है आप/एक डेटाबेस अमूर्त परत में अपने कोड का अनुवाद नहीं करेगा, मैं विश्वास नहीं कर सकता कि आदर्श समाधान होगा। निश्चित रूप से, यह अभी बहुत अधिक काम है, लेकिन यह भुगतान करता है। आपने जो प्रस्ताव दिया है वह हैक है, जो भविष्य में त्रुटियों और सिरदर्द का कारण बन सकता है (और शायद होगा)।

अगली सबसे अच्छी बात यह है कि टिप्पणियों में प्रस्तावित संपूर्ण डेटाबेस को एन्क्रिप्ट करना होगा। वहाँ समाधान, विभिन्न स्तरों में पारदर्शी एन्क्रिप्शन के लिए वहाँ बाहर हैं अर्थात्: this या this

एक और बात आप में देखना चाहते हो सकता है MySQL के देशी encryption and decryption काम करता है, जो स्तंभ स्तर एन्क्रिप्शन लागू करने के लिए यदि आप चिंतित हैं, इस्तेमाल किया जा सकता है प्रदर्शन के बारे में।

+0

@ एयरक्यूल ठीक है, उस तरह का हल एक मुद्दा हल करता है: डीबी में जाने पर डेटा को एन्क्रिप्ट करना। हम ट्रिगर्स को डालने या अपडेट करने से पहले डेटा एन्क्रिप्ट करने के लिए उपयोग कर सकते हैं। हालांकि, डेटा पुनर्प्राप्ति के बारे में क्या? –

+0

@ लेवी क्या आप इसे पुनर्प्राप्ति पर डिक्रिप्ट नहीं कर सकते? – quantumSoup

+0

@ एयरक्यूल, हाँ हम कर सकते हैं लेकिन हमें प्रत्येक क्वेरी के लिए डेटा प्रिंट करने से पहले मैन्युअल रूप से हमारे डिक्रिप्शन फ़ंक्शन को कॉल करना होगा और हजारों हार्ड-कोड किए गए प्रश्न हैं। –

0

आप फ़ाइल सिस्टम स्तर पर एन्क्रिप्ट कर सकते हैं, और ओएस को इसे संभालने दें। यदि आप PHP स्तर पर इसे संभालना चाहते हैं, तो विस्तारित करें, ओवरराइट न करें।

function mysqle_query() { 
    // Do some stuff 
    // like replace fieldnames with AES_ENCRYPT(fieldname) on insert and delete 
    // and replace fieldnames with AES_DECRYPT(fieldname) on select 
    mysql_query(); 
} 
2

सबसे अच्छा समाधान अमूर्त परत होगा जबकि कि अन्य उत्तर का सुझाव दिया है, तो आप PECL Runkit extension

कुछ तरह के साथ अपने स्वयं के संस्करणों के साथ मौजूदा पीएचपी कार्यों ओवरराइड कर सकते हैं:

runkit_function_rename ('mysql_query', 'mysql_query_old'); 
function mysql_query ($query , $link_identifier=null) { 
    // modify $query here for UPDATE/DELETE statement and any WHERE clause, etc 
    $newQuery = modifyQuery($query); 

    if (is_null($link_identifier)) { 
     $result = mysql_query_old ($newQuery); 
    } else { 
     $result = mysql_query_old ($newQuery, $link_identifier); 
    } 
    // modify $result here for returned data from any SELECT statement 
    return modifyResult($result); 
} 

नोट: डिफ़ॉल्ट रूप से, केवल यूज़रस्पेस काम करता है, हटाया जा सकता है नाम दिया गया, या संशोधित। आदेश आंतरिक कार्यों को ओवरराइड करने के लिए आपको runkit.internal_override php.ini में सेटिंग सक्षम होना चाहिए।

यह कोई समाधान नहीं है जिसे मैं वास्तव में अनुशंसा करता हूं। मुझे जावा में कुछ साल पहले ऐसा कुछ करना पड़ा, जहां जेडीबीसी का विस्तार करना कहीं आसान था; लेकिन एसक्यूएल प्रश्नों के सिंटैक्स को पार्स करना काफी मुश्किल है, लेकिन यदि आपके प्रश्न बाध्य चर का उपयोग कर रहे हैं तो यह कठिन हो जाता है। बच निकलने के लिए बाहर देखो! Mysql_db_query जैसे संबंधित फ़ंक्शन के किसी भी उपयोग के लिए देखें, बस अगर वे एप्लिकेशन के भीतर mysql_query के साथ उपयोग किए जाते हैं! अस्थिर टाइपिंग के लिए

क्षमा याचना। मेरी पत्नी कई बार हमारे रूटर उछल गया है, जबकि I'be इस सुझाव

+0

आपके राउटर को आपके कीबोर्ड से क्या करना है? – blockhead

+0

हर बार जब वह ऐसा करती है, तो यह मुझे झटके देती है –

1

लिख रहा मैं इस स्वचालित रूप से निपटने MySQL proxy

पर गौर और उस के माध्यम से एन्क्रिप्शन लागू करने के लिए किया जाएगा करने का एक तरीका है। मैं से 2 या तो साल पहले इसके साथ चारों ओर खेला जब यह एक बहुत ही प्रारंभिक अवस्था में था, और मैं क्या याद यह मूल रूप से अनुरोधों को रोक सकता है और उनके साथ 'सामान' होते हैं :) कोई कोड परिवर्तन अनिवार्य रूप से की आवश्यकता है। उम्मीद है कि यह मदद करता है।

1

व्यावसायिक रूप से उपलब्ध समाधान बाकी एन्क्रिप्शन पर डेटा के साथ मदद करने के लिए कर रहे हैं। आप या तो गैज़ांग या पैकेट जनरल देख सकते हैं। एचआईपीपीए अनुपालन में मदद करने के लिए दोनों MySQL एन्क्रिप्शन प्रदान करते हैं। गुड लक

0

मैं वास्तव में आप गलत नजरिए से इस पर देख रहे हैं लगता है। जब आप इसे स्टोर और डेटाबेस से पुनर्प्राप्त करते हैं तो डेटा को एन्क्रिप्ट/डिक्रिप्ट करने के माध्यम से डेवलपर्स द्वारा हल करने की कोई समस्या नहीं है - एक बुनियादी ढांचा समाधान का उपयोग करें।

हार्डवेयर या सॉफ़्टवेयर पूर्ण डिस्क एन्क्रिप्शन पर विचार करें, आरडीबीएमएस के पारदर्शी डेटा एन्क्रिप्शन फ़ंक्शन (यदि विशेष आरडीबीएमएस में एक है) के माध्यम से डेटाबेस के एन्क्रिप्शन पर विचार करें, या ओएस के माध्यम से।

देखें this document from NIST

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