জাভা .class
ফাইলগুলি মোটামুটি সহজেই নিষ্প্রভ করা যায়। কোডটিতে লগইন ডেটা ব্যবহার করতে হলে আমি কীভাবে আমার ডাটাবেস সুরক্ষা দিতে পারি?
জাভা .class
ফাইলগুলি মোটামুটি সহজেই নিষ্প্রভ করা যায়। কোডটিতে লগইন ডেটা ব্যবহার করতে হলে আমি কীভাবে আমার ডাটাবেস সুরক্ষা দিতে পারি?
উত্তর:
আপনার কোডটিতে কখনও হার্ড-কোড পাসওয়ার্ড নেই। সম্প্রতি শীর্ষস্থানীয় 25 সবচেয়ে বিপজ্জনক প্রোগ্রামিং ভুলগুলিতে এটি প্রকাশিত হয়েছিল :
আপনার সফ্টওয়্যারটিতে একটি গোপন অ্যাকাউন্ট এবং পাসওয়ার্ড হার্ড-কোডিং অত্যন্ত সুবিধাজনক - দক্ষ বিপরীত প্রকৌশলীদের জন্য। যদি পাসওয়ার্ডটি আপনার সমস্ত সফ্টওয়্যার জুড়ে একই থাকে, তবে সেই পাসওয়ার্ডটি অনিবার্যভাবে জানা হয়ে গেলে প্রতিটি গ্রাহক দুর্বল হয়ে পড়ে। এবং এটি হার্ড কোডেড হওয়ার কারণে এটি ঠিক করার জন্য একটি বিশাল ব্যথা।
পাসওয়ার্ড সহ আপনার কনফিগারেশন সম্পর্কিত তথ্য পৃথক ফাইলে সংরক্ষণ করা উচিত যা অ্যাপ্লিকেশনটি শুরু হয় reads পচনশীল হওয়ার ফলে পাসওয়ার্ড ফাঁস হওয়া থেকে রোধ করার একমাত্র আসল উপায় (এটি কখনই শুরু করতে বাইনারিতে সংকলন করবেন না)।
এই সাধারণ ভুল সম্পর্কে আরও তথ্যের জন্য, আপনি CWE-259 নিবন্ধটি পড়তে পারেন । নিবন্ধটিতে আরও বিশদ সংজ্ঞা, উদাহরণ এবং সমস্যা সম্পর্কে প্রচুর অন্যান্য তথ্য রয়েছে।
জাভাতে, এটি করার অন্যতম সহজ উপায় হল পছন্দসমূহ ক্লাসটি ব্যবহার করা। এটি সমস্ত ধরণের প্রোগ্রাম সেটিংস সংরক্ষণ করার জন্য ডিজাইন করা হয়েছে, যার মধ্যে একটি ব্যবহারকারীর নাম এবং পাসওয়ার্ড অন্তর্ভুক্ত থাকতে পারে।
import java.util.prefs.Preferences;
public class DemoApplication {
Preferences preferences =
Preferences.userNodeForPackage(DemoApplication.class);
public void setCredentials(String username, String password) {
preferences.put("db_username", username);
preferences.put("db_password", password);
}
public String getUsername() {
return preferences.get("db_username", null);
}
public String getPassword() {
return preferences.get("db_password", null);
}
// your code here
}
উপরের কোডে, আপনি setCredentials
ব্যবহারকারীর নাম এবং পাসওয়ার্ডের জন্য ডায়ালগ জিজ্ঞাসা করার পরে পদ্ধতিটি কল করতে পারেন । আপনার যখন ডাটাবেসের সাথে সংযোগ স্থাপন করতে হবে তখন আপনি সঞ্চিত মানগুলি পুনরুদ্ধার করতে কেবল পদ্ধতি getUsername
এবং getPassword
পদ্ধতিগুলি ব্যবহার করতে পারেন । লগইন শংসাপত্রগুলি আপনার বাইনারিগুলিতে কঠোরভাবে কোড করা হবে না, তাই ক্ষয়করণ কোনও সুরক্ষা ঝুঁকি তৈরি করবে না।
গুরুত্বপূর্ণ দ্রষ্টব্য: পছন্দগুলি ফাইলগুলি কেবলমাত্র সরল পাঠ্য এক্সএমএল ফাইল। অননুমোদিত ব্যবহারকারীদের কাঁচা ফাইল (ইউনিক্স অনুমতি, উইন্ডোজ অনুমতি এবং ইত্যাদি) দেখতে বাধা দেওয়ার জন্য আপনি যথাযথ পদক্ষেপ নিয়েছেন তা নিশ্চিত করুন। লিনাক্সে, কমপক্ষে, এটি কোনও সমস্যা নয়, কারণ কলিং Preferences.userNodeForPackage
বর্তমান ব্যবহারকারীর হোম ডিরেক্টরিতে এক্সএমএল ফাইল তৈরি করবে, যা অন্য ব্যবহারকারীদের দ্বারা যেভাবেই পঠনযোগ্য নয়। উইন্ডোজে পরিস্থিতি আলাদা হতে পারে।
আরও গুরুত্বপূর্ণ নোট: এই অবস্থার জন্য সঠিক স্থাপত্যটি কী তা নিয়ে এই উত্তর এবং অন্যদের মন্তব্যগুলিতে প্রচুর আলোচনা হয়েছে। আসল প্রশ্নটিতে প্রকৃতপক্ষে প্রসঙ্গটি উল্লেখ করা হয়নি যেখানে অ্যাপ্লিকেশনটি ব্যবহৃত হচ্ছে, তাই আমি যে দুটি পরিস্থিতি নিয়ে ভাবতে পারি সে সম্পর্কে কথা বলব। প্রথমটি হল সেই ক্ষেত্রে যেখানে প্রোগ্রামটি ব্যবহার করা ব্যক্তি ইতিমধ্যে ডেটাবেস শংসাপত্রগুলি জানেন (এবং এটি জানার জন্য অনুমোদিত)। দ্বিতীয়টি হ'ল সেই ক্ষেত্রে আপনি, বিকাশকারী, প্রোগ্রামটি ব্যবহার করে ব্যক্তির কাছ থেকে ডাটাবেস শংসাপত্রগুলি গোপন রাখার চেষ্টা করছেন।
প্রথম কেস: ব্যবহারকারী ডাটাবেস লগইন শংসাপত্রগুলি জানার জন্য অনুমোদিত is
এই ক্ষেত্রে, আমি উপরে উল্লিখিত সমাধানটি কাজ করবে। জাভা Preference
ক্লাসটি ব্যবহারকারীর নাম এবং পাসওয়ার্ড সরল পাঠ্যে সংরক্ষণ করবে, তবে পছন্দসই ফাইলটি কেবল অনুমোদিত ব্যবহারকারী দ্বারা পঠনযোগ্য। ব্যবহারকারী কেবল পছন্দসমূহের এক্সএমএল ফাইলটি খুলতে এবং লগইন শংসাপত্রগুলি পড়তে পারে, তবে এটি কোনও সুরক্ষা ঝুঁকি নয় কারণ ব্যবহারকারী শংসাপত্রগুলি শুরু করার বিষয়টি জানতেন।
দ্বিতীয় কেস: ব্যবহারকারীর কাছ থেকে লগইন শংসাপত্রগুলি আড়াল করার চেষ্টা করা হচ্ছে
এটি আরও জটিল কেস: ব্যবহারকারীর লগইন শংসাপত্রগুলি জানা উচিত নয় তবে তবুও ডাটাবেসে অ্যাক্সেস প্রয়োজন। এই ক্ষেত্রে, অ্যাপ্লিকেশনটি ব্যবহারকারী ব্যবহারকারীর ডাটাবেসে সরাসরি অ্যাক্সেস রয়েছে যার অর্থ প্রোগ্রামের আগে লগইন শংসাপত্রগুলি জানতে হবে know আমি উপরে উল্লিখিত সমাধানটি এই ক্ষেত্রে উপযুক্ত নয়। আপনি একটি পছন্দসই ফাইলে ডাটাবেস লগইন শংসাপত্রগুলি সংরক্ষণ করতে পারেন তবে তিনি ব্যবহারকারী সেই ফাইলটি পড়তে সক্ষম হবেন, যেহেতু তারা মালিক হবেন। প্রকৃতপক্ষে, এই কেসটিকে নিরাপদ উপায়ে ব্যবহার করার পক্ষে সত্যিকারের কোনও ভাল উপায় নেই।
সঠিক কেস: একটি বহু-স্তরীয় আর্কিটেকচার ব্যবহার করে
এটি করার সঠিক উপায় হ'ল আপনার ডাটাবেস সার্ভার এবং আপনার ক্লায়েন্ট অ্যাপ্লিকেশনের মধ্যে একটি মাঝারি স্তর থাকা যা পৃথক ব্যবহারকারীদের প্রমাণীকরণ করে এবং সীমিত ক্রিয়াকলাপ সম্পাদনের অনুমতি দেয়। প্রতিটি ব্যবহারকারীর নিজস্ব লগইন শংসাপত্র থাকবে, তবে ডাটাবেস সার্ভারের জন্য নয়। শংসাপত্রগুলি মধ্য স্তর (ব্যবসায়িক লজিক স্তর) অ্যাক্সেসের অনুমতি দেয় এবং প্রতিটি ব্যবহারকারীর জন্য পৃথক হতে পারে।
প্রত্যেক ব্যবহারকারীর নিজস্ব ব্যবহারকারীর নাম এবং পাসওয়ার্ড থাকবে যা কোনও সুরক্ষা ঝুঁকি ছাড়াই স্থানীয়ভাবে একটি পছন্দ ফাইলগুলিতে সংরক্ষণ করা যেতে পারে। একে ত্রি-স্তরের আর্কিটেকচার বলা হয় (স্তরগুলি আপনার ডাটাবেস সার্ভার, ব্যবসায় লজিক সার্ভার এবং ক্লায়েন্ট অ্যাপ্লিকেশন)। এটি আরও জটিল, তবে এই ধরণের জিনিসটি করা সবচেয়ে নিরাপদ উপায়।
ক্রিয়াকলাপের মূল ক্রমটি হ'ল:
getInventoryList
।নোট করুন যে পুরো প্রক্রিয়াতে, ক্লায়েন্ট অ্যাপ্লিকেশন কখনই সরাসরি ডাটাবেসের সাথে সংযুক্ত হয় না । ব্যবসায়ের লজিক স্তরটি কোনও প্রমাণীকৃত ব্যবহারকারীর কাছ থেকে একটি অনুরোধ গ্রহণ করে, তালিকা তালিকার জন্য ক্লায়েন্টের অনুরোধটি প্রক্রিয়া করে এবং কেবলমাত্র তখনই একটি এসকিউএল কোয়েরি কার্যকর করে।
অ্যাপ্লিকেশনটি পড়বে এমন কোনও ফাইলের মধ্যে পাসওয়ার্ডটি রাখুন। কোনও উত্স ফাইলে এম্বেড পাসওয়ার্ড কখনও নেই। পিরিয়ড।
এই জাতীয় ব্যবহারের জন্য রুবিয়ের একটি অল্প পরিচিত ডিডিবি :: ডিবিআরসি নামক মডিউল রয়েছে । আমার কোনও সন্দেহ নেই যে জাভার সমতুল্য আছে। যাইহোক, একটি লিখতে অসুবিধা হয় না।
আপনি কি ওয়েব অ্যাপ্লিকেশন লিখছেন? যদি তা হয় তবে অ্যাপ্লিকেশনটিতে এটি বাহ্যিকভাবে কনফিগার করতে জেএনডিআই ব্যবহার করুন। একটি ওভারভিউ এখানে উপলব্ধ :
নেটওয়ার্কের মাধ্যমে দূরবর্তী পরিষেবাগুলি সন্ধান এবং অ্যাক্সেসের জন্য অ্যাপ্লিকেশনটির জন্য জেএনডিআই অভিন্ন উপায় সরবরাহ করে। দূরবর্তী পরিষেবাটি কোনও মেসেজিং পরিষেবা বা অ্যাপ্লিকেশন-নির্দিষ্ট পরিষেবা সহ যে কোনও এন্টারপ্রাইজ পরিষেবা হতে পারে, তবে অবশ্যই একটি জেডিবিসি অ্যাপ্লিকেশন মূলত একটি ডাটাবেস পরিষেবাতে আগ্রহী। একবার কোনও ডাটাসোর্স অবজেক্টটি জেএনডিআই নামকরণ পরিষেবার সাথে তৈরি এবং নিবন্ধিত হয়ে গেলে, কোনও অ্যাপ্লিকেশন সেই তথ্যসোর্স অবজেক্টটিতে অ্যাক্সেসের জন্য জেএনডিআই এপিআই ব্যবহার করতে পারে, যা তারপরে উপস্থাপিত ডেটা উত্সের সাথে সংযোগ স্থাপনের জন্য ব্যবহার করা যেতে পারে।
আপনি যা কিছু করেন না কেন, সংবেদনশীল তথ্য কোথাও কোনও ফাইলে সংরক্ষণ করা হবে। আপনার লক্ষ্যটি যতটা সম্ভব সম্ভব এটি করা কঠিন। এর কতটুকু আপনি অর্জন করতে পারবেন তা আপনার প্রকল্প, প্রয়োজনীয়তা এবং আপনার সংস্থার ওয়ালেটের বেধের উপর নির্ভর করে।
সবচেয়ে ভাল উপায় হ'ল কোথাও কোনও পাসওয়ার্ড সংরক্ষণ করা নয়। পাসওয়ার্ড হ্যাশগুলি উত্পাদন এবং সঞ্চয় করতে হ্যাশ ফাংশন ব্যবহার করে এটি অর্জন করা হয়েছে:
hash("hello") = 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824
hash("hbllo") = 58756879c05c68dfac9866712fad6a93f8146f337a69afe7dd238f3364946366
হ্যাশ অ্যালগরিদম এক উপায় ফাংশন। তারা কোনও পরিমাণের ডেটা স্থির-দৈর্ঘ্যের "ফিঙ্গারপ্রিন্ট" এ রূপান্তর করে যা বিপরীত হতে পারে না। তাদের সম্পত্তিও রয়েছে যে ইনপুটটি যদি অল্প অল্প করেও পরিবর্তিত হয়, ফলাফল হ্যাশ সম্পূর্ণ আলাদা হয় (উপরের উদাহরণটি দেখুন)। এটি পাসওয়ার্ডগুলি সুরক্ষিত করার জন্য দুর্দান্ত, কারণ আমরা পাসওয়ার্ডগুলিকে এমন একটি ফর্মের মধ্যে সংরক্ষণ করতে চাই যা পাসওয়ার্ড ফাইল নিজেই আপোস করা হলেও তাদের সুরক্ষা দেয় তবে একই সাথে, আমাদের ব্যবহারকারীর পাসওয়ার্ড সঠিক কিনা তা যাচাই করতে আমাদের সক্ষম হওয়া দরকার।
অপরিবর্তিত নোট: ইন্টারনেটের পুরানো দিনগুলিতে, আপনি যখন 'আমার পাসওয়ার্ড ভুলে গেছেন' লিঙ্কটি ক্লিক করেন, ওয়েবসাইটগুলি আপনাকে আপনার সাধারণ পাঠ্য পাসওয়ার্ড ইমেল করবে। তারা সম্ভবত সেগুলি কোথাও একটি ডাটাবেসে সংরক্ষণ করছিল। হ্যাকাররা যখন তাদের ডাটাবেসে অ্যাক্সেস পেয়েছিল, তারা সমস্ত পাসওয়ার্ডে অ্যাক্সেস অর্জন করবে। যেহেতু অনেক ব্যবহারকারী একাধিক ওয়েবসাইটে একই পাসওয়ার্ড ব্যবহার করবেন, এটি ছিল একটি বিশাল সুরক্ষা সমস্যা। ভাগ্যক্রমে, আজকাল এটি সাধারণ অনুশীলন নয়।
এখন প্রশ্ন আসে: পাসওয়ার্ড সংরক্ষণের সবচেয়ে ভাল উপায় কী? আমি এই (প্রমাণীকরণ এবং ব্যবহারকারী পরিচালন পরিষেবা স্টর্ম্প্যাথের) সমাধানটিকে একটি দুর্দান্ত অভিজাত হিসাবে বিবেচনা করব :
স্পষ্টতই আপনি গুগল বা ব্যাংক নন, সুতরাং এটি আপনার জন্য একটি ওভারকিল সমাধান। তবে তারপরে প্রশ্ন আসে: আপনার প্রকল্পের কতটা সুরক্ষা প্রয়োজন, আপনার কত সময় এবং অর্থ আছে?
অনেক অ্যাপ্লিকেশনগুলির জন্য, যদিও প্রস্তাবিত নয়, কোডে হার্ড-কোডড পাসওয়ার্ড সংরক্ষণ করা যথেষ্ট পর্যাপ্ত সমাধান হতে পারে। তবে উপরের তালিকা থেকে সহজেই সুরক্ষার কয়েকটি অতিরিক্ত পদক্ষেপ যুক্ত করে আপনি আপনার অ্যাপ্লিকেশনটিকে আরও সুরক্ষিত করতে পারেন।
উদাহরণস্বরূপ, ধরা যাক ধাপ 1 আপনার প্রকল্পের জন্য গ্রহণযোগ্য সমাধান হবে না be আপনি চান না যে ব্যবহারকারীরা প্রতিবার পাসওয়ার্ড প্রবেশ করান, অথবা আপনি এমনকি ব্যবহারকারীদের পাসওয়ার্ড জানতে / চান না। তবুও আপনার কাছে কোথাও সংবেদনশীল তথ্য রয়েছে এবং আপনি এটি সংরক্ষণ করতে চান। আপনার একটি সহজ অ্যাপ্লিকেশন রয়েছে, আপনার ফাইলগুলি সংরক্ষণ করার জন্য কোনও সার্ভার নেই বা এটি আপনার প্রকল্পের জন্য খুব বেশি ঝামেলা। আপনার অ্যাপ্লিকেশনটি এমন পরিবেশে চলে যেখানে ফাইলগুলি নিরাপদে সঞ্চয় করা সম্ভব নয়। এটি সবচেয়ে খারাপ পরিস্থিতিগুলির মধ্যে একটি, তবে কিছু অতিরিক্ত সুরক্ষার ব্যবস্থা সহ আপনার আরও নিরাপদ সমাধান হতে পারে। উদাহরণস্বরূপ, আপনি সংবেদনশীল তথ্য কোনও ফাইলে সংরক্ষণ করতে পারেন এবং আপনি ফাইলটি এনক্রিপ্ট করতে পারেন। আপনার কোডটিতে এনক্রিপশন বেসরকারী কী হার্ড কোডড থাকতে পারে। আপনি কোডটি অবলম্বন করতে পারেন, তাই কারও পক্ষে এটি ক্র্যাক করা আপনার আরও কিছুটা কঠিন করে তুলবে।এই লিঙ্কে । (আমি আপনাকে আরও একবার সতর্ক করতে চাই যে এটি 100% নিরাপদ নয় right সঠিক জ্ঞান এবং সরঞ্জাম সহ একটি স্মার্ট হ্যাকার এটিকে হ্যাক করতে পারে But তবে আপনার প্রয়োজনীয়তা এবং প্রয়োজনের ভিত্তিতে এটি আপনার পক্ষে যথেষ্ট উপযুক্ত সমাধান হতে পারে)।
এই প্রশ্নটি কীভাবে কোনও এনক্রিপ্ট করা ফাইলে পাসওয়ার্ড এবং অন্যান্য ডেটা সংরক্ষণ করবেন তা দেখায়: জাভা 256-বিট এইএস পাসওয়ার্ড-ভিত্তিক এনক্রিপশন
এমডি 5 হ্যাশ অ্যালগরিদম, কোনও এনক্রিপশন অ্যালগরিদম নয়, সংক্ষেপে আপনি না পেয়ে ফিরে যেতে পারবেন, আপনি কেবল তুলনা করতে পারেন। এটি ব্যবহারকারীর প্রমাণীকরণের তথ্য সংরক্ষণ করার সময় ব্যবহার করা উচিত এবং ইউজার ব্যবহারকারীর নাম এবং পাসওয়ার্ড নয়। db ব্যবহারকারীর নাম এবং pwd এনক্রিপ্ট করা উচিত এবং একটি কনফিগার ফাইলে রাখা উচিত, কমপক্ষে করতে।