PostgreSQL में anes-एन्क्रिप्शन का उपयोग कैसे करें?


15

मैंने निम्नलिखित कथन का उपयोग करके ऐस-एन्क्रिप्शन की कोशिश की:

SELECT encrypt('test', 'key', 'aes');

जो काम किया है, लेकिन मैं मूल्य को डिक्रिप्ट नहीं कर पा रहा हूं। मैंने इसे डेटाटाइप बाइट के क्षेत्र में सम्मिलित किया, लेकिन मुझे यकीन नहीं है कि यह सही तरीका था।

SELECT decrypt(pw, 'key', 'aes') FROM table WHERE ID = 1;

मुझे त्रुटि देता है

त्रुटि: फ़ंक्शन डिक्रिप्ट (ब्युटी, अनजान, अनजान) में मौजूद नहीं है
LINE 1: सेलेक्ट डिक्रिप्ट (pw, 'key', 'anes') से tabelle WHERE ID = 7; ^
सुझाव: कोई फ़ंक्शन दिए गए नाम और तर्क प्रकारों से मेल नहीं खाता है। आपको स्पष्ट प्रकार की जातियों को जोड़ने की आवश्यकता हो सकती है।

क्या इसका वास्तव में मतलब है कि एन्क्रिप्ट () एक मौजूदा फ़ंक्शन है, लेकिन डिक्रिप्ट () नहीं है? मैं एईएस-एनक्रिप्टेड मूल्यों को कैसे पुनः प्राप्त कर सकता हूं?

जवाबों:


16

\df *cryptpsql में pgcrypto encryptऔर decryptफ़ंक्शन के तर्क प्रकारों का पता चलता है ( जैसा कि PgCrypto docs करते हैं ):

                                List of functions
 Schema |      Name       | Result data type |   Argument data types    |  Type  
--------+-----------------+------------------+--------------------------+--------
 ...
 public | decrypt         | bytea            | bytea, bytea, text       | normal
 public | encrypt         | bytea            | bytea, bytea, text       | normal
 ...

इसलिए दोनों कार्य encryptऔर decryptकार्य कुंजी होने की उम्मीद करते हैं bytea। त्रुटि संदेश के अनुसार, "आपको स्पष्ट प्रकार की जातियों को जोड़ने की आवश्यकता हो सकती है"।

हालाँकि, यह Pg 9.1 पर यहाँ ठीक काम करता है, इसलिए मुझे संदेह है कि आपके द्वारा दिखाए जाने की तुलना में यह अधिक है। शायद आपके पास एक अन्य फ़ंक्शन भी है जिसका नाम encryptतीन तर्कों के साथ है?

यहां बताया गया है कि यह स्वच्छ Pg 9.1 पर कैसे काम करता है:

regress=# create table demo(pw bytea);
CREATE TABLE
regress=# insert into demo(pw) values ( encrypt( 'data', 'key', 'aes') );
INSERT 0 1
regress=# select decrypt(pw, 'key', 'aes') FROM demo;
  decrypt   
------------
 \x64617461
(1 row)

regress=# select convert_from(decrypt(pw, 'key', 'aes'), 'utf-8') FROM demo;
 convert_from 
--------------
 data
(1 row)

Awooga! Awooga! मुख्य जोखिम जोखिम, अत्यधिक व्यवस्थापक सावधानी की आवश्यकता!

BTW, कृपया ध्यान से सोचें कि क्या PgCrypto वास्तव में सही विकल्प है। आपके प्रश्नों की कुंजियों को प्रकट किया जा सकता है pg_stat_activityऔर सिस्टम log_statementएक त्रुटि के साथ विफल होने वाले क्रिप्टो बयानों के माध्यम से या उसके माध्यम से लॉग करता है । IMO एप्लिकेशन में क्रिप्टो करना अक्सर बेहतर होता है

इस सत्र के साक्षी, client_min_messagesसक्षम होने के साथ आप देख सकते हैं कि लॉग में क्या दिखाई देगा:

regress# SET client_min_messages = 'DEBUG'; SET log_statement = 'all'; 
regress=# select decrypt(pw, 'key', 'aes') from demo;
LOG:  statement: select decrypt(pw, 'key', 'aes') from demo;
LOG:  duration: 0.710 ms
  decrypt   
