পোস্টগ্রিএসকিউএল-তে কীভাবে এসিস-এনক্রিপশন ব্যবহার করবেন?


15

আমি নিম্নলিখিত বিবৃতি ব্যবহার করে এস-এনক্রিপশন চেষ্টা করেছি:

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

যা কাজ করেছে, তবে আমি মানটি ডিক্রিপ্ট করতে সক্ষম নই। আমি এটিকে ডেটাটাইপ বাইটিয়ার একটি ক্ষেত্রের মধ্যে sertedোকালাম তবে আমি নিশ্চিত নই যে এটি সঠিক উপায় ছিল কিনা।

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

আমাকে ত্রুটি দেয়

ত্রুটি: ফাংশন ডিক্রিপ্ট (বাইটিয়া, অজানা, অজানা) অস্তিত্ব নেই
লাইন 1: ডিক্রিপ্ট নির্বাচন করুন (পিডাব্লু, 'কী', 'এস') ট্যাবলেট যেখানে আইডি = 7 থেকে; ^
ইঙ্গিত: কোন ফাংশন প্রদত্ত নাম এবং আর্গুমেন্ট প্রকার সাথে মেলে। আপনার স্পষ্টত ধরণের ক্যাসেট যুক্ত করার প্রয়োজন হতে পারে।

এর সত্যই কি এর অর্থ হ'ল এনক্রিপ্ট () একটি বিদ্যমান ফাংশন, তবে ডিক্রিপ্ট নয় ()? আমি কীভাবে এএস-এনক্রিপ্ট করা মানগুলি পুনরুদ্ধার করতে পারি?

উত্তর:


16

\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, কিন্তু এটি শুধু দেখাতে হবে যে এটা ভাল যদি না জানেন আপনার অ্যাপ শুধু কি কখনো এটা অ্যাক্সেস করছে ডিবি থেকে আপনার কী পাঠাতে নাও হতে পারে চলে যায়। তারপরেও, আমি পছন্দ করি না।

যদি এটির পাসওয়ার্ড থাকে তবে এগুলি কি আদৌ সংরক্ষণ করা উচিত?

তদ্ব্যতীত, আপনি যদি পাসওয়ার্ডগুলি সংরক্ষণ করছেন, তাদের দ্বি-মুখী এনক্রিপ্ট করবেন না; যদি সম্ভব সমস্ত লবণের পাসওয়ার্ডগুলি থাকে তবে সেগুলি হ্যাশ করে ফলাফলটি সংরক্ষণ করুন । আপনার সাধারণত পাসওয়ার্ড ক্লিয়ারটেক্সট পুনরুদ্ধার করতে সক্ষম হওয়ার প্রয়োজন হবে না, কেবল নিশ্চিত করুন যে সঞ্চিত হ্যাশ একই লবণের সাথে হ্যাশ করলে ব্যবহারকারী আপনাকে লগ ইন করতে যে পাসওয়ার্ডটির সাথে মেলে তার সাথে এটি মেলে।

যদি এটি লেখক হয় তবে অন্য কারও কাছে এটি করতে দিন

আরও ভাল, পাসওয়ার্ডটি একেবারেই সংরক্ষণ করবেন না, এলডিএপি, এসএএসএল, অ্যাক্টিভ ডিরেক্টরি, কোনও ওআউথ বা ওপেনআইডি সরবরাহকারী, বা ইতিমধ্যে নকশা করা এবং কাজ করা এমন কোনও বাহ্যিক সিস্টেমের বিরুদ্ধে প্রমাণীকরণ করুন।

সম্পদ

এবং আরো অনেক কিছু.


এটি আমি দেখানোর চেয়ে বেশি নয়, এবং আমি নতুন ফাংশনগুলি সংজ্ঞায়িত করিনি, এটি একটি নতুন ইনস্টল করা পোস্টগ্র্যাসকিএল। এটি বেশ বিরক্তিকর যে আপনার নমুনা এবং আমি পোস্ট করা প্রথম নির্বাচন-বিবৃতিটিও ইতিমধ্যে কাজ করবে না, উপরের পোস্টের মতো একই ত্রুটি ফিরে আসবে। কোথাও কিছু ভুল হয়ে গেছে ... আপনার উত্তরের জন্য যাইহোক ধন্যবাদ।
32bitfloat

একটি নতুন CREATEডি ডাটাবেস থেকে চেষ্টা করুন template0; যেমন CREATE DATABASE testdb TEMPLATE template0তারপর CREATE EXTENSION pgcrypto;এবং পরীক্ষা। টেমপ্লেট 1 এ অদ্ভুত কিছু আছে কিনা তা দেখুন।
ক্রেগ রিঞ্জার

ডিবিতে দ্বি-মুখী ডিক্রিপশন সম্পর্কিত একটি নোট। আমি মনে করি না এটি সর্বদা ভুল দিক কিন্তু এটি জটিলতা যুক্ত করে এবং যে কোনও জায়গায় আপনি এটি মোকাবেলা করার জন্য আপনাকে কী পরিচালনার সাথে সত্যই মোকাবিলা করতে হবে যা ডিবিতে আরও জটিল হতে পারে।
ক্রিস ট্র্যাভারস

এছাড়াও আপনার 100% সেকেন্ডের ধারণাটি আপনার পাসওয়ার্ডগুলি ডিক্রিপ্ট করতে হবে না এবং আরও বেশি লোক দ্বারা রক্ষণাবেক্ষণ করা একটি সিস্টেমে হুক করা সাধারণত সুরক্ষার ভিত্তিতে গুরুত্বপূর্ণ।
ক্রিস ট্র্যাভারস

3
"ওহোগা! আওগাগা!" এর জন্য +1
জেরোমি ফ্রেঞ্চ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.