পিএইচপিতে এনক্রিপশন। পিএইচপি এনক্রিপশন এবং প্রমাণীকরণ কীগুলিতে একটি কী ব্যবহার করে ডেটা এনক্রিপ্ট, ডিক্রিপ্ট করুন

  • অনুবাদ
  • টিউটোরিয়াল

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

পিএইচপি-তে সিমেট্রিক এনক্রিপশন সহ সাধারণ সমস্যাগুলি কীভাবে এড়ানো যায় সে সম্পর্কে এটি একটি দ্রুত নির্দেশিকা।

সার্ভারের দিকে ডেটা প্রক্রিয়া করা হলে আমরা বিবেচনা করব (বিশেষত, সার্ভারে এনক্রিপশন ঘটে এবং ডেটা গ্রহণ করা যেতে পারে, উদাহরণস্বরূপ, পরিষ্কার পাঠ্য, পাসওয়ার্ড ইত্যাদি আকারে ক্লায়েন্টের কাছ থেকে) যা পিএইচপি অ্যাপ্লিকেশনের জন্য একটি সাধারণ ক্ষেত্রে।

এই নির্দেশিকাতে থাকা তথ্যগুলি এনক্রিপ্ট করা নেটওয়ার্ক সংযোগগুলি তৈরি করতে ব্যবহার করা উচিত নয় যাতে আরও জটিল প্রয়োজনীয়তা রয়েছে৷ এই ধরনের ক্ষেত্রে, আপনি spied বা TLS ব্যবহার করতে হবে।

স্বাভাবিকভাবেই, এখানে প্রদত্ত সুপারিশগুলি পিএইচপি-তে এনক্রিপশন সংগঠিত করার "একমাত্র সম্ভাব্য উপায়" নয়। এই গাইডের উদ্দেশ্য হল ভুল এবং কঠিন, অস্পষ্ট সিদ্ধান্তের জন্য কম জায়গা ছেড়ে দেওয়ার চেষ্টা করা।

পিএইচপিতে এনক্রিপশন ফাংশন

Mcrypt বা OpenSSL এক্সটেনশন ব্যবহার করুন।

এনক্রিপশন অ্যালগরিদম এবং এর অপারেশন মোড, ওয়ান-টাইম কোড (ইনিশিয়ালাইজেশন ভেক্টর)

এলোমেলো এক-বারের কোড সহ CTR মোডে AES-256 ব্যবহার করুন ( প্রায়. অনুবাদ: nonce) AES একটি স্ট্যান্ডার্ড, তাই আপনি যেকোনো এক্সটেনশনের ফাংশন ব্যবহার করতে পারেন - Mcrypt বা OpenSSL।

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

ওয়ান-টাইম কোডটি অবশ্যই 128 বিট (16 বাইট) দীর্ঘ হতে হবে, কোনো এনকোডিং ছাড়াই বাইটের একটি স্ট্রিং।

ম্যাক্রিপ্ট এক্সটেনশনে, AES Rijndael-128 নামে পরিচিত ( প্রায়. অনুবাদ: আমরা AES-256 সম্পর্কে কথা বলা সত্ত্বেও, এটি একটি ত্রুটি নয়। AES-256 != Rijndael-256) OpenSSL-এ, যথাক্রমে, AES-256-CTR।

ম্যাক্রিপ্ট ব্যবহারের উদাহরণ:
OpenSSL উদাহরণ:
পরীক্ষা ভেক্টর ব্যবহার করে এনক্রিপশন সঠিকভাবে কাজ করছে কিনা যাচাই করুন ( প্রায়. অনুবাদ: AES-256-CTR-এর জন্য 57 পৃষ্ঠায় অনুচ্ছেদ F.5.5 দেখুন).

CTR মোডের জন্য, এনক্রিপ্ট করা ডেটার মোট ভলিউমের উপর কিছু সীমাবদ্ধতা রয়েছে। আপনি অনুশীলনে এটির সম্মুখীন নাও হতে পারেন, তবে মনে রাখবেন যে আপনি একটি কী দিয়ে 2^64 বাইটের বেশি ডেটা এনক্রিপ্ট করবেন না, তা নির্বিশেষে এটি একটি দীর্ঘ বার্তা বা অনেকগুলি সংক্ষিপ্ত।

CTR মোড শুধুমাত্র তখনই স্থিতিশীল থাকে যদি আপনি একই কী দিয়ে একই ওয়ান-টাইম কোড ব্যবহার না করেন। এই কারণে, এলোমেলোতার একটি ক্রিপ্টোগ্রাফিকভাবে শক্তিশালী উত্স ব্যবহার করে এক-কালীন কোড তৈরি করা গুরুত্বপূর্ণ। উপরন্তু, এর মানে হল যে আপনি একটি একক কী দিয়ে 2^64টির বেশি বার্তা এনক্রিপ্ট করবেন না। যেহেতু ওয়ান-টাইম কোডের দৈর্ঘ্য 128 বিট, তাই জন্মদিনের প্যারাডক্সের কারণে 2^128/2 বার্তার সংখ্যা (এবং তাদের সংশ্লিষ্ট ওয়ান-টাইম কোড) সীমাটি গুরুত্বপূর্ণ। প্রায়. অনুবাদ:).

এবং মনে রাখবেন যে এনক্রিপশন আপনি কতটা ডেটা পাঠাচ্ছেন তা লুকিয়ে রাখবে না। একটি চরম ক্ষেত্রে উদাহরণ হিসাবে, আপনি যদি শুধুমাত্র "হ্যাঁ" বা "না" সম্বলিত বার্তাগুলিকে এনক্রিপ্ট করেন, স্পষ্টতই এনক্রিপশন সেই তথ্যটি লুকাবে না৷

ডেটা প্রমাণীকরণ

সর্বদা তথ্যের সত্যতা এবং অখণ্ডতা পরীক্ষা করুন।
এটি করতে, এনক্রিপশনের পরে MAC ব্যবহার করুন। সেগুলো. প্রথমে ডেটা এনক্রিপ্ট করা হয়, এবং তারপরে HMAC-SHA-256 সিফারটেক্সট থেকে নেওয়া হয়, যার মধ্যে সাইফারটেক্সট নিজেই এবং এককালীন কোড রয়েছে।

