TL; DR: বুলিয়ান আর্গুমেন্ট ব্যবহার করবেন না।
নিচে দেখুন কেন তারা খারাপ হয়, এবং কিভাবে তাদের প্রতিস্থাপন (বোল্ড মুখে)।
বুলিয়ান যুক্তিগুলি পড়া খুব শক্ত এবং এইভাবে বজায় রাখা কঠিন difficult মূল সমস্যাটি হ'ল উদ্দেশ্যটি পরিষ্কার হয় যখন আপনি সেই পদ্ধতিটির স্বাক্ষরটি পড়েন যেখানে আর্গুমেন্টটির নাম দেওয়া হয়েছে। তবে সাধারণত বেশিরভাগ ভাষায় প্যারামিটারের নামকরণের প্রয়োজন হয় না। সুতরাং আপনার মতো অ্যান্টি-প্যাটার্ন থাকবে RSACryptoServiceProvider#encrypt(Byte[], Boolean)
যেখানে বুলেটিয়ান প্যারামিটার ফাংশনে কোন ধরণের এনক্রিপশন ব্যবহার করতে হবে তা নির্ধারণ করে।
সুতরাং আপনি যেমন একটি কল পাবেন:
rsaProvider.encrypt(data, true);
যেখানে পাঠককে নরকের true
আসলে কী অর্থ হতে পারে তা নির্ধারণ করার জন্য পদ্ধতির স্বাক্ষরটি সন্ধান করতে হয়। পূর্ণসংখ্যা পাস করা ঠিক ততটাই খারাপ:
rsaProvider.encrypt(data, 1);
আপনাকে যতটা বলবে - বা বরং: ঠিক তত কম। এমনকি আপনি যদি পূর্ণসংখ্যার জন্য ব্যবহারের জন্য ধ্রুবকগুলি সংজ্ঞায়িত করেন তবে ফাংশনের ব্যবহারকারীরা কেবল এগুলি উপেক্ষা করতে পারেন এবং আক্ষরিক মান ব্যবহার করতে পারেন।
এটি সমাধানের সর্বোত্তম উপায় হল একটি গণনা ব্যবহার করা । যদি আপনাকে RSAPadding
দুটি মান সহ একটি এনাম পাস করতে হয় : OAEP
বা PKCS1_V1_5
তারপরে আপনি তত্ক্ষণাত কোডটি পড়তে সক্ষম হবেন:
rsaProvider.encrypt(data, RSAPadding.OAEP);
বুলিয়ানদের কেবল দুটি মান থাকতে পারে। এর অর্থ হ'ল যদি আপনার কাছে তৃতীয় বিকল্প থাকে তবে আপনাকে নিজের স্বাক্ষরটি রিফ্যাক্টর করতে হবে। পিছনে সামঞ্জস্যতা যদি কোনও সমস্যা হয় তবে সাধারণত এটি সহজে সম্পাদন করা যায় না, সুতরাং আপনাকে অন্য পাবলিক পদ্ধতির সাথে কোনও পাবলিক ক্লাস প্রসারিত করতে হবে। মাইক্রোসফ্ট অবশেষে এটি করেছিল যখন তারা RSACryptoServiceProvider#encrypt(Byte[], RSAEncryptionPadding)
বুলিয়ানের পরিবর্তে একটি গণনা (বা অন্তত একটি শ্রেণি অনুকরণের অনুকরণ করে) ব্যবহার করেছিল where
পরামিতিটি নিজেই প্যারামিটারাইজড করার প্রয়োজনে কোনও পূর্ণ বস্তু বা ইন্টারফেসটিকে প্যারামিটার হিসাবে ব্যবহার করা আরও সহজ হতে পারে। উপরের উদাহরণে OAEP প্যাডিং নিজেই অভ্যন্তরীণভাবে ব্যবহারের জন্য হ্যাশ মান দিয়ে প্যারামিটারাইজড হতে পারে। মনে রাখবেন যে এখন 6 এসএএএ-2 হ্যাশ অ্যালগরিদম এবং 4 এসএইচএ -3 হ্যাশ অ্যালগরিদম রয়েছে, সুতরাং আপনি যদি পরামিতিগুলির পরিবর্তে কেবল একটি একক সংখ্যা ব্যবহার করেন তবে গণ্যমানের সংখ্যাটি বিস্ফোরিত হতে পারে (এটি সম্ভবত মাইক্রোসফ্ট পরের জিনিসটি সন্ধান করতে চলেছে )।
বুলিয়ান প্যারামিটারগুলিও ইঙ্গিত করতে পারে যে পদ্ধতি বা শ্রেণিটি ভালভাবে ডিজাইন করা হয়নি। উপরের উদাহরণের মতো:। নেট ব্যতীত অন্য কোনও ক্রিপ্টোগ্রাফিক লাইব্রেরি পদ্ধতিতে স্বাক্ষরে কোনও প্যাডিং পতাকা ব্যবহার করে না।
আমি প্রায় সমস্ত সফ্টওয়্যার গুরুগুলি পছন্দ করি যেগুলি বুলিয়ান যুক্তিগুলির বিরুদ্ধে সতর্ক করে দেয়। উদাহরণস্বরূপ, জোশুয়া ব্লচ তাদের বিরুদ্ধে অত্যন্ত প্রশংসিত বই "কার্যকর জাভা" তে সতর্ক করেছেন। সাধারণভাবে এগুলি কেবল ব্যবহার করা উচিত নয়। আপনি তর্ক করতে পারেন যে এগুলি ব্যবহার করা যেতে পারে যদি এমন একটি পরামিতি থাকে যা বোঝা সহজ। তবুও: Bit.set(boolean)
সম্ভবত দুটি পদ্ধতি ব্যবহার করে আরও ভাল প্রয়োগ করা হয়েছে : Bit.set()
এবং Bit.unset()
।
আপনি যদি কোডটি সরাসরি সংশোধন করতে না পারেন তবে অন্তত তাদের আরও পাঠযোগ্য করে তুলতে আপনি ধ্রুবককে সংজ্ঞায়িত করতে পারেন :
const boolean ENCRYPT = true;
const boolean DECRYPT = false;
...
cipher.init(key, ENCRYPT);
এর চেয়ে অনেক বেশি পঠনযোগ্য:
cipher.init(key, true);
এমনকি যদি আপনি এটি চেয়েছিলেন:
cipher.initForEncryption(key);
cipher.initForDecryption(key);
পরিবর্তে.