\df *cryptপিএসকিএলে pgcrypto encryptএবং decryptফাংশনগুলির ( যেমন PgCrypto ডক্স হিসাবে ) আর্গুমেন্টের ধরণগুলি প্রকাশ করে :
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তিনটি যুক্তি দিয়ে নামকরণ করা অন্য ফাংশন আছে ?
এটি একটি পরিষ্কার পিজ 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! কী এক্সপোজার ঝুঁকি, চূড়ান্ত প্রশাসনের সাবধানতা প্রয়োজন!
বিটিডাব্লু, দয়া করে PgCrypto সঠিক পছন্দ কিনা তা সম্পর্কে সাবধানতার সাথে ভাবুন। আপনার প্রশ্নের কীগুলি প্রকাশিত হতে পারে pg_stat_activityএবং সিস্টেমটি লগ ইন করে log_statementবা ক্রিপ্টো বিবৃতিগুলির মাধ্যমে বা ত্রুটিযুক্ত হয়ে ব্যর্থ হয়। আইএমও অ্যাপ্লিকেশনটিতে ক্রাইপ্টো করা প্রায়শই ভাল ।
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সম্ভব .. দুটি সেশন খুলুন এবং:
- S1:
BEGIN;
- S1:
LOCK TABLE demo;
- আছে S2:
select decrypt(pw, 'key', 'aes') from demo;
- S1:
select * from pg_stat_activity where current_query ILIKE '%decrypt%' AND procpid <> pg_backend_pid();
উপস! আবার চাবি যায়। এটি LOCK TABLEএকটি অবাঞ্ছিত আক্রমণকারী দ্বারা ছাড়া পুনরুত্পাদন করা যেতে পারে , এটি সঠিকভাবে সময় দেওয়া ঠিক আরও শক্ত। মাধ্যমে আক্রমণ pg_stat_activityকরার অ্যাক্সেস প্রত্যাহার করার দ্বারা এড়ানো যায় pg_stat_activityথেকে public, কিন্তু এটি শুধু দেখাতে হবে যে এটা ভাল যদি না জানেন আপনার অ্যাপ শুধু কি কখনো এটা অ্যাক্সেস করছে ডিবি থেকে আপনার কী পাঠাতে নাও হতে পারে চলে যায়। তারপরেও, আমি পছন্দ করি না।
যদি এটির পাসওয়ার্ড থাকে তবে এগুলি কি আদৌ সংরক্ষণ করা উচিত?
তদ্ব্যতীত, আপনি যদি পাসওয়ার্ডগুলি সংরক্ষণ করছেন, তাদের দ্বি-মুখী এনক্রিপ্ট করবেন না; যদি সম্ভব সমস্ত লবণের পাসওয়ার্ডগুলি থাকে তবে সেগুলি হ্যাশ করে ফলাফলটি সংরক্ষণ করুন । আপনার সাধারণত পাসওয়ার্ড ক্লিয়ারটেক্সট পুনরুদ্ধার করতে সক্ষম হওয়ার প্রয়োজন হবে না, কেবল নিশ্চিত করুন যে সঞ্চিত হ্যাশ একই লবণের সাথে হ্যাশ করলে ব্যবহারকারী আপনাকে লগ ইন করতে যে পাসওয়ার্ডটির সাথে মেলে তার সাথে এটি মেলে।
যদি এটি লেখক হয় তবে অন্য কারও কাছে এটি করতে দিন
আরও ভাল, পাসওয়ার্ডটি একেবারেই সংরক্ষণ করবেন না, এলডিএপি, এসএএসএল, অ্যাক্টিভ ডিরেক্টরি, কোনও ওআউথ বা ওপেনআইডি সরবরাহকারী, বা ইতিমধ্যে নকশা করা এবং কাজ করা এমন কোনও বাহ্যিক সিস্টেমের বিরুদ্ধে প্রমাণীকরণ করুন।
সম্পদ
এবং আরো অনেক কিছু.