ডিক্রিপ্ট করার সময়, টাইমিং অ্যাটাক প্রতিরোধী এমন একটি তুলনা অ্যালগরিদম ব্যবহার করে প্রথমে HMAC চেক করুন। == বা === তুলনা অপারেটর ব্যবহার করে সরাসরি $user_submitted_mac এবং $calculated_mac তুলনা করবেন না। "HMAC ডাবল চেক" ব্যবহার করা আরও ভাল।

HMAC চেক সফল হলে, ডিক্রিপশন নিরাপদে করা যেতে পারে। HMAC উপযুক্ত না হলে অবিলম্বে বন্ধ করুন।

এনক্রিপশন এবং প্রমাণীকরণ কী

আদর্শভাবে, এলোমেলোতার একটি ক্রিপ্টোগ্রাফিকভাবে শক্তিশালী উত্স থেকে প্রাপ্ত কীগুলি ব্যবহার করুন। AES-256-এর জন্য 32 বাইট র্যান্ডম ডেটা প্রয়োজন (একটি "কাঁচা" স্ট্রিং - কোনো এনকোডিং ব্যবহার না করেই বিটের একটি ক্রম)।

যদি অ্যাপ্লিকেশনটি 5.5 এর নীচের পিএইচপি সংস্করণের অধীনে চলছে, যার মধ্যে PBKDF2 এর অন্তর্নির্মিত বাস্তবায়ন নেই, তাহলে আপনাকে পিএইচপি-তে আপনার নিজস্ব বাস্তবায়ন ব্যবহার করতে হবে, যার একটি উদাহরণ এখানে পাওয়া যাবে: https://defuse. ca/php-pbkdf2.htm. সচেতন থাকুন যে আপনার নিজস্ব বাস্তবায়নের উপর নির্ভর করলে বিল্ট-ইন hash_pbkdf2() ফাংশনের মতো কী সঠিকভাবে সমাধান নাও হতে পারে।

এনক্রিপশন এবং প্রমাণীকরণের জন্য একই কী ব্যবহার করবেন না। উপরে উল্লিখিত হিসাবে, এনক্রিপশন কী এর জন্য 32 বাইট এবং প্রমাণীকরণ কী (HMAC) এর জন্য 32 বাইট প্রয়োজন৷ PBKDF2 এর মাধ্যমে আপনি পাসওয়ার্ড থেকে 64 বাইট নিতে পারেন এবং বলুন, প্রথম 32 বাইট এনক্রিপশন কী হিসেবে এবং বাকি 32 বাইট প্রমাণীকরণ কী-এর জন্য ব্যবহার করতে পারেন।

যদি আপনার পাসওয়ার্ডগুলি একটি ফাইলে সংরক্ষণ করা হয়, উদাহরণস্বরূপ, একটি HEX স্ট্রিং হিসাবে, সেগুলিকে এনক্রিপশন ফাংশনে খাওয়ানোর আগে পুনরায় এনকোড করবেন না৷ পরিবর্তে, HEX-এনকোডেড কীগুলিকে সরাসরি একটি উচ্চ-মানের এনক্রিপশন বা প্রমাণীকরণ কীতে রূপান্তর করতে PBKDF2 ব্যবহার করুন। অথবা পাসওয়ার্ড হ্যাশ করতে অতিরিক্ত এনকোডিং আউটপুট (মাত্র একটি 32 বাইট স্ট্রিং) ছাড়াই SHA-256 ব্যবহার করুন। নিয়মিত পাসওয়ার্ড হ্যাশিং ব্যবহার করা যথেষ্ট এনট্রপি প্রদান করে। আরো বিস্তারিত নিম্নলিখিত অনুচ্ছেদ প্রদান করা হয়.

কী প্রসারিত

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

PBKDF2-এর একটি প্যারামিটার হল হ্যাশিং পুনরাবৃত্তির সংখ্যা। এবং এটি যত বেশি হবে, আপনি যে কীটির উপর নির্ভর করতে পারেন তার নিরাপত্তা তত বেশি। যদি আপনার কোড একটি 64-বিট প্ল্যাটফর্মে চলছে, তাহলে PBKDF2-এর জন্য হ্যাশিং অ্যালগরিদম হিসেবে SHA-512 ব্যবহার করুন। একটি 32-বিট প্ল্যাটফর্মের জন্য, SHA-256 ব্যবহার করুন।

যাইহোক, একটি DoS আক্রমণের ঝুঁকির কারণে অনলাইন অ্যাপ্লিকেশনগুলিতে তুলনামূলকভাবে উচ্চ সংখ্যক পুনরাবৃত্তি ব্যবহার করা সম্ভব নয়। অতএব, মূল গুণমান অফলাইন অ্যাপ্লিকেশনগুলির মতো উচ্চতর হবে না, যা এই ধরনের ঝুঁকি ছাড়াই প্রচুর পরিমাণে পুনরাবৃত্তি করতে পারে। একটি নিয়ম হিসাবে, অনলাইন অ্যাপ্লিকেশনগুলির জন্য, এই জাতীয় অনেকগুলি হ্যাশিং পুনরাবৃত্তি নির্বাচন করা হয় যাতে PBKDF2 100 ms এর বেশি না নেয়।

আপনি যদি উচ্চ এনট্রপি পাসওয়ার্ড ব্যবহার করতে পারেন, তাহলে কম এনট্রপি পাসওয়ার্ডের মতো এটি প্রসারিত করার প্রয়োজন নেই। উদাহরণস্বরূপ, আপনি যদি /dev/urandom ব্যবহার করে একটি "এনক্রিপশন_মাস্টার_কি" এবং একটি "auth_master_key" তৈরি করেন, তাহলে PBKDF2 এর কোনো প্রয়োজন নেই। কোন এনকোডিং ছাড়াই বিটের ক্রম হিসাবে কীগুলি ব্যবহার করতে ভুলবেন না।

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

কী স্টোরেজ এবং ব্যবস্থাপনা

