Tujuan pengaturan Django 'SECRET_KEY'

157

Apa sebenarnya inti dari SECRET_KEYdjango? Saya melakukan beberapa pencarian google dan memeriksa dokumen ( https://docs.djangoproject.com/en/dev/ref/settings/#secret-key ), tetapi saya mencari penjelasan yang lebih mendalam tentang ini, dan mengapa itu diperlukan.

Misalnya, apa yang bisa terjadi jika kunci dikompromikan / orang lain tahu apa itu? Terima kasih.

David542
sumber
4
Jika Anda memiliki kunci rahasia, dan itu dikompromikan dan dirilis kepada orang lain, Anda memiliki masalah. Tidak masalah jika Anda menggunakan Django atau tidak.
Jared Farrish
35
Tapi apa masalahnya, tepatnya?
tobych
7
Saya melakukan jawaban menyeluruh di sini (plug shameless)
sberder
4
@sberder Mungkin Anda harus menulis jawaban untuk pertanyaan ini juga. Saya membayangkan Anda bisa melakukannya lebih baik daripada yang tidak dijawab.
kasperd

Jawaban:

92

Ini digunakan untuk membuat hash. Lihat:

>grep -Inr SECRET_KEY *
conf/global_settings.py:255:SECRET_KEY = ''
conf/project_template/settings.py:61:SECRET_KEY = ''
contrib/auth/tokens.py:54:        hash = sha_constructor(settings.SECRET_KEY + unicode(user.id) +
contrib/comments/forms.py:86:        info = (content_type, object_pk, timestamp, settings.SECRET_KEY)
contrib/formtools/utils.py:15:    order, pickles the result with the SECRET_KEY setting, then takes an md5
contrib/formtools/utils.py:32:    data.append(settings.SECRET_KEY)
contrib/messages/storage/cookie.py:112:        SECRET_KEY, modified to make it unique for the present purpose.
contrib/messages/storage/cookie.py:114:        key = 'django.contrib.messages' + settings.SECRET_KEY
contrib/sessions/backends/base.py:89:        pickled_md5 = md5_constructor(pickled + settings.SECRET_KEY).hexdigest()
contrib/sessions/backends/base.py:95:        if md5_constructor(pickled + settings.SECRET_KEY).hexdigest() != tamper_check:
contrib/sessions/backends/base.py:134:        # Use settings.SECRET_KEY as added salt.
contrib/sessions/backends/base.py:143:                       settings.SECRET_KEY)).hexdigest()
contrib/sessions/models.py:16:        pickled_md5 = md5_constructor(pickled + settings.SECRET_KEY).hexdigest()
contrib/sessions/models.py:59:        if md5_constructor(pickled + settings.SECRET_KEY).hexdigest() != tamper_check:
core/management/commands/startproject.py:32:        # Create a random SECRET_KEY hash, and put it in the main settings.
core/management/commands/startproject.py:37:        settings_contents = re.sub(r"(?<=SECRET_KEY = ')'", secret_key + "'", settings_contents)
middleware/csrf.py:38:                % (randrange(0, _MAX_CSRF_KEY), settings.SECRET_KEY)).hexdigest()
middleware/csrf.py:41:    return md5_constructor(settings.SECRET_KEY + session_id).hexdigest()
Roshan Mathews
sumber
9
Mengapa mereka tidak menyebutnya garam? ;)
datenwolf
29
Ini dugaan, tetapi saya kira lebih mudah untuk memberi tahu orang-orang "jangan membagikan milik Anda SECRET_KEY", sebagai lawan dari "Anda SALTadalah kunci rahasia yang harus Anda simpan untuk diri sendiri."
Roshan Mathews
12
Perbedaan itu sangat penting. Dalam kriptografi, garam bukan rahasia, tetapi SECRET_KEYharus dijaga keamanannya. PenggunaanSECRET_KEY jauh lebih mirip dengan penggunaan kunci dalam hash yang ditandatangani seperti HMAC (yang, jika kinerja bukan pertimbangan, mungkin akan digunakan sebagai gantinya).
Travis Jensen
32
Ini sepertinya bukan jawaban untuk saya. Yang Anda lakukan adalah perintah grep tunggal tanpa menjelaskan apa yang dilakukan. Di mana jawaban untuk "apa yang bisa terjadi jika kunci itu dikompromikan?"
kasperd
Juga karena SECRET_KEY bersifat rahasia, awalan SECRET ke kunci memastikan bahwa Django akan mengenkripsi / menutupi nilai-nilai di mana pun dibutuhkan.
Linus_30
36

The dokumentasi Django untuk penandatanganan kriptografi meliputi penggunaan dari 'SECRET_KEY' pengaturan:

Nilai ini [ SECRET_KEYpengaturan] adalah kunci untuk mengamankan data yang ditandatangani - sangat penting Anda menjaga keamanan ini, atau penyerang dapat menggunakannya untuk menghasilkan nilai yang ditandatangani sendiri.

(Bagian ini juga dirujuk dari dokumentasi Django untuk pengaturan 'SECRET_KEY' .)

API penandatanganan kriptografis di Django tersedia untuk aplikasi apa pun untuk tanda tangan yang aman secara kriptografis pada nilai. Django sendiri memanfaatkan ini dalam berbagai fitur tingkat tinggi:

  • Menandatangani data serial (mis. Dokumen JSON).

  • Token unik untuk sesi pengguna, permintaan setel ulang kata sandi, pesan, dll.

  • Pencegahan serangan lintas situs atau replay dengan menambahkan (dan kemudian mengharapkan) nilai unik untuk permintaan tersebut.

  • Menghasilkan garam unik untuk fungsi hash.

Jadi, jawaban umumnya adalah: Ada banyak hal dalam aplikasi Django yang memerlukan tanda tangan kriptografi, dan pengaturan 'SECRET_KEY' adalah kunci yang digunakan untuk itu. Itu harus memiliki jumlah entropi kriptografis yang kuat (sulit ditebak oleh komputer) dan unik di antara semua instance Django.

hidung besar
sumber
1
"Dan unik di antara semua instance Django." - apakah ini menyiratkan jika saya memiliki 3 webservers yang menjalankan aplikasi Django yang sama di belakang load balancer saya harus memiliki 3 SECRET_KEYpengaturan yang berbeda ?
Adam Parkin
2
@AdamParkin, kedengarannya seperti awal yang baik untuk pertanyaan baru , untuk mendapatkan jawabannya sendiri.
bignose
2
Saran bagus, dilakukan: stackoverflow.com/questions/51657422/…
Adam Parkin
19

Menurut Dokumentasi Django tentangSECRET_KEY :

Kunci rahasia digunakan untuk:

  • Semua sesi jika Anda menggunakan backend sesi lain selain django.contrib.sessions.backends.cache, atau menggunakan default get_session_auth_hash().
  • Semua pesan jika Anda menggunakan CookieStorageatau FallbackStorage.
  • Semua token PasswordResetView.
  • Setiap penggunaan penandatanganan kriptografis, kecuali kunci yang berbeda disediakan.

Jika Anda memutar kunci rahasia Anda, semua hal di atas akan batal. Kunci rahasia tidak digunakan untuk kata sandi pengguna dan rotasi kunci tidak akan memengaruhi mereka.

Michael B
sumber
5
Info berguna tentang apa yang terjadi jika SECRET_KEYdiputar. +1
Hassan Baig