Pengelolaan sandi di Django

Pengelolaan sandi adalah sesuatu yang harus secara umum tidak dibuat kembali tida perlu, dan Django berusaha menyediakan kumpulan aman dan fleksibel dari alat-alat untuk mengelola sandi pengguna. Dokumen ini menggambarkan bagaimana Django menyimpan sandi, bagaimana campuran penyimpanan dapat dikonfigurasikan, dan beberapa peralatan untuk bekerja dengan sandi dicampur.

lihat juga

Meskipun pengguna mungkin menggunakan sandi kuat, penyerang mungkin dapat menguping pada hubungan mereka. Gunakan HTTPS untuk menghindari mengirim sandi (atau data sensitif lain apapun) terhadap hubungan HTTP polos karena merekan akan menjadi rentan pada penciuman sandi.

Bagaimana Django menyimpan sandi

Django menyediakan sistem penyimpanan sandi fleksibel dan menggunakan PBKDF2 secara awalan.

Atribut password dari sebuah obyek User adalah sebuah string di bentuk ini:

<algorithm>$<iterations>$<salt>$<hash>

Mereka adalah komponen digunakan untuk menyimpan sandi User, dipisahkan oleh karakter dolar dan terdiri dari campuran algoritma, sejumlah perulangan algoritma (faktor kerja), garam acak, dan menghasilkan campuran sandi. Algoritma adalah satu dari sejumlah dari campuran satu-cara atau algoritma penyimpanan sandi Django dapat digunakan, lihat dibawah. Perulangan menggambarkan sejumlah kali algoritma berjalan terhadap campuran. Garam adalah benih acak digunakan dan campuran adalah hasil dari fungsi satu-cara.

Secara awalan, Django menggunakan algoritma PBKDF2 dengan campuran SHA256, sebuah mekanisme perentangan sandi dianjurkan oleh NIST. Ini harus cukup untuk kebanyakan pengguna: itu sangat aman, membutuhkan jumlah besar waktu untuk merusak.

Bagaimapun, tergantung pada persyaratan anda, anda mungkin memilih algoritma berbeda, atau bahkan menggunakan penyesuaian algoritma untuk mencocokkan keadaan keamanan khusus. Kembali, kebanyakan pengguna tidak butuh melakukan ini – jika anda tidak yakin, anda mungkin tidak. Jika anda melakukan, harap membaca:

Django memilih algoritma untuk digunakan dengan berkonsultasi pengaturan PASSWORD_HASHERS. Ini adalah daftar dari campuran kelas-kelas algoritma yang mendukung pemasangan Django ini. Masukan pertama di daftar (yaitu, settings.PASSWORD_HASHERS[0]) akan digunakan menyimpan sandi, dan semua masukan lain adalah pencampur sah yang dapat digunakan memeriksa sandi yang ada. Ini berarti bahwa anda ingin menggunakan algoritma berbeda, anda akan butuh merubah PASSWORD_HASHERS ke daftar anda pertama algoritma dipilih di daftar.

Nilai awal untuk PASSWORD_HASHERS adalah:

PASSWORD_HASHERS = [
    'django.contrib.auth.hashers.PBKDF2PasswordHasher',
    'django.contrib.auth.hashers.PBKDF2SHA1PasswordHasher',
    'django.contrib.auth.hashers.Argon2PasswordHasher',
    'django.contrib.auth.hashers.BCryptSHA256PasswordHasher',
    'django.contrib.auth.hashers.BCryptPasswordHasher',
]

Ini berarti bahwa Django akan menggunakan PBKDF2 menyimpan semua sandi tetapi akan mendukung pemeriksaan sandi disimpan dengan PBKDF2SHA1, argon2, dan bcrypt.

Sedikit bagian selanjutnya menggambarkan sepasang cara umum pengguna tingkat lanjut mungkin ingin merubah pengaturan ini.

Menggunakan Argon2 dengan Django

New in Django 1.10.

