Bcrypt বিল্ট-ইন লবণ থাকতে পারে?


615

কোডা হালের "নিখুঁতভাবে পাসওয়ার্ড কীভাবে সংরক্ষণ করবেন" নিবন্ধটিতে দাবি করা হয়েছে:

রেনবো টেবিলের আক্রমণ প্রতিরোধ করতে বিসিক্রিপ্টের অন্তর্নির্মিত লবণ রয়েছে।

তিনি এই কাগজটি উদ্ধৃত করেছেন , যা বলে যে ওপেনবিএসডি এর বাস্তবায়নে bcrypt:

ওপেনবিএসডি একটি আরকফোর (আরক 4 ব্র্যান্ডম (3)) কী স্ট্রিম থেকে 128-বিট বিক্রিপ্ট লবণ উত্পন্ন করে, কার্নেলটি ডিভাইসের সময় থেকে সংগ্রহ করে এলোমেলো ডেটা সহ।

আমি বুঝতে পারি না এটি কীভাবে কাজ করতে পারে। আমার একটি লবণ সম্পর্কে ধারণা:

  • এটি প্রতিটি সঞ্চিত পাসওয়ার্ডের জন্য আলাদা হওয়া দরকার, যাতে প্রতিটিটির জন্য একটি পৃথক রেইনবো টেবিল তৈরি করতে হয়
  • এটি অন্য কোথাও সংরক্ষণ করা দরকার যাতে এটি পুনরাবৃত্তিযোগ্য: যখন কোনও ব্যবহারকারী লগ ইন করার চেষ্টা করে, আমরা তাদের পাসওয়ার্ড চেষ্টা করি, একইভাবে লবণ এবং হ্যাশ প্রক্রিয়াটি পুনরায় পুনরুদ্ধার করি যখন আমরা মূলত তাদের পাসওয়ার্ড সংরক্ষণ করি এবং তুলনা করি

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

সংক্ষেপে, কীভাবে Bcrypt বিল্ট-ইন লবণ থাকতে পারে ?

উত্তর:


789

এটি বিসিআরপিট:

এলোমেলো লবণ তৈরি করুন। একটি "ব্যয়" ফ্যাক্টর প্রাক কনফিগার করা হয়েছে। একটি পাসওয়ার্ড সংগ্রহ করুন।

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

যখন কেউ প্রমাণীকরণের চেষ্টা করে, সঞ্চিত খরচ এবং লবণ পুনরুদ্ধার করে। ইনপুট পাসওয়ার্ড, খরচ এবং লবণ থেকে একটি কী বের করুন। একই সুপরিচিত স্ট্রিংটি এনক্রিপ্ট করুন। উত্পন্ন সাইফার পাঠ্য যদি সঞ্চিত সাইফার পাঠ্যের সাথে মেলে তবে পাসওয়ার্ডটি একটি মিল।

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


ডাটাবেসের মধ্যে সঞ্চিত, একটি bcrypt"হ্যাশ" দেখতে এরকম কিছু হতে পারে:

$ 2A $ 10 $ vI8aWBnW3fID.ZQ4 / zo1G.q1lRps.9cGLcZEiGDMVr5yUP1KUOYTa

এটি আসলে তিনটি ক্ষেত্র, "$" দ্বারা সীমাবদ্ধ:

  • 2abcryptব্যবহৃত আলগোরিদিম সংস্করণ সনাক্ত করে ।
  • 10খরচ ব্যয়; কী ডেরাইভেশন ফাংশনটির 2 10 টি পুনরাবৃত্তি ব্যবহার করা হয় (যা যথেষ্ট নয়, উপায় হিসাবে আমি 12 বা তার বেশি দামের প্রস্তাব দিই))
  • vI8aWBnW3fID.ZQ4/zo1G.q1lRps.9cGLcZEiGDMVr5yUP1KUOYTaলবণ এবং সাইফার পাঠ্যটি, সংশোধিত বেস-64৪ এ সংলগ্ন এবং এনকোডযুক্ত। প্রথম 22 টি অক্ষর লবণের জন্য একটি 16-বাইট মানকে ডিকোড করে। বাকি অক্ষরগুলি প্রমাণীকরণের জন্য তুলনা করার জন্য সিফার পাঠ্য।

