জ্যাঙ্গোর SECRET_KEY পরিবর্তন করার প্রভাব


202

আমি একটি ভুল করেছি এবং আমার জ্যাঙ্গো প্রকল্পটিকে SECRET_KEYএকটি সরকারী ভাণ্ডারে প্রতিশ্রুতিবদ্ধ করেছি ।

Https://docs.djangoproject.com/en/dev/ref/settings/#std:setting-SECRET_KEY ডকস অনুসারে এই কীটি গোপন রাখা উচিত ছিল

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

উত্তর:


199

সম্পাদনা করুন: এই উত্তরটি জ্যাঙ্গো 1.5 এর উপর ভিত্তি করে

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

SECRET_KEYপ্রত্যক্ষ বা অপ্রত্যক্ষভাবে ব্যবহার করে জিনিসগুলির তালিকা :

বাস্তবে এখানে তালিকাভুক্ত অনেকগুলি আইটেম ব্যবহার SECRET_KEYকরে django.utils.crypt.get_random_string()যার মাধ্যমে এটি এলোমেলো ইঞ্জিন বীজ করতে ব্যবহার করে। এর মান পরিবর্তনের দ্বারা এটি প্রভাবিত হবে না SECRET_KEY

মান পরিবর্তনের দ্বারা সরাসরি প্রভাবিত ব্যবহারকারীর অভিজ্ঞতা হ'ল:

  • সেশনস, ডেটা ডিকোডটি ভেঙে যাবে, এটি কোনও সেশনের ব্যাকএন্ডের জন্য বৈধ (কুকিজ, ডাটাবেস, ফাইল ভিত্তিক বা ক্যাশে)।
  • ইতিমধ্যে প্রেরিত পাসওয়ার্ড পুনরায় সেট টোকেন কাজ করবে না, ব্যবহারকারীদের একটি নতুন জিজ্ঞাসা করতে হবে।
  • মন্তব্য ফর্ম (যদি ব্যবহার করা হয় django.contrib.comments) যদি মান পরিবর্তনের আগে অনুরোধ করা হয়েছিল এবং মান পরিবর্তনের পরে জমা দেওয়া হয়েছিল তা বৈধ হবে না। আমি মনে করি এটি খুব সামান্য তবে ব্যবহারকারীর জন্য বিভ্রান্তিকর হতে পারে।
  • বার্তাগুলি (থেকে django.contrib.messages) একই মতামত ফর্ম হিসাবে সার্ভার-সাইডটি বৈধতা দেবে না ফর্ম হিসাবে form

আপডেট : এখন ডিজেঙ্গো ১.৯.৫ এ কাজ করা, উত্সটিতে একটি তাত্ক্ষণিক দৃষ্টিভঙ্গি আমাকে একই উত্তর দেয়। পরে একটি পুঙ্খানুপুঙ্খ পরিদর্শন করতে পারে।


1
আমি আমার স্থানীয় ডেভ সার্ভারে SECRET_KEY পরিবর্তন করছি এবং এটি আমাকে লগ আউট করে না, সুতরাং মনে হয় পরিবর্তনের পরে কমপক্ষে সেশন (ক্যাশে) সঠিকভাবে কাজ করবে। আপনি কী বোঝাতে চেয়েছেন data decode will breakএবং আপনি কিছু কোড (জ্যাঙ্গো বা উদাহরণস্বরূপ প্রকল্পে) ভঙ্গ করবেন বলে চিহ্নিত করতে পারেন? সম্পাদনা: এখনও জঙ্গো ১.৪ ব্যবহার করছেন - তা কি?
কিরিল জায়টসেভ

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

যদি এটি পাসওয়ার্ড হ্যাশ লবণের জন্য ব্যবহৃত হয়, তার মানে এই নয় যে ডাটাবেসে পাসওয়ার্ডগুলি পুনরায় সেট করতে হবে?
হেনিং

7
@ হেনিং আমি এমনটি ভাবি না। পাসওয়ার্ড সংরক্ষণ করা হয় যেমন <algorithm>$<iterations>$<salt>$<hash>, auth_user যাতে র্যান্ডম লবণ প্রতিটি ক্ষেত্রে পাসওয়ার্ড পাশাপাশি সংরক্ষণ করা হয়।
ডেনিস ড্র্রেচার