Argon2 adalah pemenang dari Password Hashing Competition 2015, sebuah komunitas mengorganisasikan pertandingan terbuka untuk memilih algoritma campuran generasi selanjutnya. Itu dirancang tidak mudah dihitung pada perangkat keras penyesuaian daripada itu dihitung pada CPU biasa.

Argon2 bukan awalan untuk Django karena itu membutuhkan pustaka pihak-ketiga. Juri Password Hashing Competition, bagaimanapun, menganjurkan penggunaan segera dari Argon2 daripada algoritma lain didukung oleh Django.

Untuk menggunakan Argon2 sebagai algoritma penyimpanan awalan anda, lakukan berikut:

  1. Pasang argon2-cffi library. Ini dapat diselesaikan dengan menjalankan pip install django[argon2], yang setara pada pip install argon2-cffi (bersama dengan persyaratan versi apapun dari setup.py Django).

  2. Rubah PASSWORD_HASHERS pada daftar Argon2PasswordHasher pertama. Yaitu, di berkas pengaturan anda, anda telah taruh:

    PASSWORD_HASHERS = [
        'django.contrib.auth.hashers.Argon2PasswordHasher',
        'django.contrib.auth.hashers.PBKDF2PasswordHasher',
        'django.contrib.auth.hashers.PBKDF2SHA1PasswordHasher',
        'django.contrib.auth.hashers.BCryptSHA256PasswordHasher',
        'django.contrib.auth.hashers.BCryptPasswordHasher',
    ]
    

    Jaga dan/atau tambah masukan apapun di daftar ini jika anda butuh Django untuk upgrade passwords.

Menggunakan bcrypt dengan Django

Bcrypt adalah algoritma penyimpanan sandi terkenal yang khususnya dirancang untuk penyimpanan sandi jangka-panjang. Itu bukan awalan digunakan oleh Django sejak itu membutuhkan menggunakan pustaka pihak-ketiga, tetapi sejak banyak orang mungkin ingin menggunakan itu Django mendukung bcrypt dengan usaha minimal.

Untuk menggunakan Bcrypt sebagai algoritma penyimpanan awalan anda, lakukan berikut:

  1. Pasang bcrypt library. Ini dapat diselesaikan dengan menjalankan pip install django[bcrypt], yang setara pada pip install bcrypt (bersama dengan persyaratan versi apapun dari setup.py Django).

  2. Rubah PASSWORD_HASHERS pada daftar BCryptSHA256PasswordHasher pertama. Yaitu, di berkas pengaturan anda, anda telah taruh:

    PASSWORD_HASHERS = [
        'django.contrib.auth.hashers.BCryptSHA256PasswordHasher',
        'django.contrib.auth.hashers.BCryptPasswordHasher',
        'django.contrib.auth.hashers.PBKDF2PasswordHasher',
        'django.contrib.auth.hashers.PBKDF2SHA1PasswordHasher',
        'django.contrib.auth.hashers.Argon2PasswordHasher',
    ]
    

    Jaga dan/atau tambah masukan apapun di daftar ini jika anda butuh Django untuk upgrade passwords.

Yaitu – sekarang Django memasang dengan menggunakan Bcrypt sebagai algoritma penyimpanan awalan.

Pemotongan sandi dengan BCryptPasswordHasher

Perancang dari bcrypt memotong semua sandi pada 72 karakter yang berarti bahwa bcrypt(password_with_100_chars) == bcrypt(password_with_100_chars[:72]). BCryptPasswordHasher asli tidak mempunyai penanganan khusus dan demikian juga subyek pada ke batasan panjang sandi tersembunyi. BCryptSHA256PasswordHasher memperbaiki ini dengan campuran pertama sandi menggunakan sha256. Ini mencegah pemotongan sandi dan harus dipilih terhadap BCryptPasswordHasher. Praktik percabangan dari pemotongan ini cukup marjinal ketika rata-rata pengguna tidak mempunyai sandi lebih besar dari 72 karakter di panjang dan bahkan sedang dipotong pada 72 tenaga menghitung dibutuhkan untuk serangan brutal bcrypt di sejumlah waktu berguna apapun masih astronomis. Meskipun begitu, kami menganjurkan anda menggunakan BCryptSHA256PasswordHasher bagaimanapun pada dasarnya dari “better safe than sorry”.