কোডা হালের রুবি বাস্তবায়নের জন্য ডকুমেন্টেশন থেকে এই উদাহরণটি নেওয়া হয়েছে


6
10 এর ব্যয় গুণক কেন পর্যাপ্ত হবে না সে সম্পর্কে আপনার আরও বিশদ রয়েছে? গ্রিলগুলিতে, আমি লক্ষ্য করেছি যে 10 হ'ল বিস্ক্রিপ্টের জন্য কস্ট ফ্যাক্টর / লগ রাউন্ডগুলির জন্য ডিফল্ট মান তাই এটি আপনার পরামর্শ অনুসারে আপডেট করার উপযুক্ত।
pm_labs

57
বিক্রিপ্টের জন্য ব্যয় ফ্যাক্টরটি তাত্পর্যপূর্ণ বা বরং, 10 এর ব্যয়যুক্ত ফ্যাক্টরটির অর্থ 2 ^ 10 রাউন্ড (1024), 16 এর ব্যয় ফ্যাক্টরটির অর্থ 2 ^ 16 রাউন্ড (65536) হবে। এটি স্বাভাবিক যে এটি 5-10 সেকেন্ড সময় নেয়। এটির ব্যয় 10 হিসাবে যত বেশি সময় লাগে এটি প্রায় 64 বার লাগবে। অন্যান্য ভুল তথ্য পরিষ্কার করতে, পিএইচপি-র ক্রিপ্ট ফাংশনটি ইউনিক্স ক্রিপ্ট লাইব্রেরি ব্যবহার করে যা সি তে প্রয়োগ করা হয়।
থোমাস্রুটার

3
@ টিজেচ্যাম্বার্স ঠিক আছে; আপনি যদি অ্যাকাউন্টে পাসওয়ার্ড সেট করতে পারেন তবে আপনি প্রমাণীকরণ করতে সক্ষম হবেন। পাসওয়ার্ড হ্যাশিং আক্রমণটি প্রতিরোধ করার উদ্দেশ্যে নয়। এর অর্থ হ'ল কোনও আক্রমণকারীকে পাসওয়ার্ড টেবিলটিতে কেবল পাঠযোগ্য অ্যাক্সেস সহ প্রামাণ্যতা থেকে বিরত রাখা। উদাহরণস্বরূপ, আপনি এটির টেবিলটি সহ একটি ব্যাকআপ টেপ পান।
এরিকসন

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

1
@ এনএলভি এটি ব্রাইক্রিপ স্পেসিফিকেশনে সংজ্ঞায়িত একটি স্ট্রিং:"OrpheanBeholderScryDoubt"
ইরিকসন

181

আমি বিশ্বাস করি যে বাক্যাংশটি নিম্নরূপে বলা উচিত ছিল:

বিক্রিপ্টে রেইনবো টেবিলের আক্রমণ প্রতিরোধ করার জন্য উত্পন্ন হ্যাশগুলিতে সল্ট রয়েছে ।

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


20
ঠিক আছে, তাই আমি কোনও সাইটের জন্য সাইন আপ করব এবং "foo" পাসওয়ার্ডটি বেছে নিই। Bcrypt"akd2! *" এর এলোমেলো লবণ যুক্ত করে, যার ফলে "fooakd2! *" হয়, যা হ্যাশ করে সংরক্ষণ করা হয়। পরে, আমি পাসওয়ার্ড "বার" দিয়ে সাইন ইন করার চেষ্টা করি। আমি সঠিক কিনা তা দেখতে, "বারাকডি 2! *" হ্যাশ করা দরকার। শুরু করার জন্য যদি লব এলোমেলোভাবে উত্পাদিত হয়, তবে এটি কীভাবে জানতে পারে যে কীভাবে এটি "বার" -এ যুক্ত করতে হয় তা হ্যাশিং এবং তুলনা করার আগে?
নাথান লং

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

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

