php - আপনি কিভাবে পিএইচপি হ্যাশিং পাসওয়ার্ড জন্য bcrypt ব্যবহার করবেন?
passwords cryptography (6)
আপনি রেনবো টেবিলগুলির সাথে যথেষ্ট পরিমাণে তথ্য পাবেন : নিরাপদ পাসওয়ার্ড স্কিম বা পোর্টেবল পিএইচপি পাসওয়ার্ড হ্যাশিং ফ্রেমওয়ার্ক সম্পর্কে আপনাকে যা জানা দরকার ।
লক্ষ্যটি ধীরগতির সাথে পাসওয়ার্ড হ্যাশ করা, তাই আপনার পাসওয়ার্ড ডেটাবেসকারী কেউ এটি জোর করে বলার চেষ্টা করে মারা যাবে (পাসওয়ার্ড চেক করার জন্য 10 মিনিট বিলম্ব আপনার জন্য কিছুই নয়, এটির জন্য জোর করার চেষ্টা করার জন্য অনেক কিছু)। Bcrypt ধীর এবং এটি কত ধীর এটি চয়ন করতে একটি পরামিতি দিয়ে ব্যবহার করা যেতে পারে।
এখন এবং তারপর আমি পরামর্শটি শুনছি "পিএইচপি তে পাসওয়ার্ড সংরক্ষণের জন্য bcrypt ব্যবহার করুন, bcrypt নিয়ম"।
কিন্তু bcrypt
কি? পিএইচপি এমন কোনও ফাংশন দেয় না, ফাইল-এনক্রিপশন ইউটিলিটি এবং ওয়েব অনুসন্ধান সম্পর্কে উইকিপিডিয়া ব্যাবলগুলি কেবল বিভিন্ন ভাষায় Blowfish কয়েকটি বাস্তবায়ন প্রকাশ করে। এখন ব্লোফিশ mcrypt
মাধ্যমে পিএইচপি তেও পাওয়া যায়, কিন্তু কিভাবে পাসওয়ার্ড সংরক্ষণে এটি সাহায্য করে? Blowfish একটি সাধারণ উদ্দেশ্য সাইফার, এটি দুটি উপায়ে কাজ করে। এটি এনক্রিপ্ট করা যেতে পারে, এটি ডিক্রিপ্ট করা যেতে পারে। পাসওয়ার্ড একটি এক-উপায় হ্যাশিং ফাংশন প্রয়োজন।
ব্যাখ্যা কি?
আপনি পিএইচপি এর crypt()
ফাংশন ব্যবহার করে এবং একটি যথাযথ Blowfish লবণ ব্যবহার করে bcrypt সহ এক-উপায় হ্যাশ তৈরি করতে পারেন। পুরো সমীকরণের মধ্যে সবচেয়ে গুরুত্বপূর্ণ হল এ) অ্যালগরিদমটি আপোস করা হয়নি এবং B) আপনি সঠিকভাবে প্রতিটি পাসওয়ার্ড লবণ করেন । একটি অ্যাপ্লিকেশন-প্রশস্ত লবণ ব্যবহার করবেন না; যে রেনবো টেবিল একটি একক সেট থেকে আক্রমণ করার জন্য আপনার সমগ্র অ্যাপ্লিকেশন খোলে।
তাই, আপনি bcrypt ব্যবহার করতে চান? অসাধারণ! যাইহোক, ক্রিপ্টোগ্রাফি অন্যান্য এলাকার মত, আপনি এটা নিজেকে করা উচিত নয়। যদি আপনি কী কী পরিচালনার কী, লবণ সঞ্চয় বা এলোমেলো সংখ্যাগুলি তৈরি করার বিষয়ে চিন্তা করতে চান, তবে আপনি এটি ভুল করছেন।
কারণ সহজ: এটি bcrypt স্ক্রু আপ তাই তুচ্ছভাবে সহজ। আসলে, যদি আপনি এই পৃষ্ঠায় প্রায় প্রতিটি কোডের কোডটি দেখেন, তবে আপনি লক্ষ্য করবেন যে এটি অন্তত একটি সাধারণ সমস্যাগুলির লঙ্ঘন করছে।
এটা মুখ, ক্রিপ্টোগ্রাফি কঠিন।
বিশেষজ্ঞদের জন্য এটি ছেড়ে দিন। এই লাইব্রেরি বজায় রাখার জন্য যারা কাজ করে তাদের জন্য এটি ছেড়ে দিন। যদি আপনি একটি সিদ্ধান্ত নিতে হবে, আপনি এটা ভুল করছেন।
পরিবর্তে, শুধু একটি লাইব্রেরি ব্যবহার করুন। বিভিন্ন আপনার প্রয়োজনীয়তা উপর নির্ভর করে বিদ্যমান।
লাইব্রেরি
এখানে আরো কিছু সাধারণ API এর একটি ভাঙ্গন হয়।
পিএইচপি 5.5 এপিআই - 5.3.7+ এর জন্য উপলব্ধ
পিএইচপি 5.5 এ শুরু, হ্যাশিং পাসওয়ার্ডের জন্য একটি নতুন API চালু করা হচ্ছে। 5.3.7+ এর জন্য একটি শিম সামঞ্জস্যযোগ্য লাইব্রেরি (আমার দ্বারা) রক্ষণাবেক্ষণও রয়েছে। এটি বাস্তবায়ন ব্যবহার করার জন্য পিয়ার-পর্যালোচনার এবং সহজ হওয়ার সুবিধা রয়েছে।
function register($username, $password) {
$hash = password_hash($password, PASSWORD_BCRYPT);
save($username, $hash);
}
function login($username, $password) {
$hash = loadHashByUsername($username);
if (password_verify($password, $hash)) {
//login
} else {
// failure
}
}
সত্যিই, এটি অত্যন্ত সহজ হতে লক্ষ্য করা হয়।
সম্পদ:
- ডকুমেন্টেশন: পিএইচপি.net উপর
- সামঞ্জস্য গ্রন্থাগার: GitHub উপর
- পিএইচপি এর RFC: wiki.php.net উপর
Zend \ Crypt \ পাসওয়ার্ড \ bcrypt (5.3.2+)
এটি একটি অন্য API যা পিএইচপি 5.5 এর মতো, এবং একই রকম কাজ করে।
function register($username, $password) {
$bcrypt = new Zend\Crypt\Password\Bcrypt();
$hash = $bcrypt->create($password);
save($user, $hash);
}
function login($username, $password) {
$hash = loadHashByUsername($username);
$bcrypt = new Zend\Crypt\Password\Bcrypt();
if ($bcrypt->verify($password, $hash)) {
//login
} else {
// failure
}
}
সম্পদ:
- ডকুমেন্টেশন: Zend উপর
- ব্লগ পোস্ট: জেন্ড ক্রিপ্ট দিয়ে পাসওয়ার্ড হাশিং
PasswordLib
এই পাসওয়ার্ড হ্যাশিং একটি সামান্য ভিন্ন পদ্ধতির। সহজভাবে bcrypt সমর্থন করার পরিবর্তে, PasswordLib হাশিং অ্যালগরিদমগুলির একটি বৃহত সংখ্যক সমর্থন করে। এটি মূলত প্রসঙ্গগুলিতে দরকারী যেখানে আপনাকে আপনার নিয়ন্ত্রণের বাইরে হতে পারে এমন উত্তরাধিকার এবং বৈষম্যমূলক সিস্টেমগুলির সাথে সামঞ্জস্য সমর্থন করতে হবে। এটা হাশিং অ্যালগরিদম একটি বড় সংখ্যা সমর্থন করে। এবং 5.3.2+ সমর্থিত
function register($username, $password) {
$lib = new PasswordLib\PasswordLib();
$hash = $lib->createPasswordHash($password, '$2y$', array('cost' => 12));
save($user, $hash);
}
function login($username, $password) {
$hash = loadHashByUsername($username);
$lib = new PasswordLib\PasswordLib();
if ($lib->verifyPasswordHash($password, $hash)) {
//login
} else {
// failure
}
}
তথ্যসূত্র:
- উত্স কোড / ডকুমেন্টেশন: GitHub
PHPASS
এটি একটি স্তর যা bcrypt সমর্থন করে তবে এটি একটি কার্যকর শক্তিশালী অ্যালগরিদমকেও সমর্থন করে যা আপনার কাছে পিএইচপি অ্যাক্সেস না থাকলে => 5.3.2 ... এটি আসলে পিএইচপি 3.0+ (যদিও bcrypt এর সাথে নয়) সমর্থন করে।
function register($username, $password) {
$phpass = new PasswordHash(12, false);
$hash = $phpass->HashPassword($password);
save($user, $hash);
}
function login($username, $password) {
$hash = loadHashByUsername($username);
$phpass = new PasswordHash(12, false);
if ($phpass->CheckPassword($password, $hash)) {
//login
} else {
// failure
}
}
সম্পদ
- কোড: cvsweb
- প্রকল্প সাইট: ওপেনওয়াল
- <5.3.0 অ্যালগরিদম পর্যালোচনা: স্ট্যাকঅভারফ্লোতে
দ্রষ্টব্য: ওপেনওয়ালে হোস্ট করা না থাকা পিএইচপিএএসএস বিকল্পগুলি ব্যবহার করবেন না, তারা বিভিন্ন প্রকল্প !!!
BCrypt সম্পর্কে
আপনি যদি লক্ষ্য করেন, এই লাইব্রেরিগুলির প্রত্যেকটি একটি একক স্ট্রিং প্রদান করে। যে কারণে BCrypt অভ্যন্তরীণভাবে কাজ করে। এবং যে সম্পর্কে উত্তর একটি টন আছে। এখানে একটি নির্বাচন যা আমি লিখেছি, আমি এখানে অনুলিপি / পেস্ট করব না, তবে এতে লিঙ্ক করুন:
- হ্যাশিং এবং এনক্রিপশন অ্যালগরিদমগুলির মধ্যে মৌলিক পার্থক্য - শব্দভাণ্ডার এবং তাদের সম্পর্কে কিছু মৌলিক তথ্য ব্যাখ্যা করা।
- রৌদ্রোজ্জ্বল টেবিল ছাড়া হ্যাশ বিপরীত সম্পর্কে - মূলত কেন আমরা প্রথম স্থানে bcrypt ব্যবহার করা উচিত ...
- ব্রেস্রিপ্ট হ্যাশে সংরক্ষণ করা - মূলত কেন লবণ এবং অ্যালগরিদম হ্যাশ ফলাফল অন্তর্ভুক্ত।
- কিভাবে bcrypt হ্যাশের খরচ আপডেট করতে হবে - মূলত কিভাবে চয়ন এবং তারপর bcrypt হ্যাশ খরচ বজায় রাখা।
- কিভাবে bcrypt এর সাথে দীর্ঘ পাসওয়ার্ড হ্যাশ করতে হবে - 72 ক্যারেক্টারের পাসওয়ার্ড সীমা ব্যাখ্যা করে bcrypt।
- কিভাবে bcrypt লবণ ব্যবহার করে
- Salting এবং peppering পাসওয়ার্ডের সেরা অভ্যাস - মূলত, একটি "মরিচ" ব্যবহার করবেন না
- পুরানো
md5
পাসওয়ার্ড bcrypt মাইগ্রেশন
শেষ করি
অনেক বিভিন্ন পছন্দ আছে। আপনি যা চয়ন করুন আপনার উপর। যাইহোক, আমি আপনার জন্য এটি পরিচালনা করার জন্য উপরের লাইব্রেরিগুলির মধ্যে একটি ব্যবহার করার সুপারিশ করব।
আবার, যদি আপনি সরাসরি crypt()
ব্যবহার করছেন তবে আপনি সম্ভবত কিছু ভুল করছেন। যদি আপনার কোড hash()
(অথবা md5()
বা sha1()
) ব্যবহার করে সরাসরি হয়, আপনি প্রায়শই কিছু ভুল করছেন।
শুধু একটি লাইব্রেরি ব্যবহার করুন ...
পিএইচপি সংস্করণ 5.5 এর জন্য BCrypt এর জন্য বিল্ট-ইন সাপোর্ট থাকবে, ফাংশন password_hash()
এবং password_verify()
। প্রকৃতপক্ষে এইগুলি ফাংশন crypt()
চারপাশে কেবল মোড়ানো এবং এটি সঠিকভাবে এটি ব্যবহার করা সহজ করবে। এটি একটি নিরাপদ এলোমেলো লবণ প্রজন্মের যত্ন নেয়, এবং ভাল ডিফল্ট মান প্রদান করে।
এই ফাংশন ব্যবহার করার সবচেয়ে সহজ উপায় হবে:
$hashToStoreInDb = password_hash($password, PASSWORD_BCRYPT);
$isPasswordCorrect = password_verify($password, $existingHashFromDb);
এই কোডটি BCrypt (অ্যালগরিদম 2y
) এর সাথে পাসওয়ার্ড হ্যাশ করবে, ওএস র্যান্ডম উত্স থেকে একটি র্যান্ডম লবণ তৈরি করবে এবং ডিফল্ট খরচ প্যারামিটারটি ব্যবহার করবে (এই মুহুর্তে এটি 10)। দ্বিতীয় লাইন চেক করে, ব্যবহারকারী পাসওয়ার্ড প্রবেশ করে যদি ইতিমধ্যে একটি সংরক্ষিত হ্যাশ-মান মেলে।
আপনি যদি মূল্যের প্যারামিটারটি পরিবর্তন করতে চান তবে আপনি এটি করতে পারেন, 1 দ্বারা খরচ প্যারামিটার বাড়ানো, হ্যাশ মান গণনা করার জন্য প্রয়োজনীয় সময়টিকে দ্বিগুণ করে:
$hash = password_hash($password, PASSWORD_BCRYPT, array("cost" => 11));
"cost"
প্যারামিটারের বিপরীতে, "salt"
পরামিতিটি বাদ দেওয়া সর্বোত্তম, কারন ফাংশন ইতোমধ্যে ক্রিপ্টোগ্রাফিক্যাল নিরাপদ লবণ তৈরির জন্য যথাসাধ্য করে।
পিএইচপি সংস্করণ 5.3.7 এবং পরবর্তীতে, একই লেখক থেকে password_hash()
ফাংশন তৈরি করে একটি সামঞ্জস্য প্যাক বিদ্যমান। 5.3.7 এর আগে পিএইচপি সংস্করণের জন্য 2y
সাথে crypt()
জন্য কোন সমর্থন নেই, ইউনিকোড নিরাপদ BCrypt অ্যালগরিদম। এর পরিবর্তে এটি 2a
পরিবর্তে প্রতিস্থাপন করতে পারে, যা পূর্ববর্তী পিএইচপি সংস্করণগুলির জন্য সর্বোত্তম বিকল্প।
সম্পাদনা: 2013.01.15 - আপনার সার্ভার এটি সমর্থন করবে, পরিবর্তে martinstoeckli এর সমাধান ব্যবহার করুন।
প্রত্যেকের চেয়ে এটি আরও জটিল করতে চায়। ক্রিপ্ট () ফাংশন অধিকাংশ কাজ করে।
function blowfishCrypt($password,$cost)
{
$chars='./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
$salt=sprintf('$2y$%02d$',$cost);
//For PHP < PHP 5.3.7 use this instead
// $salt=sprintf('$2a$%02d$',$cost);
//Create a 22 character salt -edit- 2013.01.15 - replaced rand with mt_rand
mt_srand();
for($i=0;$i<22;$i++) $salt.=$chars[mt_rand(0,63)];
return crypt($password,$salt);
}
উদাহরণ:
$hash=blowfishCrypt('password',10); //This creates the hash
$hash=blowfishCrypt('password',12); //This creates a more secure hash
if(crypt('password',$hash)==$hash){ /*ok*/ } //This checks a password
আমি জানি এটি সুস্পষ্ট হওয়া উচিত, তবে দয়া করে আপনার পাসওয়ার্ড হিসাবে 'পাসওয়ার্ড' ব্যবহার করবেন না।
OAuth 2 পাসওয়ার্ডের জন্য:
$bcrypt = new \Zend\Crypt\Password\Bcrypt;
$bcrypt->create("youpasswordhere", 10)