Penerapan bcrypt lain

Ada beberapa penerapan lain yang mengizinkan bcrypt untuk digunakan dengan Django. Dukungan bcrypt Django TIDAK secara langsung cocok dengan ini. Untuk meningkatkan, anda akan butuh merubah campuran di basisdata anda menjadi di formulir bcrypt$(raw bcrypt output). Sebagai contoh: bcrypt$$2a$12$NT0I31Sa7ihGEWpka9ASYrEFkhuTNeBQ2xfZskIiiJeyFXhRgS.Sy.

Meningkatkan faktor kerja

PBKDF2 dan bcrypt

Algoritma PBKDF2 dan bcrypt menggunakan sejumlah perulangan arau pemutaran dari campuran. Ini sengaja memperlambat penyerang, membuat serangan terhadap sandi campuran lebih keras. Bagaimanapun, seiring kekuatan komputer meningkat, sejumlah perulangan butuh ditingkatkan. Kami telah memilih awalan yang masuk akal (dan akan meningkatkannya dengan setiap tetbitan dari Django), tetapi anda mungkin berharap untuk menyetem keatas dan kebawah, tergantung pada kebutuhan keamanan anda dan kekuatan pengolahan yang tersedia. Untuk melakukannya, anda akan mensubkelaskan algoritma yang sesuai dan menimpa parameter iterations. Sebagai contoh, untuk meningkatkan sejumlah perulangan digunakan oleh awalan algoritma PBKDF2:

  1. Membuat sebuah subkelas dari django.contrib.auth.hashers.PBKDF2PasswordHasher:

    from django.contrib.auth.hashers import PBKDF2PasswordHasher
    
    class MyPBKDF2PasswordHasher(PBKDF2PasswordHasher):
        """
        A subclass of PBKDF2PasswordHasher that uses 100 times more iterations.
        """
        iterations = PBKDF2PasswordHasher.iterations * 100
    

    Simpan ini disuatu tempat di proyek anda. Sebagai contoh, anda mungkin menaruh ini di sebuah berkas seperti myproject/hashers.py.

  2. Tambah pencampur baru anda sebagai masukan pertama di PASSWORD_HASHERS:

    PASSWORD_HASHERS = [
        'myproject.hashers.MyPBKDF2PasswordHasher',
        'django.contrib.auth.hashers.PBKDF2PasswordHasher',
        'django.contrib.auth.hashers.PBKDF2SHA1PasswordHasher',
        'django.contrib.auth.hashers.Argon2PasswordHasher',
        'django.contrib.auth.hashers.BCryptSHA256PasswordHasher',
        'django.contrib.auth.hashers.BCryptPasswordHasher',
    ]
    

Itu dia – sekarang pemasangan Django anda akan menggunakan perulangan lebih ketika itu menyimpan sandi menggunakan PBKDF2.

Argon2

Argon2 mempunyai tiga atribut yang dapat disesuaikan:

  1. time_cost mengendalikan sejumlah perulangan dalam campuran.

  2. memory_cost mengendalikan ukuran memori yang harus digunakan selama perhitungan dari campuran.

  3. parallelism mengendalikan berapa banyak CPU perhitungan dari campuran dapat diparalelkan.