------------
 \x64617461
(1 row)

वूप्स, कुंजी संभवतः लॉग में उजागर होती है यदि log_min_messagesकम पर्याप्त है। यह अब एन्क्रिप्टेड डेटा के साथ सर्वर के स्टोरेज पर है। असफल। log_statementयदि कोई त्रुटि होती है तो बिना समस्या लॉग किए या संभवत: auto_explainसक्षम होने पर समान समस्या ।

के माध्यम से एक्सपोज़र pg_stat_activityभी संभव है .. दो सत्र खोलें, और:

  • एस 1: BEGIN;
  • एस 1: LOCK TABLE demo;
  • S2: select decrypt(pw, 'key', 'aes') from demo;
  • एस 1: select * from pg_stat_activity where current_query ILIKE '%decrypt%' AND procpid <> pg_backend_pid();

ओह! वहां फिर से चाबी जाती है। यह LOCK TABLEएक अप्रकाशित हमलावर द्वारा बिना पुन: पेश किया जा सकता है , यह सही समय पर करना कठिन है। के माध्यम से हमले का pg_stat_activityउपयोग करने pg_stat_activityसे बचने से बचा जा सकता है public, लेकिन यह सिर्फ यह दिखाने के लिए जाता है कि डीबी को अपनी कुंजी भेजना सबसे अच्छा नहीं हो सकता है जब तक कि आपको पता न हो कि आपका ऐप एकमात्र ऐसी चीज़ है जो कभी भी इसे एक्सेस कर रही है। फिर भी, मुझे पसंद नहीं है।

अगर यह पासवर्ड है, तो क्या आपको उन्हें स्टोर करना चाहिए?

इसके अलावा, यदि आप पासवर्ड स्टोर कर रहे हैं, तो उन्हें दो-तरफ़ा एन्क्रिप्ट न करें; यदि सभी संभावित नमक पासवर्ड हैं तो उन्हें हैश करें और परिणाम को स्टोर करें । आपको आमतौर पर पासवर्ड क्लीयरटेक्स को पुनर्प्राप्त करने में सक्षम होने की आवश्यकता नहीं है, केवल पुष्टि करें कि संग्रहीत हैश उस पासवर्ड से मेल खाता है जिसे उपयोगकर्ता आपको उसी नमक के साथ हैशेड में लॉग इन करने के लिए भेजता है।

यदि यह सामान्य है, तो किसी और को आपके लिए करने दें

और भी बेहतर, पासवर्ड को बिल्कुल भी स्टोर न करें, LDAP, SASL, एक्टिव डायरेक्टरी, OAuth या OpenID प्रदाता, या पहले से डिज़ाइन और काम कर रहे कुछ अन्य बाहरी सिस्टम के खिलाफ प्रमाणित करें।

साधन

और बहुत अधिक।


यह मेरे दिखाए गए से अधिक नहीं है, और मैंने नए कार्यों को परिभाषित नहीं किया है, एक नया स्थापित पोस्टग्रैक्स्ल। यह काफी परेशान करने वाला है कि आपका नमूना और मैंने जो पहला चयन-कथन पोस्ट किया है, वह भी इस बीच काम नहीं कर रहा है, जैसा कि ऊपर पोस्ट किया गया है, उसी त्रुटि को वापस लौटाता है। कहीं कुछ गलत हो गया ... किसी भी तरह से आपके उत्तर के लिए धन्यवाद।
32bitfloat

CREATEसे नए डी डेटाबेस पर प्रयास करें template0; जैसे CREATE DATABASE testdb TEMPLATE template0तब CREATE EXTENSION pgcrypto;और परीक्षण। देखें कि क्या खाका 1 में कुछ गड़बड़ है।
क्रेग रिंगर

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

इसके अलावा 100% दूसरी धारणा है कि आपको कभी भी पासवर्ड को डिक्रिप्ट नहीं करना चाहिए और अधिक लोगों द्वारा बनाए गए सिस्टम में हुक करना आमतौर पर एक महत्वपूर्ण जीत सुरक्षा-वार है।
क्रिस ट्रैवर्स

3
"Awooga! Awooga!" के लिए lol, +1
जेरॉमी फ्रेंच
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.