2
জ্যাঙ্গো সংস্করণ> 1.5 এর উত্তরগুলি কি উল্লেখযোগ্যভাবে আলাদা হবে? (যেমন এখনকার বর্তমান 1.9)
দাস-জি

36

যেহেতু এই প্রশ্নটি জিজ্ঞাসা করা হয়েছিল, জাজানো ডকুমেন্টেশন একটি উত্তর অন্তর্ভুক্ত করতে পরিবর্তিত হয়েছে।

গোপন কীটি এর জন্য ব্যবহৃত হয়:

  • আপনি যদি django.contrib.sessions.backends.cacheডিফল্ট ব্যতীত অন্য কোনও সেশন ব্যাকএন্ড ব্যবহার করেন তবে সমস্ত সেশন get_session_auth_hash()
  • সমস্ত বার্তা আপনি ব্যবহার করছেন CookieStorageবা যদি FallbackStorage
  • সমস্ত PasswordResetViewটোকেন।
  • কোনও আলাদা কী সরবরাহ না করা অবধি ক্রিপ্টোগ্রাফিক স্বাক্ষরের কোনও ব্যবহার।

আপনি যদি নিজের গোপন কীটি ঘোরান, তবে উপরের সমস্তটি অবৈধ হয়ে যাবে। ব্যবহারকারীর পাসওয়ার্ডের জন্য গোপন কীগুলি ব্যবহার করা হয় না এবং কী ঘোরানো এগুলিকে প্রভাবিত করবে না।

আমার কীভাবে গোপন কীটি ঘোরানো উচিত তা আমার কাছে পরিষ্কার ছিল না। জ্যাঙ্গো কীভাবে একটি নতুন প্রকল্পের কী তৈরি করে তার পাশাপাশি অন্য বিকল্পগুলি নিয়ে আলোচনা করে এমন একটি গিস্টের একটি আলোচনা আমি পেয়েছি । অবশেষে আমি ঠিক করেছি যে জাজানোকে নতুন প্রকল্প তৈরি করতে, নতুন গোপন কীটি আমার পুরানো প্রকল্পে অনুলিপি করতে হবে এবং তারপরে নতুন প্রকল্পটি মুছবে

cd ~/junk # Go to some safe directory to create a new project.
django-admin startproject django_scratch
grep SECRET_KEY django_scratch/django_scratch/settings.py # copy to old project
rm -R django_scratch

হালনাগাদ

দেখে মনে হচ্ছে জাঙ্গো 1.10 সংস্করণে get_random_secret_key()ফাংশনটি যুক্ত করেছে । আপনি এটি একটি নতুন গোপন কী তৈরি করতে ব্যবহার করতে পারেন।