Nilai-nilai awalan dari atribut ini mungkin baik untuk anda. Jika anda menentukan bahwa campuran sandi terlalu cepat atau terlalu lambat, anda dapat mengutik itu sebagai berikut:

  1. Pilih parallelism untuk menjadi angka dari thread anda dapat hemat menghitung campuran.

  2. Pilih memory_cost menjadi KiB dari memori anda dapat hemat.

  3. Menyesuaikan time_cost dan ukuran waktu mencampur sebuah sandi yang diambil. Ambil sebuah time_cost yang mengambil sebuah waktu yang dapat diterima untuk anda. Jika time_cost disetel menjadi ` adalah tidak dapat diterima lambat, memory_cost lebih rendah.

tafsiran memory_cost

Kegunaan baris-perintah dan beberapa pustaka lain menafsirkan parameter memory_cost berbeda dari nilai yang Django gunakan. Perubahan yang diberikan oleh memory_cost == 2 ** memory_cost_commandline.

Peningkatan sandi

Ketika pengguna masuk, jika sandi mereka disimpan dengan apapun lain dari algoritma yang dipilih, Django akan secara otomatis meningkatkan algoritma ke satu yang dipilih. Ini berarti bahwa pemasangan lama dari Django akan mendapatkan otomatis lebih aman ketika pengguna masuk, dan itu juga berarti bahwa anda dapat berganti ke algoritma pentimpanan (dan lebih baik) baru ketika mereka dibuat.

Bagaimanapun, Django hanya dapat meningkatkan sandi yang menggunakan algoritma disebutkan di PASSWORD_HASHERS, jadi ketika anda meningkatkan ke sistem baru anda harus memastikan tidak pernah memindahkan masukan dari daftar ini. Jika anda melakukan, pengguna menggunakan algoritma tidak disebutkan tidak dapat ditingkatkan. Sandi dicampur akan diperbaharui ketika meningkatkan (atau menurunkan) sejumlah perulangan PBKDF2 atau lingkaran bcrypt.

Waspada bahwa jika semua sandi di basisdata anda tidak dikodekan di algoritma pencampur awalan, anda mungkin rentan pada serangan pewaktu pencacahan pengguna karena perbedaan diantara lamanya dari permintaan masuk untuk pengguna dengan sandi terkodekan di algoritma bukan-awalan dan lamanya dari permintaan masuk untuk pengguna tidak ada (yang menjalankan pencampur awalan). Anda mungkin dapat memperbaiki ini dengan upgrading older password hashes.

Changed in Django 1.9:

Sandi memperbaharui ketika merubah sejumlah lingkaran bcrypt telah ditambahkan.

Meningkatkan sandi tanpa membutuhkan masuk

Jika anda mempunyai basisdata yang ada dengan yang terlama, campuran lemah seperti MD5 atau SHA1, anda mungkin ingin meningkatkan campuran tersebut anda sendiri daripada menunggu peninggkatan terjadi ketika pengguna masuk (yang mungkin tidak pernah terjadi jika pengguna tidak kembali ke situs anda). Di kasus ini, anda dapat menggunakan pencampur sandi “wrapped”.

Untuk contoh ini, kami akan memindahkan kumpulan dari campuran SHA1 untuk menggunakan PBKDF2(SHA1(password)) dan menambah pencampur sandi berkaitan untuk memeriksa jika pengguna memasukkan sandi benar pada masuk. Kami menganggap kami sedang menggunakan model User siap-pakai dan bahwa proyek kami mempunyai sebuah aplikasi accounts. Anda dapat merubah pola untuk bekerja dengan algoritma apapun atau dengan penyesuaian model user.

Pertama, kami akan menambah penyesuaian pencampur:

accounts/hashers.py
from django.contrib.auth.hashers import (
    PBKDF2PasswordHasher, SHA1PasswordHasher,
)


class PBKDF2WrappedSHA1PasswordHasher(PBKDF2PasswordHasher):
    algorithm = 'pbkdf2_wrapped_sha1'

    def encode_sha1_hash(self, sha1_hash, salt, iterations=None):
        return super(PBKDF2WrappedSHA1PasswordHasher, self).encode(sha1_hash, salt, iterations)

    def encode(self, password, salt, iterations=None):
        _, _, sha1_hash = SHA1PasswordHasher().encode(password, salt).split('$', 2)
        return self.encode_sha1_hash(sha1_hash, salt, iterations)

Perpindahan data mungkin terlihat seperti:

accounts/migrations/0002_migrate_sha1_passwords.py
from django.db import migrations

from ..hashers import PBKDF2WrappedSHA1PasswordHasher


def forwards_func(apps, schema_editor):
    User = apps.get_model('auth', 'User')
    users = User.objects.filter(password__startswith='sha1$')
    hasher = PBKDF2WrappedSHA1PasswordHasher()
    for user in users:
        algorithm, salt, sha1_hash = user.password.split('$', 2)
        user.password = hasher.encode_sha1_hash(sha1_hash, salt)
        user.save(update_fields=['password'])


class Migration(migrations.Migration):

    dependencies = [
        ('accounts', '0001_initial'),
        # replace this with the latest migration in contrib.auth
        ('auth', '####_migration_name'),
    ]

    operations = [
        migrations.RunPython(forwards_func),
    ]

Waspada bahwa perpindahan ini akan mengambil urutan dari beberapa menit untuk beberapa ribuan pengguna, tergantung pada kecepatan perangkat keras anda.

Akhirya, kami akan menambah sebuah pengaturan PASSWORD_HASHERS:

mysite/settings.py
PASSWORD_HASHERS = [
    'django.contrib.auth.hashers.PBKDF2PasswordHasher',
    'accounts.hashers.PBKDF2WrappedSHA1PasswordHasher',
]

Sertakan pencampur lain apapun yang situs anda gunakan di daftar ini.

Disertakan pencampur

Daftar penuh dari pencampur disertakan di Django adalah:

[
    'django.contrib.auth.hashers.PBKDF2PasswordHasher',
    'django.contrib.auth.hashers.PBKDF2SHA1PasswordHasher',
    'django.contrib.auth.hashers.Argon2PasswordHasher',
    'django.contrib.auth.hashers.BCryptSHA256PasswordHasher',
    'django.contrib.auth.hashers.BCryptPasswordHasher',
    'django.contrib.auth.hashers.SHA1PasswordHasher',
    'django.contrib.auth.hashers.MD5PasswordHasher',
    'django.contrib.auth.hashers.UnsaltedSHA1PasswordHasher',
    'django.contrib.auth.hashers.UnsaltedMD5PasswordHasher',
    'django.contrib.auth.hashers.CryptPasswordHasher',
]

Nama-nama algoritma berhubungan adalah:

  • pbkdf2_sha256
  • pbkdf2_sha1
  • argon2
  • bcrypt_sha256
  • bcrypt
  • sha1
  • md5
  • unsalted_sha1
  • unsalted_md5
  • crypt

Menulis pencampur anda sendiri

New in Django 1.9.3.

Jika anda menulis pencampur sandi anda sendiri yang mengandung faktor kerja seperti sejumlah perulangan, anda harus menerapkan sebuah metode harden_runtime(self, password, encoded) untuk menjembatani celah waktu jalan diantara faktor kerja disokong di sandi encoded dan faktor kerja awalan dari pencampur. Ini mencegah serangan pewaktu pencacahan pengguna pada perbedaan diantara permintaan masuk untuk pengguna baru dengan sandi dikodekan di nomor terlama dari perulangan dan pengguna tidak ada (yang menjalankan nomor awalan pencampur bawaan dari perulangan).

Mengambil PBKDF2 sebagai contoh, jika encoded mengandung 20,000 perputaran dan iterations awalan pencampur adalah 30,000, metode harus menjalankan password melalui perputaran 10,000 lain dari PBKDF2.

Jika pencampur anda tidak mempunyai faktor kerja, terapkan metode sebagai no-op (pass).

Manual mengelola sandi pengguna

Modul django.contrib.auth.hashers menyediakan sekumpulan fungsi untuk membuat dan mensahkan sandi dicampur. Anda dapat menggunakan mereka secara berdiri sendiri dari model User.

check_password(password, encoded)[sumber]

Jika anda suka secara manual autentifikasi pengguna dengan membandingkan sandi teks-polos pada sandi dicampur di basisdata, gunakan fungsi nyaman check_password(). Itu mengambil dua argumen: sandi teks-polos untuk memeriksa, dan nilai penuh dari bidang password pengguna di basisdata untuk memeriksa terhadap, dan mengembalikan True jika mereka cocok, False sebaliknya.

make_password(password, salt=None, hasher='default')[sumber]

Membuat sandi dicampur dalam bentuk digunakan oleh aplikasi ini. Itu mengambil satu argumen wajib: sandi di teks-polos. Pilihannya, anda dapat menyediakan sebuah garam dan algoritma campuran untuk digunakan, jika anda tidak ingin menggunakan awalan (masukan pertama dari pengaturan PASSWORD_HASHERS). Lihat Disertakan pencampur untuk nama algoritma dari setiap pencampur. Jika argumen sandi adalah None, sebuah sandi tidak dapat digunakan dikembalikan (satu yang akan tidak pernah diterima oleh check_password()).

is_password_usable(encoded_password)[sumber]

Memeriksa jika string diberikan adalah sandi dicampur yang mempunyai sebuah kesempatan dari menjadi disahkan terhadap Checks if the given string is a hashed password that has a chance of being verified against check_password().

Pengesahan sandi

New in Django 1.9.

Pengguna sering memilih sandi miskin. Untuk membantu memperbaiki masalah ini, Django menawarkan pengesahan sandi tertanam. Anda dapat mengkonfigurasi banyak pengesah sandi pada waktu bersamaan. Sedikit pengesah disertakan di Django, tetapi itu cukup menulis anda sendiri juga.

Setiap pengesah sandi harus menyediakan teks bantuan untuk menjelaskan persyaratan ke pengguna, mensahkan sandi diberikan dan mengembalikan sebuah pesan kesalahan jika itu tidak memenuhi persyaratan, dan pilihannya menerima sandi yang telah disetel. Pengesah dapat juga mempunyai pengaturan pilihan untuk mendenda menyesuaikan perilaku mereka.

Pengesahan dikendalikan dengan pengaturan AUTH_PASSWORD_VALIDATORS. Awalan untuk pengaturan adalah sebuah daftar kosong, yang berarti tidak ada pengesah diberlakukan. Dalam proyek baru dibuat dengan cetakan startproject awalan, sekumpulan sederhana dari pengesah diadakan.

Secara awalan, pengesah digunakan dalam formulir untuk menyetel kembali atau merubah sandi dan di perintah pengelolaan createsuperuser dan changepassword. Pengesah tidak diberlakukan pada tingkat model, sebagai contoh di User.objects.create_user()` dan create_superuser(), karena kami mengaggap bahwa pengembang, bukan pengguna, interaksi dengan Django pada tingkat itu dan juga karena pengesahan model tidak secara otomatis berjalan sebagai bagian dari membuat model.

