এখানে সমস্যাটি মূলত এন্ট্রপির সমস্যা। সুতরাং আসুন সেখানে সন্ধান শুরু করুন:
অক্ষর প্রতি এনট্রপি
বাইট প্রতি এনট্রপির বিটের সংখ্যা হ'ল:
- হেক্স অক্ষর
- বিট: 4
- মান: 16
- এন্ট্রপি 72 চরগুলিতে: 288 বিট
- আলফা-সংখ্যাসূচক
- বিট: 6
- মান: 62
- এন্ট্রপি 72 চরগুলিতে: 432 বিট
- "সাধারণ" চিহ্ন
- বিট: 6.5
- মান: 94
- এন্ট্রপি 72 চরগুলিতে: 468 বিট
- ফুল বাইটস
- বিটস: 8
- মান: 255
- এন্ট্রপি 72 চরগুলিতে: 576 বিট
সুতরাং, আমরা কীভাবে আচরণ করব তা নির্ভর করে আমরা কী ধরণের অক্ষর আশা করি।
প্রথম সমস্যা
আপনার কোডের সাথে প্রথম সমস্যাটি হ'ল আপনার "মরিচ" হ্যাশ ধাপটি হেক্স অক্ষরগুলি আউটপুট করছে (যেহেতু চতুর্থ প্যারামিটারটি hash_hmac()
সেট করা নেই)।
অতএব, আপনার মরিচটি হ্যাশ করে, আপনি কার্যকরভাবে পাসওয়ার্ডে প্রাপ্ত সর্বাধিক এনট্রপিটি 2 এর একটি ফ্যাক্টর দ্বারা (576 থেকে 288 সম্ভাব্য বিটগুলি) কাটাচ্ছেন ।
দ্বিতীয় সমস্যা
তবে sha256
শুধুমাত্র 256
প্রথম স্থানে এনট্রপির বিট সরবরাহ করে। সুতরাং আপনি কার্যকরভাবে একটি সম্ভাব্য 576 বিট কেটে 256 বিট করতে পারেন। আপনার হ্যাশ ধাপ * তাত্ক্ষণিক *, খুব সংজ্ঞা
দিয়ে পাসওয়ার্ডে কমপক্ষে 50% সম্ভাব্য এনট্রপি হারাবে।
আপনি আংশিকভাবে এটিকে স্যুইচ SHA512
করেই সমাধান করতে পারেন , যেখানে আপনি কেবল উপলব্ধ এনট্রপিকে প্রায় 12% কমাতে চাইবেন। তবে এটি এখনও একটি তাত্পর্যপূর্ণ নয়। যে 12% একটি ফ্যাক্টর দ্বারা অনুমতি সংখ্যা হ্রাস 1.8e19
। এটি একটি বড় সংখ্যা ... এবং এটাই হ'ল এটি হ্রাস করে ...
অন্তর্নিহিত সমস্যা
অন্তর্নিহিত সমস্যাটি হ'ল এখানে types২ টি অক্ষরের উপরে তিন ধরণের পাসওয়ার্ড রয়েছে। এই স্টাইল সিস্টেমটি তাদের উপর যে প্রভাব ফেলেছে তা খুব আলাদা হবে:
দ্রষ্টব্য: এখান থেকে আমি ধরে নিচ্ছি যে আমরা একটি মরিচ সিস্টেমের সাথে তুলনা করছি যা SHA512
কাঁচা আউটপুট (হেক্স নয়) ব্যবহার করে।
উচ্চ এনট্রপি এলোমেলো পাসওয়ার্ড
এটি আপনার ব্যবহারকারীরা পাসওয়ার্ড জেনারেটর ব্যবহার করে যা পাসওয়ার্ডের জন্য বড় কীগুলির পরিমাণ পরিমাণ উত্পন্ন করে। এগুলি এলোমেলো (উত্পাদিত, মানব নির্বাচিত নয়) এবং চরিত্র অনুসারে উচ্চ এনট্রপি রয়েছে। এই ধরণের উচ্চ বাইটস (অক্ষর> 127) এবং কিছু নিয়ন্ত্রণ অক্ষর ব্যবহার করা হচ্ছে।
এই গোষ্ঠীর জন্য, আপনার হ্যাশিং ফাংশনটি তাদের উপলভ্য এনট্রপিকে উল্লেখযোগ্যভাবে হ্রাস করবে bcrypt
।
আমাকে এটা আবার বলতে দাও। যারা উচ্চ এনট্রপি, দীর্ঘ পাসওয়ার্ড ব্যবহার করছেন তাদের জন্য, আপনার সমাধান পরিমাপযোগ্য পরিমাণে তাদের পাসওয়ার্ডের শক্তি উল্লেখযোগ্যভাবে হ্রাস করে। (Character২ টি অক্ষরের পাসওয়ার্ডের জন্য এন্ট্রপির 62২ বিট হারিয়েছে এবং আরও দীর্ঘ পাসওয়ার্ডের জন্য আরও বেশি)
মাঝারি এনট্রপি এলোমেলো পাসওয়ার্ড
এই গোষ্ঠীটি সাধারণ চিহ্ন সহ পাসওয়ার্ড ব্যবহার করছে তবে উচ্চ বাইট বা নিয়ন্ত্রণের অক্ষর নেই। এগুলি আপনার টাইপযোগ্য পাসওয়ার্ড।
এই গোষ্ঠীর জন্য, আপনি আরও এনট্রপিটি সামান্য আনলক করতে যাচ্ছেন (এটি তৈরি করবেন না, তবে আরও এনট্রপিকে বিসিপি পাসওয়ার্ডের সাথে ফিট করার অনুমতি দিন)। আমি যখন কিছুটা বলি, তখন আমি কিছুটা বুঝি। ব্রেকটি-ইভেন্টটি ঘটে যখন আপনি SHA512-এ থাকা 512 বিট সর্বাধিক আউট করেন। সুতরাং, শীর্ষটি 78 টি অক্ষরে রয়েছে।
আমাকে এটা আবার বলতে দাও। এই শ্রেণীর পাসওয়ার্ডগুলির জন্য, এনট্রপি চালিয়ে যাওয়ার আগে আপনি কেবলমাত্র অতিরিক্ত 6 টি অক্ষর সংরক্ষণ করতে পারেন।
নিম্ন এনট্রপি অ-র্যান্ডম পাসওয়ার্ড
এটি এমন গোষ্ঠী যা আলফা-সংখ্যাসূচক অক্ষর ব্যবহার করছে যা সম্ভবত এলোমেলোভাবে তৈরি করা হয়নি। বাইবেলের উদ্ধৃতি বা এর মতো কিছু। এই বাক্যাংশগুলিতে চরিত্র অনুসারে এনট্রপির প্রায় 2.3 বিট থাকে।
এই গোষ্ঠীর জন্য, আপনি হ্যাশিংয়ের মাধ্যমে আরও এনট্রপিকে উল্লেখযোগ্যভাবে আনলক করতে পারেন (এটি তৈরি করবেন না, তবে আরও কিছুকে ব্রিসিপ পাসওয়ার্ড ইনপুটটিতে ফিট করার অনুমতি দিন) hing আপনার এনট্রাপি শেষ হওয়ার আগে ব্রেকাকেন প্রায় 223 টি অক্ষর।
আবার এটি বলা যাক। এই শ্রেণীর পাসওয়ার্ডগুলির জন্য, প্রাক-হ্যাশিং অবশ্যই সুরক্ষাকে উল্লেখযোগ্যভাবে বৃদ্ধি করে।
বাস্তব জগতে ফিরে যাও
এই ধরণের এনট্রপি গণনাগুলি সত্যিকারের বিশ্বে সত্যিই বেশি কিছু যায় আসে না। কী গুরুত্বপূর্ণ তা এনট্রপি অনুমান করা। আক্রমণকারীরা যা করতে পারে তা প্রত্যক্ষভাবে এটি ঘটে। এটিই আপনি সর্বোচ্চ করতে চান to
এনট্রপি অনুমান করার ক্ষেত্রে যে সামান্য গবেষণা রয়েছে, সেখানে কিছু পয়েন্ট রয়েছে যা আমি উল্লেখ করতে চাই।
একসাথে 72 টি সঠিক অক্ষর এলোমেলোভাবে অনুমান করার সম্ভাবনাগুলি খুব কম। এই সংঘর্ষের চেয়ে আপনি 21 বার পাওয়ারবল লটারি জয়ের সম্ভাবনা বেশি ... আমরা যে সংখ্যার কথা বলছি তার মধ্যে এটি কত বড়।
তবে আমরা এটি পরিসংখ্যানগতভাবে হোঁচট খেতে পারি না। বাক্যাংশের ক্ষেত্রে প্রথম characters২ টি অক্ষর একই হওয়ার সম্ভাবনা এলোমেলো পাসওয়ার্ডের চেয়ে পুরো অনেক বেশি। তবে এটি এখনও তুচ্ছভাবে কম (আপনার চরিত্রের 2.3 বিটের উপর ভিত্তি করে 5 বার পাওয়ারবল লটারি জয়ের সম্ভাবনা বেশি))
ব্যবহারিকভাবে
ব্যবহারিকভাবে, এটি আসলে কিছু যায় আসে না। প্রথম 72 টি অক্ষরটি সঠিকভাবে অনুমান করার কারও সম্ভাবনা, যেখানে উত্তরোত্তররা উল্লেখযোগ্য পার্থক্য রাখে এটি এতটা চিন্তিত নয়। কেন?
ঠিক আছে, যাক আপনি একটি বাক্য গ্রহণ করছেন। যদি ব্যক্তি প্রথম 72 টি অক্ষর সঠিকভাবে পেতে পারে তবে সেগুলি সত্যিই ভাগ্যবান (সম্ভবত না), অথবা এটি একটি সাধারণ বাক্যাংশ। যদি এটি একটি সাধারণ বাক্যাংশ হয় তবে কেবলমাত্র এটি পরিবর্তন করতে হবে।
একটি উদাহরণ নেওয়া যাক। আসুন বাইবেলের একটি উদ্ধৃতি নিই (কেবল কারণ এটি দীর্ঘ পাঠের সাধারণ উত্স, অন্য কোনও কারণে নয়):
তোমরা প্রতিবেশীর বাড়ী লোভ করবে না। “তোমাদের প্রতিবেশীর স্ত্রী, তার চাকর বা দাসী, তার গরু বা গাধা বা কোনও প্রতিবেশীর সম্পত্তি লোভ করো না।
এটি 180 টি অক্ষর। 73rd চরিত্র g
দ্বিতীয় neighbor's
। যদি আপনি এটি অনুমান করে থাকেন তবে আপনি সম্ভবত থামছেন না nei
, তবে বাকী আয়াতটি চালিয়ে যাচ্ছেন (যেহেতু পাসওয়ার্ডটি সম্ভবত ব্যবহার করা হতে পারে)। অতএব, আপনার "হ্যাশ" তেমন কিছু যোগ করেনি।
বিটিডাব্লু: আমি একদম বাইবেলের উক্তিটি ব্যবহারের পক্ষে পরামর্শ দিচ্ছি না। আসলে, ঠিক বিপরীত।
উপসংহার
আপনি লোকেদের প্রথমে হ্যাশ করে দীর্ঘ পাসওয়ার্ড ব্যবহার করে এমন লোকদের সত্যই সহায়তা করতে যাচ্ছেন না। কিছু গ্রুপ আপনি অবশ্যই সাহায্য করতে পারেন। কিছু আপনি অবশ্যই আঘাত করতে পারেন।
কিন্তু শেষ পর্যন্ত, এর কোনওটিই অত্যধিক তাত্পর্যপূর্ণ নয়। আমরা যে সংখ্যাগুলির সাথে আচরণ করছি সেগুলি কেবলমাত্র ওয়েই খুব বেশি। এন্ট্রপিতে পার্থক্য খুব বেশি হবে না।
বিসিক্রিপটি যেমন রয়েছে তেমন ছেড়ে দেওয়া ভাল। আপনি যে আক্রমণটি প্রতিরোধ করার চেষ্টা করছেন তার চেয়ে আপনি হ্যাশিংয়ের ক্ষতি করার সম্ভাবনা বেশি (আক্ষরিক অর্থে, আপনি এটি ইতিমধ্যে শেষ করেছেন এবং আপনি যে ভুলটি করেছেন তা আপনি প্রথম বা শেষ নন)।
সাইটটির বাকি অংশগুলি সুরক্ষায় ফোকাস করুন। এবং পাসওয়ার্ড শক্তি চিহ্নিত করতে নিবন্ধের জন্য পাসওয়ার্ড বাক্সে একটি পাসওয়ার্ড এনট্রপি মিটার যুক্ত করুন (এবং যদি কোনও পাসওয়ার্ড অতি দীর্ঘ হয় যা ব্যবহারকারী এটি পরিবর্তন করতে চান) ...
এটি আমার কমপক্ষে 0.02 ডলার (অথবা সম্ভবত $ 0.02 এরও বেশি উপায়) ...
যতক্ষণ না "গোপন" গোলমরিচ ব্যবহার করছেন:
একটি হ্যাশ ফাংশনটি বিসিআরপিতে খাওয়ানোর জন্য আক্ষরিক কোনও গবেষণা নেই। সুতরাং, এটি একেবারেই অস্পষ্ট নয় যদি কোনও "পেপ্পার্ড" হ্যাশকে বিক্রিপটে খাওয়ানো কখনই অজানা দুর্বলতার কারণ হয়ে দাঁড়ায় (আমরা জানি যে hash1(hash2($value))
এটি করা সংঘর্ষ প্রতিরোধের এবং প্রাক আক্রমণাত্মক আক্রমণগুলির চারপাশে উল্লেখযোগ্য দুর্বলতা প্রকাশ করতে পারে)।
আপনি ইতিমধ্যে একটি গোপন কী ("মরিচ") সংরক্ষণ করার কথা বিবেচনা করে বিবেচনা করছেন, কেন এটি ভালভাবে অধ্যয়ন এবং বোঝার উপায়ে ব্যবহার করবেন না? হ্যাশ সংরক্ষণের আগে কেন এনক্রিপ্ট করবেন না?
মূলত, পাসওয়ার্ডটি হ্যাশ করার পরে, পুরো হ্যাশ আউটপুটটিকে একটি শক্তিশালী এনক্রিপশন অ্যালগরিদমে ফিড করুন। তারপরে এনক্রিপ্ট করা ফলাফল সংরক্ষণ করুন।
এখন, এসকিউএল-ইনজেকশন আক্রমণ কার্যকর কিছু ফাঁস করবে না, কারণ তাদের কাছে সিফার কী নেই। এবং যদি কীটি ফাঁস হয়ে যায় তবে আক্রমণকারীরা এর চেয়ে ভাল নয় যদি আপনি একটি সরল হ্যাশ ব্যবহার করেন (যা প্রমাণযোগ্য, মরিচের "প্রি-হ্যাশ" সরবরাহ করে না)।
দ্রষ্টব্য: আপনি যদি এটি করা চয়ন করেন তবে একটি লাইব্রেরি ব্যবহার করুন। পিএইচপি-র জন্য, আমি জেন্ডার ফ্রেমওয়ার্ক 2 এর প্যাকেজটিকে দৃ strongly ়ভাবে প্রস্তাব দিই Zend\Crypt
। এই বর্তমান সময়ে আমি কেবলমাত্র এটিই প্রস্তাব করব। এটি দৃ strongly়ভাবে পর্যালোচনা করা হয়েছে, এবং এটি আপনার জন্য সমস্ত সিদ্ধান্ত নেয় (যা খুব ভাল জিনিস) ...
কিছুটা এইরকম:
use Zend\Crypt\BlockCipher;
public function createHash($password) {
$hash = password_hash($password, PASSWORD_BCRYPT, ["cost"=>$this->cost]);
$blockCipher = BlockCipher::factory('mcrypt', array('algo' => 'aes'));
$blockCipher->setKey($this->key);
return $blockCipher->encrypt($hash);
}
public function verifyHash($password, $hash) {
$blockCipher = BlockCipher::factory('mcrypt', array('algo' => 'aes'));
$blockCipher->setKey($this->key);
$hash = $blockCipher->decrypt($hash);
return password_verify($password, $hash);
}
এবং এটি উপকারী কারণ আপনি সমস্ত অ্যালগরিদমগুলি এমনভাবে ব্যবহার করছেন যা ভালভাবে বোঝা যায় এবং ভালভাবে অধ্যয়ন করা হয় (তুলনামূলকভাবে অন্তত)। মনে রাখবেন:
যে কোনও ব্যক্তি, সবচেয়ে ক্লাসহীন অপেশাদার থেকে সেরা ক্রিপ্টোগ্রাফার পর্যন্ত, একটি অ্যালগরিদম তৈরি করতে পারে যা সে নিজেই ভেঙে দিতে পারে না।