সর্বোত্তম জিনিস হল একটি আলাদা ডেডিকেটেড কী স্টোরেজ ডিভাইস (HSM) ব্যবহার করা।

যদি এটি সম্ভব না হয়, তাহলে আক্রমণটিকে জটিল করার জন্য, একটি পৃথক অবস্থানে (হোম ডিরেক্টরি বা সাইট রুটের বাইরে) সংরক্ষিত একটি কী ব্যবহার করে কী ফাইল বা কনফিগারেশন ফাইল (যা প্রকৃত এনক্রিপশন/প্রমাণকরণ কীগুলি সংরক্ষণ করে) এর এনক্রিপশন ব্যবহার করতে পারে। . উদাহরণস্বরূপ, আপনি প্রকৃত কী ফাইল ডিক্রিপ্ট করার জন্য প্রয়োজনীয় কী সংরক্ষণ করতে httpd.conf-এ একটি Apache পরিবেশ পরিবর্তনশীল ব্যবহার করতে পারেন:
SetEnv keyfile_key crypto_strong_high_entropy_key # আপনি $_SERVER["keyfile_key"] ব্যবহার করে PHP-তে এই ভেরিয়েবলটি অ্যাক্সেস করতে পারেন # বাকি কনফিগারেশন
এখন, যদি সাইটের মূলে এবং নীচের ফাইলগুলি, কী সহ ফাইলগুলি সহ, আপস করা হয় (উদাহরণস্বরূপ, যদি একটি ব্যাকআপ ফাঁস হয়), এনক্রিপ্ট করা ডেটা নিরাপদ থাকবে কারণ পরিবেশ ভেরিয়েবলে সংরক্ষিত কী আপস করা হয়নি৷ এটা মনে রাখা গুরুত্বপূর্ণ যে httpd.conf ফাইলগুলিকে আলাদাভাবে ব্যাক আপ করা উচিত এবং keyfile_key ভেরিয়েবলের সাথে আপোস করা উচিত নয়, উদাহরণস্বরূপ, phpinfo() এর আউটপুট।

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

তথ্য সংকোচন

সাধারণভাবে, আপনি এটি এনক্রিপ্ট করার আগে উত্স পাঠ্য সংকুচিত করা উচিত নয়। এটি শত্রুকে বিশ্লেষণের জন্য একটি অতিরিক্ত হাতিয়ার দিতে পারে।

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

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

আপনার যদি ডেটা সংকুচিত করার কঠিন প্রয়োজন না থাকে তবে এটি সংকুচিত করবেন না।

সার্ভার পরিবেশ

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

বিভিন্ন কারণ রয়েছে যা শেয়ার্ড সার্ভারকে নিরাপত্তা-সমালোচনামূলক অ্যাপ্লিকেশন হোস্ট করার জন্য একটি সন্দেহজনক জায়গা করে তোলে। উদাহরণস্বরূপ, ভার্চুয়াল সার্ভারগুলির মধ্যে আক্রমণগুলি সম্প্রতি প্রদর্শিত হয়েছে: eprint.iacr.org/2014/248.pdf৷ এটি একটি ভাল অনুস্মারক যে আক্রমণাত্মক কৌশলগুলি অবনমিত হয় না, বরং সময়ের সাথে সাথে সম্মানিত এবং উন্নত হয়। এই ধরনের ক্ষতি সবসময় অ্যাকাউন্টে নেওয়া উচিত।

বিশেষজ্ঞের পরামর্শ

শেষ কিন্তু অন্তত নয়, আপনার নিরাপত্তা কোড পর্যালোচনা করতে একজন বিশেষজ্ঞের সাথে পরামর্শ করুন।

(PHP 4, PHP 5, PHP 7)

ক্রিপ্ট — একমুখী স্ট্রিং হ্যাশিং

সতর্কতা

এই ফাংশনটি (এখনও) বাইনারি নিরাপদ নয়!

বর্ণনা

ক্রিপ্ট (স্ট্রিং $str [, স্ট্রিং $লবণ]): স্ট্রিং

ক্রিপ্ট()স্ট্যান্ডার্ড ইউনিক্স ডিইএস-ভিত্তিক অ্যালগরিদম বা সিস্টেমে উপলব্ধ বিকল্প অ্যালগরিদম ব্যবহার করে একটি হ্যাশড স্ট্রিং ফিরিয়ে দেবে।

লবণ পরামিতি ঐচ্ছিক. যাহোক, ক্রিপ্ট()লবণ ছাড়া একটি দুর্বল হ্যাশ তৈরি করে। PHP 5.6 বা তার পরে এটি ছাড়া একটি E_NOTICE ত্রুটি বাড়ায়। ভাল নিরাপত্তার জন্য যথেষ্ট শক্তিশালী লবণ উল্লেখ করতে ভুলবেন না।

পাসওয়ার্ড_হ্যাশ()একটি শক্তিশালী হ্যাশ ব্যবহার করে, একটি শক্তিশালী লবণ তৈরি করে এবং স্বয়ংক্রিয়ভাবে যথাযথ রাউন্ড প্রয়োগ করে। পাসওয়ার্ড_হ্যাশ()একটি সহজ ক্রিপ্ট()মোড়ক এবং বিদ্যমান পাসওয়ার্ড হ্যাশের সাথে সামঞ্জস্যপূর্ণ। ব্যাবহার পাসওয়ার্ড_হ্যাশ()উত্সাহ দেওয়া হয়.

কিছু অপারেটিং সিস্টেম একাধিক ধরনের হ্যাশ সমর্থন করে। আসলে, কখনও কখনও স্ট্যান্ডার্ড DES-ভিত্তিক অ্যালগরিদম একটি MD5-ভিত্তিক অ্যালগরিদম দ্বারা প্রতিস্থাপিত হয়। হ্যাশ টাইপ লবণ যুক্তি দ্বারা ট্রিগার করা হয়. 5.3-এর আগে, PHP সিস্টেমের ক্রিপ্ট() এর উপর ভিত্তি করে ইনস্টল-টাইমে উপলব্ধ অ্যালগরিদম নির্ধারণ করবে। যদি কোন লবণ প্রদান না করা হয়, তাহলে পিএইচপি স্বয়ংক্রিয়ভাবে একটি স্ট্যান্ডার্ড দুই অক্ষর (ডিইএস) লবণ, বা একটি বারো অক্ষর ( MD5), MD5 crypt() এর উপলব্ধতার উপর নির্ভর করে। PHP নামের একটি ধ্রুবক সেট করে। CRYPT_SALT_LENGTHযা উপলব্ধ হ্যাশ দ্বারা অনুমোদিত দীর্ঘতম বৈধ লবণ নির্দেশ করে।