Catatan

Pengesah sandi dapat mencegah penggunaan dari banyak jenis dari sandi lemah. Bagaimanapun, fakta bahwa sandi melewatkan semua pengesah tidak menjami bahwa itu adalah sandi kuat. Ada banyak faktor yang dapat memperlemah sebuah sandi yang tidak dikenali oleh bahkan pengesah sandi paling tingkat lanjut.

Adakan pengesahan sandi

Pengesahan sandi dikonfigurasikan di pengaturan AUTH_PASSWORD_VALIDATORS:

AUTH_PASSWORD_VALIDATORS = [
    {
        'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
        'OPTIONS': {
            'min_length': 9,
        }
    },
    {
        'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
    },
]

Contoh ini mengadakan semua empat pengesah disertakan:

  • UserAttributeSimilarityValidator, yang memeriksa kemiripan diantara sandi dan sekumpulan dari atribut dari pengguna.

  • MinimumLengthValidator, yang cukup memeriksa apakah sandi memenuhi panjang minimal. Pengesah ini dikonfigurasikan dengan penyesuaian pilihan: itu sekarang membutuhkan panjang minimal untuk menjadi 9 karakter, daripada awalan delapan.

  • CommonPasswordValidator, yang memeriksa apakah sandi muncul di daftar dari sandi umum. Secara awalan, itu membandingkan pada sebuah daftar disertakan dari 1000 sandi umum.

  • NumericPasswordValidator, yang memeriksa apakah sandi tidak sepenuhnya numerik.