11
@ নাথান তবে কি কোনও আক্রমণকারী কেবল সমস্ত পাসওয়ার্ডের জ্ঞাত সল্টগুলি সরিয়ে এবং তার সাথে একটি টেবিল তৈরি করতে পারে?
অস্কার

3
এইভাবে আমি এটি বুঝতে পারি: ধারণাটি হ'ল প্রতিটি পাসওয়ার্ডের একটি স্বতন্ত্র লবণ থাকে। পাসওয়ার্ড হ্যাশে অন্তর্ভুক্ত লবণটি যাতে একটি হ্যাকারকে প্রতিটি পাসওয়ার্ডের জন্য একটি রংধনু টেবিল তৈরি করতে পারে। এটি একটি মাঝারি ডাটাবেসের জন্য প্রচুর পরিমাণে সময় নেবে। কোনও আক্রমণকারীকে কমিয়ে দেওয়া এবং এভাবে নিষ্ঠুর-জোরপূর্বক অর্থহীন তৈরি করা এই সমস্ত বিষয়।
পিভির্মির

0

জিনিসগুলিকে আরও স্পষ্ট করে তোলার জন্য,

নিবন্ধকরণ / লগইন দিক ->

পাসওয়ার্ড + লবণটি একটি কী থেকে উত্পন্ন কী দ্বারা এনক্রিপ্ট করা হয়: ব্যয়, লবণ এবং পাসওয়ার্ড। আমরা সেই এনক্রিপ্ট করা মানটিকে কল করি cipher text। তারপরে আমরা এই মানটির সাথে লবণ সংযুক্ত করি এবং বেস 64 ব্যবহার করে এটি এনকোড করি। এতে ব্যয় সংযুক্ত করা এবং এটি থেকে উত্পাদিত স্ট্রিং bcrypt:

$2a$COST$BASE64

এই মান অবশেষে সংরক্ষণ করা হয়।

পাসওয়ার্ডটি খুঁজে পেতে আক্রমণকারীটির কী করা দরকার? (অন্য দিক <<)

আক্রমণকারী যদি ডিবির উপর নিয়ন্ত্রণ পেয়ে যায় তবে আক্রমণকারী সহজেই বেস 64 এর মানটি ডিকোড করে তুলবে এবং তারপরে সে লবণ দেখতে সক্ষম হবে। নুন গোপন নয়। যদিও এটি এলোমেলো। তারপরে তার ডিক্রিপ্ট করা দরকার cipher text

আরও গুরুত্বপূর্ণ কী: এই প্রক্রিয়াটিতে কোনও হ্যাশিং নেই, বরং সিপিইউ ব্যয়বহুল এনক্রিপশন - ডিক্রিপশন। সুতরাং এখানে রংধনু টেবিলগুলি কম প্রাসঙ্গিক।


-2

এটি স্প্রিং সিকিউরিটির পাসওয়ার্ড এনকোডার ইন্টারফেস ডকুমেন্টেশন থেকে এসেছে,

 * @param rawPassword the raw password to encode and match
 * @param encodedPassword the encoded password from storage to compare with
 * @return true if the raw password, after encoding, matches the encoded password from
 * storage
 */
boolean matches(CharSequence rawPassword, String encodedPassword);

যার অর্থ, একজনের কাঁচা পাসওয়ার্ডের সাথে মিল রাখতে হবে যা ব্যবহারকারীর পরবর্তী লগইন করার পরে আবার প্রবেশ করবে এবং এটি আগের লগইন / রেজিস্ট্রেশনের সময় ডাটাবেসে থাকা বিক্রিপ্ট এনকোডড পাসওয়ার্ডের সাথে মিলবে।


এটি একেবারেই প্রশ্নের উত্তর দেয় না ... এটি কীভাবে
Bcrypt
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.