স্ট্যান্ডার্ড DES-ভিত্তিক ক্রিপ্ট()আউটপুটের প্রথম দুটি অক্ষর হিসাবে লবণ ফেরত দেয়। এটি শুধুমাত্র str এর প্রথম আটটি অক্ষর ব্যবহার করে, তাই একই আটটি অক্ষর দিয়ে শুরু হওয়া দীর্ঘ স্ট্রিংগুলি একই ফলাফল তৈরি করবে (যখন একই লবণ ব্যবহার করা হয়)।

সিস্টেমে যেখানে crypt() ফাংশন একাধিক হ্যাশ প্রকার সমর্থন করে, প্রদত্ত প্রকার উপলব্ধ কিনা তার উপর নির্ভর করে নিম্নলিখিত ধ্রুবকগুলি 0 বা 1 এ সেট করা হয়:

  • CRYPT_STD_DES- "./0-9A-Za-z" বর্ণমালা থেকে দুটি অক্ষরের লবণ সহ স্ট্যান্ডার্ড DES-ভিত্তিক হ্যাশ। লবণে অবৈধ অক্ষর ব্যবহার করলে ক্রিপ্ট() ব্যর্থ হবে।
  • CRYPT_EXT_DES- বর্ধিত DES-ভিত্তিক হ্যাশ। "লবণ" হল একটি 9-অক্ষরের স্ট্রিং যাতে একটি আন্ডারস্কোর থাকে যার পরে 4 বাইট পুনরাবৃত্তি গণনা এবং 4 বাইট লবণ থাকে। এগুলি মুদ্রণযোগ্য অক্ষর হিসাবে এনকোড করা হয়, প্রতি অক্ষরে 6 বিট, প্রথমে অন্তত উল্লেখযোগ্য অক্ষর। 0 থেকে 63 মানগুলি "./0-9A-Za-z" হিসাবে এনকোড করা হয়েছে। লবণে অবৈধ অক্ষর ব্যবহার করলে ক্রিপ্ট() ব্যর্থ হবে।
  • CRYPT_MD5- MD5 হ্যাশিং একটি বারো অক্ষর লবণ সহ $1$ থেকে শুরু
  • CRYPT_BLOWFISH- নিম্নরূপ একটি লবণ দিয়ে ব্লোফিশ হ্যাশিং: "$2a$", "$2x$" বা "$2y$", একটি দুই অঙ্কের খরচ প্যারামিটার, "$", এবং বর্ণমালা থেকে 22টি অক্ষর "./0-9A- Za-z"। লবণে এই পরিসরের বাইরে অক্ষর ব্যবহার করলে ক্রিপ্ট() একটি শূন্য-দৈর্ঘ্যের স্ট্রিং ফিরিয়ে আনবে। দুই অঙ্কের খরচ পরামিতি হল অন্তর্নিহিত ব্লোফিশ-ভিত্তিক হ্যাশিং অ্যালগরিদমিটারের পুনরাবৃত্তি গণনার বেস-2 লগারিদম এবং অবশ্যই 04-31 পরিসরে হতে হবে, এই পরিসরের বাইরের মানগুলি crypt() ব্যর্থ হবে। 5.3.7-এর পূর্বের PHP-এর সংস্করণগুলি শুধুমাত্র লবণের উপসর্গ হিসাবে "$2a$" সমর্থন করে: PHP 5.3.7 ব্লোফিশ বাস্তবায়নে একটি নিরাপত্তা দুর্বলতা দূর করার জন্য নতুন উপসর্গ চালু করেছে। নিরাপত্তা সমাধানের সম্পূর্ণ বিশদ বিবরণের জন্য অনুগ্রহ করে দেখুন, কিন্তু সংক্ষিপ্তভাবে বলতে গেলে, শুধুমাত্র PHP 5.3.7 এবং পরবর্তীতে টার্গেট করা ডেভেলপারদের "$2a$" এর পরিবর্তে "$2y$" ব্যবহার করা উচিত।
  • CRYPT_SHA256- $5$ সহ ষোল অক্ষরের সল্ট সহ SHA-256 হ্যাশ। যদি লবণের স্ট্রিং "বৃত্তাকার = দিয়ে শুরু হয়
  • CRYPT_SHA512- SHA-512 হ্যাশের সাথে ষোল অক্ষরের লবণের উপসর্গ $6$। যদি লবণের স্ট্রিং "বৃত্তাকার = দিয়ে শুরু হয় $", N-এর সাংখ্যিক মানটি নির্দেশ করতে ব্যবহৃত হয় যে হ্যাশিং লুপটি কতবার কার্যকর করা উচিত, অনেকটা ব্লোফিশের খরচ প্যারামিটারের মতো। রাউন্ডের ডিফল্ট সংখ্যা 5000, সর্বনিম্ন 1000 এবং সর্বাধিক 999,999,999। এই সীমার বাইরে N-এর যেকোনো নির্বাচন নিকটতম সীমাতে কাটা হবে।

PHP 5.3.0 অনুযায়ী, PHP এর নিজস্ব বাস্তবায়ন রয়েছে এবং সিস্টেমে এক বা একাধিক অ্যালগরিদমের সমর্থন না থাকলে সেটি ব্যবহার করবে।

পরামিতি

যে স্ট্রিংটি হ্যাশ করতে হবে।

সতর্ক করা

ব্যবহার করে CRYPT_BLOWFISHঅ্যালগরিদম, এর ফলে str প্যারামিটারটি 72 অক্ষরের সর্বোচ্চ দৈর্ঘ্যে কাটা হবে।