Untuk UserAttributeSimilarityValidator dan CommonPasswordValidator, kami cukup menggunakan pengaturan awalan di contoh ini. NumericPasswordValidator tidak mempunyai pengaturan.

Teks bantuan dan kesalahan apapun dari pengesah sandi selalu dikembalikan agar mereka didaftarkan di AUTH_PASSWORD_VALIDATORS.

Disertakan pengesah

Django menyertakan empat pengesah:

class MinimumLengthValidator(min_length=8)[sumber]

Mengesahkan apakah sandi memenuhi panjang minimal. Panjang minimal dapat disesuaikan dengan parameter min_length.

class UserAttributeSimilarityValidator(user_attributes=DEFAULT_USER_ATTRIBUTES, max_similarity=0.7)[sumber]

Mengesahkan apakah sandi cukup berbeda dari atribut tertentu dari pengguna.

Parameter user_attributes harus berupa sebuah perulangan dari nama-namad dari atribut pengguna untuk dibandingkan. Jika argumen ini tidak disediakan, awalan adalah digunakan: 'username', 'first_name', 'last_name', 'email'. Atribut-atribut yang tidak ada adalah diabaikan.

Kemiripan maksimal sandi dapat dimiliki, sebelum itu ditolak, dapat disetel dengan parameter max_similarity, pada sebuah skala dari 0 sampai 1. Pengaturan dari 0 akan menyebabkan semua sandi ditolak, sedangkan pengaturan dari ` akan menyebabkan itu hanya menolak sandi yang mirip pada nilai atribut.

class CommonPasswordValidator(password_list_path=DEFAULT_PASSWORD_LIST_PATH)[sumber]

Mengesahkan apakah sandi bukan sandi umum. Secara awalan, ini memeriksa terhadap daftar dari 1000 sandi umum dibuat oleh Mark Burnett.

password_list_path dapat disetel ke jalur dari berkas penyesuaian dari sandi umum. Berkas ini harus mengandung satu sandi per baris dan mungkin teks polos atau gzipped.

class NumericPasswordValidator[sumber]

Mengesahkan apakah sandi tidak sepenuhnya numerik.

Memadukan pengesahan

Ada sedikit fungsi di django.contrib.auth.password_validation yang anda dapat memanggil dari formulir anda sendiri atau kode lain untuk memadukan pengesahan sandi. Ini dapat berguna jika anda menggunakan penyesuaian formulir untuk pengaturan sandi, atau jika anda mempunyai panggilan API yang mengizinkan sandi disetel, sebagai contoh.

validate_password(password, user=None, password_validators=None)[sumber]

Mengesahkan sebuah sandi. Jika semua pengesah menemukan sandi sah, mengembalikan None. Jika satu atau lebih pengesah menolak sandi, memunculkan sebuah ValidationError dengan semua pesan-pesan kesalahan dari pengesah.

Obyek user adalah pilihan: jika itu tidak disediakan, beberapa pengesah mungkin tidak dapat melakukan pengesahan apapun dan akan menerima sandi apapun.

password_changed(password, user=None, password_validators=None)[sumber]

Menginformasikan semua pengesah yang sandi telah berubah. Ini dapat digunakan oleh pengesah seperti satu yang mencegah penggunaan kembali sandi. Ini harus dipanggil sekali sandi telah berhasil dirubah.

Untuk subkelas-subkelas dari AbstractBaseUser, bidang sandi akan ditandai sebagai “dirty” ketika memanggil set_password() yang memicu semua pada password_changed() setelah pengguna disimpan.

password_validators_help_texts(password_validators=None)[sumber]

Mengembalikan daftar dari teks bantuan dari semua pengesah. Ini menjelaskan persyaratan sandi ke pengguna.

password_validators_help_text_html(password_validators=None)

Mengembalikan sebuah string HTML dengan semua bantuan teks di sebuah <ul>. Ini sangat membantu ketika menambahkan pengesahan pada formulir, ketika anda dapat melewatkan keluaran secara langsung ke parameter help_text dari bidang formulir.

get_password_validators(validator_config)[sumber]

Mengembalikan sekelompok obyek pengesah berdasarkan pada parameter validator_config. Secara awalan, semua fungsi menggunakan pengesah ditentukan di AUTH_PASSWORD_VALIDATORS, tetapi dengan memanggil fungsi ini dengan alternatif kumpulan dari pengesah dan kemudian melewatkan hasil kedalam parameter password_validators dari fungsi lain, kumpulan penyesuaian anda dari pengesah akan digunakan sebagai gantinya. Ini sangat berguna ketika anda mempunyai kumpulan khusus dari pengesah untuk menggunakan kebanyakan skenario, tetapi juga mempunyai keadaan khusus yang membutuhkan penyesuaian kumpulan. Jika anda selalu menggunakan kumpulan sama dari pengesah, tidak perlu menggunakan fungsi ini, ketika konfigurasi dari AUTH_PASSWORD_VALIDATORS digunakan secara awalan.

Struktur dari validator_config``mirip pada struktur dari :setting:`AUTH_PASSWORD_VALIDATORS`. Nilai kembalian dari fungsi ini dapat dilewatkan kedalam parameter ``password_validators dari fungsi-fungsi terdaftar diatas.

Catat bahwa dimana sandi dilewatkan ke satu dari fungsi-fungsi ini, ini harus selalu sandi teks jelas - bukan sebuah sandi dicampur.

Menulis pengesah anda sendiri

Jika pengesah siap-pakai Django tidak cukup, anda dapat menulis pengesah sandi anda sendiri. Pengesah adalah kelas-kelas cukup sederhana. Mereka harus menerapkan dua metode:

  • validate(self, password, user=None): sahkan sebuah sandi. Kembalikan None jika sandi adalah sah, arau munculkan sebuah ValidationError dengan pesan kesalahan jika sandi tidak sah. Anda harus dapat berhubungan dengan user menjadi None - jika itu berarti pengesah anda tidak dapat berjalan, cukup kembalikan None untuk tidak ada kesalahan.

  • get_help_text(): menyediakan teks bantuan untuk menjelaskan persyaratan ke pengguna.

Barang apapun di OPTIONS di AUTH_PASSWORD_VALIDATORS untuk pengesah anda akan dilewatkan ke pembangun. Semua argumen pembangun harus memiliki nilai awalan.

Ini adalah contoh dasar dari pengecekan, dengan satu pilihan pengaturan:

from django.core.exceptions import ValidationError
from django.utils.translation import ugettext as _

class MinimumLengthValidator(object):
    def __init__(self, min_length=8):
        self.min_length = min_length

    def validate(self, password, user=None):
        if len(password) < self.min_length:
            raise ValidationError(
                _("This password must contain at least %(min_length)d characters."),
                code='password_too_short',
                params={'min_length': self.min_length},
            )

    def get_help_text(self):
        return _(
            "Your password must contain at least %(min_length)d characters."
            % {'min_length': self.min_length}
        )

Anda dapat juga menerapkan password_changed(password, user=None), yang akan dipanggil setelah perubahan sandi berhasil. Itu dapat digunakan untuk mencegah penggunaan kembali sandi, sebagai contoh. Bagaimanapun, jika anda memutuskan menyimpan sandi pengguna sebelumnya, anda harus tidak pernah melakukannya di pembersihan teks.

Back to Top