\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 प्रदाता, या पहले से डिज़ाइन और काम कर रहे कुछ अन्य बाहरी सिस्टम के खिलाफ प्रमाणित करें।
साधन
और बहुत अधिक।