হ্যাশিং বেস করার জন্য একটি ঐচ্ছিক লবণ স্ট্রিং। যদি প্রদান না করা হয়, আচরণ অ্যালগরিদম বাস্তবায়ন দ্বারা সংজ্ঞায়িত করা হয় এবং অপ্রত্যাশিত ফলাফল হতে পারে।

রিটার্ন মান

হ্যাশ করা স্ট্রিং বা 13টি অক্ষরের চেয়ে ছোট একটি স্ট্রিং ফেরত দেয় এবং ব্যর্থ হলে লবণ থেকে আলাদা হওয়ার নিশ্চয়তা দেওয়া হয়।

সতর্কতা

পাসওয়ার্ড যাচাই করার সময়, একটি স্ট্রিং তুলনা ফাংশন যা টাইমিং আক্রমণের জন্য ঝুঁকিপূর্ণ নয় এর আউটপুট তুলনা করতে ব্যবহার করা উচিত ক্রিপ্ট()পূর্ব পরিচিত হ্যাশ থেকে. পিএইচপি 5.6 এর পরে প্রদান করে হ্যাশ_সমান()এই উদ্দেশ্যে.

চেঞ্জলগ

সংস্করণ বর্ণনা
5.6.5 যখন ব্যর্থতার স্ট্রিং "*0" লবণ হিসাবে দেওয়া হয়, তখন অন্যান্য ক্রিপ্ট বাস্তবায়নের সাথে সামঞ্জস্যের জন্য "*1" ফেরত দেওয়া হবে। এই সংস্করণের আগে, PHP 5.6 ভুলভাবে একটি DES হ্যাশ ফেরত দেবে।
5.6.0 লবণ বাদ দিলে E_NOTICE নিরাপত্তা সতর্কতা বাড়ান।
5.5.21 যখন ব্যর্থতার স্ট্রিং "*0" লবণ হিসাবে দেওয়া হয়, তখন অন্যান্য ক্রিপ্ট বাস্তবায়নের সাথে সামঞ্জস্যের জন্য "*1" ফেরত দেওয়া হবে। এই সংস্করণের আগে, PHP 5.5 (এবং পূর্ববর্তী শাখাগুলি) ভুলভাবে একটি DES হ্যাশ ফেরত দেবে।
5.3.7 যোগ করা হয়েছে $2x$এবং $2y$সম্ভাব্য হাই-বিট আক্রমণ মোকাবেলা করার জন্য ব্লোফিশ মোড।
5.3.2 Ulrich Drepper's » বাস্তবায়নের উপর ভিত্তি করে SHA-256 এবং SHA-512 ক্রিপ্ট যোগ করা হয়েছে।
5.3.2 ডিইএস-এ ফিরে যাওয়ার পরিবর্তে "ব্যর্থতা" স্ট্রিং ("*0" বা "*1") ফেরাতে অবৈধ রাউন্ডে ব্লোফিশ আচরণ স্থির করা হয়েছে।
5.3.0 পিএইচপি এখন MD5 ক্রিপ্ট, স্ট্যান্ডার্ড ডিইএস, এক্সটেন্ডেড ডিইএস এবং ব্লোফিশ অ্যালগরিদমের জন্য নিজস্ব বাস্তবায়ন ধারণ করে এবং যদি সিস্টেমে এক বা একাধিক অ্যালগরিদমের সমর্থন না থাকে তবে এটি ব্যবহার করবে।

উদাহরণ

উদাহরণ # 1 ক্রিপ্ট()উদাহরণ

$hashed_password = ক্রিপ্ট("mypassword"); // লবণ স্বয়ংক্রিয়ভাবে তৈরি হতে দিন

/* তুলনা করার জন্য আপনাকে ক্রিপ্ট() এর সম্পূর্ণ ফলাফল লবণ হিসাবে পাস করা উচিত
পাসওয়ার্ড, বিভিন্ন হ্যাশিং অ্যালগরিদম ব্যবহার করা হলে সমস্যা এড়াতে। (যেমন
এটি উপরে বলে, স্ট্যান্ডার্ড DES-ভিত্তিক পাসওয়ার্ড হ্যাশিং একটি 2-অক্ষরের লবণ ব্যবহার করে,
কিন্তু MD5-ভিত্তিক হ্যাশিং 12 ব্যবহার করে।) */
যদি (hash_equals ($hashed_password , crypt ($user_input , $hashed_password ))) (
প্রতিধ্বনি "পাসওয়ার্ড যাচাই করা হয়েছে!" ;
}
?>

উদাহরণ #2 ব্যবহার করে ক্রিপ্ট() htpasswd সহ

// পাসওয়ার্ড সেট করুন
$password = "mypassword" ;

// হ্যাশ পান, লবণ স্বয়ংক্রিয়ভাবে তৈরি হতে দেয়
$হ্যাশ = ক্রিপ্ট($পাসওয়ার্ড);
?>

উদাহরণ #3 ব্যবহার করে ক্রিপ্ট()বিভিন্ন ধরনের হ্যাশ সহ

/* এই লবণগুলি শুধুমাত্র উদাহরণ, এবং আপনার কোডে মৌখিকভাবে ব্যবহার করা উচিত নয়।
প্রতিটি পাসওয়ার্ডের জন্য আপনাকে একটি স্বতন্ত্র, সঠিকভাবে ফর্ম্যাট করা লবণ তৈরি করা উচিত।
*/
যদি (CRYPT_STD_DES == 1) (
প্রতিধ্বনি "স্ট্যান্ডার্ড ডেস:"। ক্রিপ্ট ("র্যাসমুসলারডর্ফ", "আরএল")। "\n";
}

যদি (CRYPT_EXT_DES == 1) (
প্রতিধ্বনি "বর্ধিত ডিইএস:"। crypt ("rasmuslerdorf" , "_J9..rasm")। "\n";
}

যদি (CRYPT_MD5 == 1) (
ইকো "MD5:"। ক্রিপ্ট ("র্যাসমুসলারডর্ফ" , "$1$রসমুসলে$")। "\n";
}