$ ./manage.py shell -c "from django.core.management.utils import get_random_secret_key; print(get_random_secret_key())"
s!)5@5s79sp=92a+!f4v!1g0d0+64ln3d$xm1f_7=749ht&-zi
$ ./manage.py shell -c "from django.core.management.utils import get_random_secret_key; print(get_random_secret_key())"
_)+%kymd=f^8o_fea1*yro7atz3w+5(t2/lm2cz70*e$2mn\g3
$

4
গোপন কী প্রজন্ম কি গোপন কীতে নির্ভর করে?
kdazzle

4
না, @ কেডাজল, যদি আপনি এর উত্স কোডটিstartproject দেখে থাকেন তবে দেখতে পাবেন এটি cryptoমডিউলটি ব্যবহার করে কেবল একটি এলোমেলো স্ট্রিং তৈরি করে ।
ডন কার্কবি

12
হেই, দুঃখিত, @ দনকির্কবি, খারাপ রসিকতা
kdazzle

16

এই পৃষ্ঠাটি https://docs.djangoproject.com/en/dev/topics/signing/ অনুসারে , SECRET_KEY বেশিরভাগ ক্ষেত্রে ট্রানজিটরি স্টাফের জন্য ব্যবহৃত হয় - তারের উপরে প্রেরিত ডেটা সাইন ইন করা যাতে আপনি টেম্পারিং সনাক্ত করতে পারেন। দেখে মনে হচ্ছে যে জিনিসগুলি বিরতি দেয়:

  • স্বাক্ষরিত কুকিজ, যেমন "এই কম্পিউটারে আমার লেখক মনে রাখবেন" প্রকারের মান। এই ক্ষেত্রে, কুকিটি অবৈধ হবে, স্বাক্ষরটি যাচাই করতে ব্যর্থ হবে এবং ব্যবহারকারীকে পুনরায় প্রমাণীকরণ করতে হবে।
  • যে কোনও ব্যবহারকারীর জন্য যাঁরা পাসওয়ার্ড পুনরায় সেট করার জন্য বা একটি কাস্টম ফাইল ডাউনলোডের জন্য লিঙ্কগুলির অনুরোধ করেছেন, তাদের জন্য এই লিঙ্কগুলি আর কার্যকর হবে না। ব্যবহারকারীদের কেবল সেই লিঙ্কগুলিতে পুনরায় অনুরোধ করতে হবে।

আমার চেয়ে আরও সাম্প্রতিক এবং / অথবা মুখ্যতর জ্যাঙ্গো অভিজ্ঞতার সাথে অন্য কেউ চুম্বন করতে পারে তবে আমি সন্দেহ করি যে আপনি যদি স্বাক্ষরকারী এপিআই দিয়ে স্পষ্টভাবে কিছু না করেন তবে এটি কেবল আপনার ব্যবহারকারীদের জন্য একটি হালকা অসুবিধা তৈরি করবে।


6
তাহলে কেন প্রতিটি সার্ভার পুনরায় চালু করতে একটি নতুন কী তৈরি করা হয় না?
oca

4
আপনি যদি একাধিক প্রক্রিয়া ব্যবহার করে একই সার্ভারটি চালাচ্ছেন তবে এটি সম্ভবত কোনও সমস্যার কারণ হতে পারে।
dbn

1
আপনি যখন প্রতিবার কোড চাপবেন / সার্ভারটি পুনরায় চালু করবেন তখন আপনি কি সমস্ত ব্যবহারকারীকে লগ আউট করতে চান?
EralpB

6

SECRET_KEY স্ট্রিং মূলত কুকিগুলির ডেটা এনক্রিপ্ট এবং / অথবা হ্যাশ করার জন্য ব্যবহৃত হয়। ডিফল্ট সেশন কুকিজের নিজস্ব ত্রুটি রয়েছে বলে অনেকগুলি ফ্রেমওয়ার্ক (জ্যাঙ্গো সহ) এখানে আসে।

কল্পনা করুন যে কোনও লুকানো ক্ষেত্রের সাথে নিবন্ধ সম্পাদনা করার জন্য আপনি জাঙ্গোতে ফর্ম করেছেন। এই গোপন ক্ষেত্রে আপনার সম্পাদনা করা নিবন্ধের আইডি সংরক্ষণ করা হয়। এবং যদি আপনি নিশ্চিত হতে চান যে কেউ আপনাকে আর কোনও আর্টিকেল আইডি প্রেরণ করতে না পারে তবে আপনি হ্যাশ আইডি সহ একটি অতিরিক্ত লুকানো ক্ষেত্র যুক্ত করবেন। সুতরাং কেউ যদি আইডি পরিবর্তন করে তবে আপনি এটি জানবেন কারণ হ্যাশটি একই হবে না।

অবশ্যই এটি একটি তুচ্ছ উদাহরণ কিন্তু SECRET_KEY এভাবেই ব্যবহৃত হয়।

জ্যাঙ্গো aly% csrf_token%} এবং আরও কিছু জিনিসের উদাহরণস্বরূপ এটি ব্যবহার করছে intern আপনার প্রশ্নের ভিত্তিতে এবং আপনি এটি ব্যবহার করছেন না এর ভিত্তিতে আপনি যদি এটি পরিবর্তন করে থাকেন তবে এটি আপনার অ্যাপ্লিকেশনটিতে আসলেই কোনও প্রভাব ফেলবে না।

একমাত্র জিনিসটি সম্ভবত সেশনের মানগুলি বাদ দেওয়া হবে। সুতরাং উদাহরণস্বরূপ ব্যবহারকারীদের আবার অ্যাডমিনে লগইন করতে হবে, কারণ জ্যাঙ্গো বিভিন্ন কী দিয়ে সেশনটি ডিকোড করতে সক্ষম হবে না।


1

আমি এই একই ভুল করেছি। ডিফল্ট পাসওয়ার্ড 50 দীর্ঘ ছিল তাই আমি 50 টি দীর্ঘ এলোমেলো স্ট্রিং উত্পন্ন করতে পাওয়ারশেল ব্যবহার করেছি এবং এর সাথে পুরানো SECRET_KEY প্রতিস্থাপন করেছি। আমি লগ ইন ছিলাম এবং SECRET_KEY প্রতিস্থাপনের পরে আমার পূর্ববর্তী অধিবেশনটি বাতিল করে দেওয়া হয়েছিল।