যদি (CRYPT_BLOWFISH == 1) (
প্রতিধ্বনি "ব্লোফিশ:"। ক্রিপ্ট("র্যাসমুসলারডর্ফ" , "$2a$07$usesomesillystringforsalt$") "\n";
}

যদি (CRYPT_SHA256 == 1) (
প্রতিধ্বনি "SHA-256:"। ক্রিপ্ট("র্যাসমুসলারডর্ফ" , "$5$rounds=5000$usesomesillystringforsalt$") "\n";
}

যদি (CRYPT_SHA512 == 1) (
প্রতিধ্বনি "SHA-512:"। ক্রিপ্ট("র্যাসমুসলারডর্ফ" , "$6$rounds=5000$usesomesillystringforsalt$") "\n";
}
?>

পিএইচপি ব্যবহার সহ যেকোনো তথ্য এনক্রিপ্ট বা ডিক্রিপ্ট করা যেতে পারে। এই ভাষার অনেকগুলি ডেটা এনক্রিপশন ক্ষমতা রয়েছে, সহজ থেকে জটিল পর্যন্ত।

আসুন প্রাথমিক এনক্রিপশন পদ্ধতিগুলি দেখি

বেস64- আপনাকে MIME base64 অ্যালগরিদম ব্যবহার করে ডেটা এনক্রিপ্ট এবং ডিক্রিপ্ট করতে দেয়৷ এটি কী ব্যবহার করে না এবং প্রায়শই পিএইচপি-তে লিঙ্কগুলি লুকানোর জন্য ব্যবহৃত হয়।

উদাহরণ:
//পাঠ্যটি এনক্রিপ্ট করুন
$text = "লিঙ্ক";
echo base64_encode($text); //উৎপাদন: PGEgaHJlZj0iIyI+0KHRgdGL0LvQutCwPC9hPg==
//ডিক্রিপশন
echo base64_decode("PGEgaHJlZj0iIyI+0KHRgdGL0LvQutCwPC9hPg==");
?>

আপনি দেখতে পাচ্ছেন, আমরা প্রথমে base64_encode অপারেশন ব্যবহার করেছি এবং সাইফার পেয়েছি: PGEgaHJlZj0iIyI+0KHRgdGL0LvQutCwPC9hPg==, এবং তারপর এটি base64_decode-এ প্রতিস্থাপিত হয়েছে এবং লিঙ্কটি ফিরে পেয়েছে।

md5- আপনাকে একতরফাভাবে ডেটা হ্যাশ করতে দেয়। অর্থাৎ, base64 এর বিপরীতে, আপনি আর তাদের ডিক্রিপ্ট করতে পারবেন না। প্রায়শই md5 একটি ডাটাবেসে পাসওয়ার্ড সংরক্ষণ করতে ব্যবহৃত হয়, কিন্তু সম্প্রতি এনক্রিপ্ট করা md5 সংমিশ্রণটি ডিক্রিপশন টেবিলে খুঁজে পাওয়া সহজ হয়ে উঠেছে, দয়া করে অনেক সাইট এবং অ্যালগরিদম দ্বারা সরবরাহ করা হয়েছে। অতএব, md5 পাসওয়ার্ড সংরক্ষণ করতে, ব্লোফিশ দিয়ে অ্যালগরিদম প্রতিস্থাপন করা ভাল।

উদাহরণ:

//পাঠ্যটি এনক্রিপ্ট করুন
echo md5("কম্বিনেশন");
?>

কী এনক্রিপশন

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

ফাংশন __encode($text, $key) (



$enc_text=base64_encode(mcrypt_generic($td,$iv.$text));
mcrypt_generic_deinit($td);
mcrypt_module_close($td);
ফেরত $enc_text; ))
ফাংশন strToHex($string) (
$hex="";
জন্য ($i=0; $i< strlen($string); $i++) { $hex .= dechex(ord($string[$i])); }
ফেরত $হেক্স; )
ফাংশন __decode($text, $key) (
$td = mcrypt_module_open("tripledes", "", "cfb", "");
$iv_size = mcrypt_enc_get_iv_size($td);
$iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
যদি (mcrypt_generic_init ($td, $key, $iv) != -1) (
$decode_text = substr(mdecrypt_generic($td, base64_decode($text)),$iv_size);
mcrypt_generic_deinit($td);
mcrypt_module_close($td);
$decode_text ফেরত দিন; ))
ফাংশন hexToStr($hex) (
$string="";
জন্য ($i=0; $i< strlen($hex)-1; $i+=2) { $string .= chr(hexdec($hex[$i].$hex[$i+1])); }
ফেরত $স্ট্রিং; )

$str = "বান যেগুলো এনক্রিপ্ট করা দরকার!
চাবি দ্বারা";
$code = strToHex(__encode($str, "My#key-do-36-simvolov"));
প্রতিধ্বনি "এনক্রিপ্ট করা কোড: ".$ কোড।"
";

$str = __decode(hexToStr($code), "My#key-do-36-simvolov");
প্রতিধ্বনি "ডিক্রিপ্ট করা কোড: ".$str।"
";
?>

আপনি html সামগ্রী এনক্রিপ্ট করতে পারেন। কী দৈর্ঘ্য 36 অক্ষরের বেশি হওয়া উচিত নয়।

এই পদ্ধতিটি কিছু ডেটা এনক্রিপ্ট করতে এবং এটিকে একটি txt ফাইল বা ডাটাবেসে রাখতে এবং একটি কী দিয়ে ডিক্রিপশন ব্যবহার করে এটি গ্রহণ করতে ব্যবহার করা যেতে পারে।

অবশ্যই, যেকোনো কোড ডিক্রিপ্ট/হ্যাক করা যেতে পারে এবং এটি কোন ব্যতিক্রম নয়, তাই শক্তিশালী এনক্রিপশন পদ্ধতি ব্যবহার করুন।