পাওয়ারশেল ( উত্স ) সহ:

# Load the .net System.Web namespace which has the GeneratePassword function
[Reflection.Assembly]::LoadWithPartialName("System.Web")

#  GeneratePassword(int length, int numberOfNonAlphanumericCharacters)
[System.Web.Security.Membership]::GeneratePassword(50,5)

বাশ ( উত্স ) সহ:

# tr includes ABCabc123 and the characters from OWASP's "Password special characters list"
cat /dev/urandom | tr -dc 'A-Za-z0-9!"#$%&\''()*+,-./:;<=>?@[\]^_`{|}~' | head -c 100 ; echo

এই মুহুর্তে আমি ভেবেছিলাম কেন বৃহত্তর কীটি চেষ্টা করবেন না, তাই আমি এটি 100 এবং 1000 দীর্ঘ কী দিয়ে চেষ্টা করেছি। দুজনেই কাজ করেছেন। যদি আমি উত্স কোডটি বুঝতে পারি তবে স্বাক্ষরকারী ফাংশনটি দিয়ে ফিরে আসা অবজেক্টটি বেস 64 এ একটি এইচএমএক হ্যাশ। এইচএমএসি গোপন কীটির প্রয়োজনীয় দৈর্ঘ্যের জন্য আরএফসি 2104 এর কথা বলতে হবে।

অ্যাপ্লিকেশনগুলি বি বাইটের চেয়ে দীর্ঘতর কীগুলি ব্যবহার করে প্রথমে এইচ ব্যবহার করে কীটি হ্যাশ করবে এবং তারপরে ফলস্বরত এল বাইট স্ট্রিংটিকে এইচএমএসি-র আসল কী হিসাবে ব্যবহার করবে।

এইচএমএএসি-র কীটি যে কোনও দৈর্ঘ্যের হতে পারে (প্রথমে এইচ ব্যবহার করে বি বাইটের চেয়ে বেশি দীর্ঘ কীগুলি)। যাইহোক, এল বাইটের চেয়ে কম দৃ strongly়ভাবে নিরুৎসাহিত করা হবে কারণ এটি ফাংশনের সুরক্ষা শক্তি হ্রাস করবে। এল বাইটের চেয়ে দীর্ঘ চাবিগুলি গ্রহণযোগ্য তবে অতিরিক্ত দৈর্ঘ্যের ফলে কার্যকারিতা শক্তি বাড়বে না। (যদি চাবির এলোমেলোতা দুর্বল হিসাবে বিবেচনা করা হয় তবে দীর্ঘতর চাবি যুক্তিযুক্ত হতে পারে))

সাধারণ স্পোকে অনুবাদ করতে, গোপন কীটির আকারের আউটপুট হিসাবে একই আকার হওয়া দরকার। কীটিও বিটের মধ্যে থাকা দরকার। বেস 64 এর প্রতিটি অঙ্ক 6 টি বিট উপস্থাপন করে। সুতরাং আপনার যদি 50 টি অক্ষরের পাসওয়ার্ড থাকে তবে আপনার কাছে 50 x 6 = 300 বিট গোপন কী থাকবে। আপনি যদি SHA256 ব্যবহার করে থাকেন তবে আপনার প্রয়োজন 256 বিট কী ( শ্যা 256 সংজ্ঞা অনুসারে 256 বিট ব্যবহার করে )। সুতরাং SHA256 এর চেয়ে বড় হ্যাশিং অ্যালগরিদম ব্যবহার করার পরিকল্পনা না করা হলে একটি 50 টি দীর্ঘ পাসওয়ার্ড কাজ করা উচিত।

তবে যেহেতু কীটিতে কোনও অতিরিক্ত বিট হ্যাশ হচ্ছে, এর আকারটি ক্রমশ কর্মক্ষমতা হ্রাস পাবে না। তবে এটি আপনাকে গ্যারান্টি দেয় যে বৃহত্তর হ্যাশ ফাংশনগুলির জন্য আপনার কাছে পর্যাপ্ত পরিমাণে বিট রয়েছে। SHA-512 100 টি দীর্ঘ SECRET_KEY ( 50 x 6 = 600 বিট> 512 বিট ) দ্বারা আচ্ছাদিত হবে ।

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