ক্রিপ্টোগ্রাফির মৌলিক সত্যগুলির মধ্যে একটি হল যে আপনি পেশাদার না হলে এই ক্ষেত্রে আপনার কিছু উদ্ভাবন করা উচিত নয়। এটি আংশিকভাবে সত্য, কারণ তথ্য প্রযুক্তির ক্ষেত্রে কয়েক দশক ধরে সর্বোত্তম জিনিসগুলি আবিষ্কার করা হয়েছে, ভোগ করা হয়েছে এবং ব্যবহার করা হয়েছে। সত্যের অন্য দিকটি হল যে জ্ঞানের একটি নির্দিষ্ট ক্ষেত্রের বিকাশ শুধুমাত্র তাজা ধারণা এবং মূল সমাধানগুলির অবিচ্ছিন্ন প্রবাহের মাধ্যমে ঘটে।

সুস্পষ্ট কারণে, আমরা AES-এর মতো শিল্প ক্রিপ্টোগ্রাফির দৈত্যদের লক্ষ্য করব না, তবে ব্ল্যাকজ্যাক এবং আনন্দের সাথে আমাদের নিজস্ব ক্রিপ্টোগ্রাফিক গবেষণায় নিমজ্জিত হব।

আংশিক কারণ এটি আকর্ষণীয়, আংশিক কারণ আপনার নিজের কিছু মডেলিং করে এবং এটিকে স্বীকৃত মানগুলির সাথে তুলনা করে, আপনি স্পষ্টভাবে বৈসাদৃশ্য, কার্যকর সমাধান এবং সম্পূর্ণ বাদ দেওয়া দেখতে পান এবং আপনি বুঝতে পারেন দক্ষতা উন্নত করার জন্য আপনি কী চেষ্টা করতে পারেন৷

কিন্তু ইতিমধ্যেই পর্যাপ্ত জল।

ধরা যাক আমাদের ওয়েব অ্যাপ্লিকেশনটি পিএইচপি-তে লেখা, বিপরীত এনক্রিপশন প্রয়োজন, এবং আমরা বিশ্বাস করি যে আমরা আমাদের নিজস্ব সাইফার সিস্টেম লিখতে পারি।

সুতরাং, আসুন ব্যক্তিগত এবং সর্বজনীন কীগুলির সাথে আমাদের নিজস্ব বিপরীতমুখী এনক্রিপশন সিস্টেম লিখি, যেটিতে একটি কম-বেশি নিরাপদ ক্রিপ্টোগ্রাফিক অ্যালগরিদমের নিম্নলিখিত বৈশিষ্ট্যগুলি থাকবে:

  1. চূড়ান্ত সাইফারে শব্দ চিহ্নের উপস্থিতি।
  2. প্রতিটি প্রেরক-গন্তব্য চ্যানেলের তথ্য একটি ব্যক্তিগত কী ব্যবহার করে এনক্রিপ্ট করা হবে, এবং ম্যাচিং ফাংশন প্রতিটি কীর জন্য অনন্য হবে।
  3. প্রতিটি বার্তা একটি ডাইজেস্ট কোড পাবে - একটি অনন্য কোড যা ব্যক্তিগত কী এবং মূল বার্তার একটি ফাংশন। "উৎস প্রতীক" ম্যাচিং ফাংশনের স্বতন্ত্রতা অর্জনের জন্য এটি প্রয়োজনীয়<=>এনকোড করা প্রতীক" শুধুমাত্র "প্রেরক-গ্রহণকারী" চ্যানেলের জন্য নয়, প্রতিটি পৃথক বার্তার জন্যও।

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

  4. ফ্রিকোয়েন্সি বিশ্লেষণকে জটিল করতে, আমরা প্রতিটি প্রাথমিক বার্তা চিহ্নকে দুটি সাইফার চিহ্ন দিয়ে এনকোড করব।
তাই কি হয়েছে.

আসলে, আপনি চূড়ান্ত ফলাফল দেখতে পারেন

সিমকোডার ক্লাসে এনক্রিপশন এবং ডিক্রিপশন পদ্ধতি অন্তর্ভুক্ত রয়েছে।

কোড() পদ্ধতিতে এনক্রিপশন করা হয়, যা মূল বার্তাটিকে ইনপুট হিসেবে নেয়।

এখানে, tab_coded-এ জেনারেট করা চিঠিপত্রের সারণী থেকে একটি বার্তা একটি এনক্রিপ্ট করা বার্তা তৈরি করে, প্রান্ত বরাবর এবং ভিতরে গোলমাল চিহ্ন দিয়ে মিশ্রিত।

যাইহোক, প্রতিটি প্রেরক-গন্তব্য চ্যানেলের জন্য নয়েজ চিহ্নগুলি অনন্য, যেহেতু সেগুলি চ্যানেল কী ব্যবহার করে তৈরি করা হয়, তবে বার্তাগুলির জন্য অনন্য নয়। কোড_সিম্বলে এনক্রিপশনের জন্য ব্যবহৃত চিহ্নগুলি হল কিছু বিরাম চিহ্ন এবং চিহ্ন যেমন %, @, ইত্যাদি।

প্রতিটি এনকোড করা চিহ্নের জন্য, code_symbols থেকে দুটি চিহ্ন রয়েছে, সুস্পষ্ট কারণে যে এনকোড করা প্রতীকগুলির তুলনায় তাদের মধ্যে কয়েকগুণ কম।

create_tab_coded করেসপন্ডেন্স টেবিলটি কোড সিম্বল অ্যারের উপাদানের সংখ্যার সমান উপাদানের সংখ্যা সহ একটি অ্যারেতে বার্তা কী হ্যাশের অনুবাদ ব্যবহার করে তৈরি করা হয়েছে। দুই-অক্ষরের কোডগুলি অতিক্রম করার জন্য শুরুর অবস্থান সর্বদা আলাদা এবং চ্যানেল কী-এর সাথে যুক্ত। এটি নিশ্চিত করা সম্ভব করে যে এনকোড করা চিহ্ন এবং তাদের সাথে মিলিত কোড চিহ্নগুলিকে অতিক্রম করার অ্যালগরিদম সর্বদা (বা প্রায়শই নিশ্চিত করা হয়) ভিন্ন হবে।

উদাহরণস্বরূপ, "হ্যালো ওয়ার্ল্ড" বার্তাটি, যখন এনকোড করা হয়, তখন এইরকম দেখায়:

ডাইজেস্ট-a00bf11d-&?==&!&?.@.@=!=-.?&1.#&?=:.:.1%!&-%@&@%~&1^#=?%% .!%+।?.~=?...&?%&&:%~।#%@&1&1.#=?.#.?.!&1==&=.-=!

এবং এখানে একই বার্তা, আবার এনকোড করা হয়েছে:

ডাইজেস্ট-a00bf11d-=:.?=:&!.?.1&-=:=?.?.=.?.!&=%!=-%@=!%~.=^#.1%%। !%+=:.~.@..==%&&1%~.1%@=?.@.!&=.!&@=:&1.==:=!.1&:

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

বার্তাগুলির অপ্রয়োজনীয়তা রয়েছে, যা বার্তার ভলিউম বৃদ্ধির সাথে সাথে 10% শব্দ পর্যন্ত হ্রাস পায় (স্বল্পতম বার্তাগুলির জন্য, শব্দ 90% বা উচ্চতর শতাংশে পৌঁছায়), একটি এনক্রিপ্ট করা বার্তার সর্বনিম্ন দৈর্ঘ্য 116 অক্ষর। এই এনক্রিপশন পদ্ধতির একটি অসুবিধা হল যে এনকোড করা বার্তাগুলি অন্তত দ্বিগুণ হয়৷

ডিকোডিং ফর্মের বিপরীত অনুবাদ নিয়ে গঠিত "কোড প্রতীক" - বার্তা থেকে আউট কাটা গোলমাল সহ মূল প্রতীক। কী কী হতে পারে? মূলত, যেকোনো স্ট্রিং যা প্রতিটি গন্তব্য-রিসিভার জোড়ার জন্য অনন্য।

উদাহরণস্বরূপ, আপনি যদি বার্তা এনক্রিপশন সহ একটি মেসেঞ্জার তৈরি করেন, তাহলে ব্যক্তিগত কী-এর সহজতম সংস্করণটি হতে পারে md5($user_id_1. $salt. $user_id_2), তাহলে কীটি প্রতিটি বার্তা চ্যানেলের জন্য অনন্য হবে৷

ধরা যাক আপনাকে দুটি সার্ভারের মধ্যে ডেটা বিনিময় করতে হবে। গোপনীয় ট্রাফিক থেকে ডেটা রক্ষা করতে, ডেটা এনক্রিপ্ট করা হয়। ভাল, উদাহরণস্বরূপ, একটি botnet মধ্যে কর্ম স্থানান্তর. এটিই মূলত এনক্রিপশন নয়, তবে একে এনকোডিং বলা হয় এবং এই ধরনের কোড ডিকোড করতে সুপরিচিত ফাংশন ব্যবহার করা হয়।

ছদ্ম-এনক্রিপশনের আরেকটি উদাহরণ হিসাবে, আমি একটি সিএমএসের ডাটাবেসে পাসওয়ার্ডগুলির "এনক্রিপশন" এর একটি উদাহরণ দেব - সেখানে পাসওয়ার্ডগুলি md5() বা এনক্রিপ্ট করা হয় না, তবে কেবল base64 এর মাধ্যমে এনকোড করা হয়। সেগুলো. ডাটাবেস ফাঁস হয়ে গেলে, বিল্ট-ইন পিএইচপি ফাংশন base64_decode() ব্যবহার করে সব পাসওয়ার্ড ডিক্রিপ্ট করা হ্যাকারের পক্ষে কঠিন হবে না।

কেউ পাঠ্যটিকে আটকাতে এবং ডিক্রিপ্ট করতে সক্ষম হবে এই চিন্তা না করে আমাদের ডেটা প্রেরণ করতে হবে। পিএইচপি-তে ম্যাক্রিপ্ট নামে একটি জনপ্রিয় ডেটা এনক্রিপশন প্যাকেজ রয়েছে, যা দ্বি-মুখী এনক্রিপশন প্রদান করে (অর্থাৎ ডেটার প্রকৃত এনক্রিপশন এবং ডিক্রিপশন)।

Mcrypt সংস্করণ 2.4.7 নিম্নলিখিত সিমেট্রিক এনক্রিপশন অ্যালগরিদম সমর্থন করে: Blowfish, RC2, Safer-sk64 xtea, Cast-256, RC4, Safer-sk128, DES, RC4-iv, Serpent, Enigma, Rijndael-128, Threeway, Rijndael-128 , TripleDES, LOKI97, Rijndael-256, Twofish, Panama, Saferplus, ইত্যাদি। প্রতিটি অ্যালগরিদম সম্পর্কে আরও বিস্তারিত উইকিপিডিয়ায় লেখা আছে।

যেহেতু সিমেট্রিক এনক্রিপশন ব্যবহার করা হয়, চাবিটি অবশ্যই উভয় পক্ষের কাছে জানতে হবে এবং গোপন রাখতে হবে।

একটি স্ট্রিং এর এনক্রিপশন এবং ডিক্রিপশনের উদাহরণ

mcrypt_module_open("des", "", "ecb", "")
এই ফাংশন অ্যালগরিদম মডিউল এবং ব্যবহৃত মোড খোলে। এই উদাহরণের জন্য, DES অ্যালগরিদম ECB মোডে আছে।

$key = substr($key, 0, mcrypt_enc_get_key_size($td));
সর্বাধিক কী আকার mcrypt_enc_get_key_size() ফাংশন কল করে প্রাপ্ত করা আবশ্যক, এবং এর চেয়ে কম মান সঠিক হবে।

$s = mcrypt_generic($td, $source);
এনক্রিপ্ট করার সময়, ডেটা এন*ব্লকসাইজ দীর্ঘ হয় তা নিশ্চিত করার জন্য ডেটা শূন্য বাইট দিয়ে প্যাড করা হয়। ব্লক সাইজ ব্লক সাইজ অ্যালগরিদম দ্বারা নির্ধারিত হয় (DES-এর জন্য ব্লক সাইজ হল 64 বিট)। অতএব, ডিক্রিপ্ট করার সময়, লাইনের শেষে "\0" উপস্থিত হতে পারে, যা trim() ফাংশন দ্বারা সরানো হয়