Topik temu duga representatif

Temu Duga Backend: Bagaimana Anda Menyimpan Kata Laluan dengan Selamat dan Memigrasikan Cincangan Warisan?

BackendSukar
Pasukan Editorial Offer.ccDiterbitkan Dikemas kini

Soalan

Sebuah produk SaaS dengan 10,000,000 akaun menyimpan campuran rekod kata laluan bcrypt, PBKDF2, dan SHA-256 tanpa salt. Reka bentuk migrasinya ke Argon2id. Rangkumi format rekod, pengukuran parameter, pengesahan log masuk dan peningkatan serentak, akaun yang lama tidak aktif, pepper, respons terhadap kebocoran data, pertahanan terhadap penghitungan akaun (account enumeration) dan keletihan sumber (resource exhaustion), serta kriteria pelancaran dan penyelesaian yang boleh disahkan.

Soalan dan Skop

Sebuah produk SaaS dengan 10,000,000 akaun sedang membina semula pengesahan kata laluan. Kira-kira 7,000,000 rekod pangkalan data menggunakan bcrypt dengan kos 10, 2,000,000 menggunakan PBKDF2-HMAC-SHA256 dengan 210000 lelaran, dan 1,000,000 menggunakan SHA-256 tanpa salt bagi setiap rekod. Format sedia ada adalah tidak konsisten, dan sesetengah baris tidak mengenal pasti algoritma dan parameternya secara terus. Pada waktu puncak, perkhidmatan pengesahan mesti mengendalikan 1500 pengesahan kata laluan sesaat. Setiap tika (instance) membenarkan paling banyak 24 cincangan intensif sumber secara serentak.

Reka bentuk migrasi lengkap ke Argon2id. Terangkan model ancaman, pemilihan parameter dan pengukuran kapasiti, format storan yang boleh berkembang (evolvable), pengesahan algoritma bercampur, peningkatan semasa log masuk, perubahan kata laluan serentak, akaun yang lama tidak aktif, pengurusan pepper, respons terhadap pendedahan pangkalan data atau kunci, pertahanan terhadap penghitungan akaun dan keletihan sumber, serta kriteria pelancaran dan penyelesaian. Jumlah akaun, campuran algoritma, parameter warisan, dan had keserempakan adalah kekangan temu duga, bukan ambang keselamatan sejagat.

Ini adalah soalan keselamatan backend dan kejuruteraan pengesahan. Pengesah kelayakan dan mesin keadaan migrasi adalah fokus utama. Reka bentuk pendaftaran penuh, pemulihan kata laluan, MFA, atau sesi adalah di luar skop kecuali jika aliran tersebut mempengaruhi migrasi kelayakan atau respons terhadap kebocoran data.

Perkara yang Dinilai oleh Penemu Duga

Pertama, bolehkah calon membezakan tekaan dalam talian daripada pemecahan luar talian? Had kadar (rate limits) mengekang titik akhir log masuk, tetapi ia tidak mengekang penyerang yang telah memperoleh pangkalan data cincangan. Kata laluan adalah rahsia manusia yang berentropi rendah. Ringkasan pantas seperti SHA-256 membolehkan penyerang menghitung calon kata laluan dengan cepat; cincangan khusus kata laluan meningkatkan kos setiap tekaan melalui salt bagi setiap rekod, pengiraan yang boleh dilaraskan, dan kos memori.

Kedua, adakah calon memahami bahawa parameter mesti diukur berbanding kapasiti sebenar? "Gunakan Argon2id" memilih algoritma tetapi tidak melengkapkan reka bentuk. Jawapan yang lengkap memilih memori m, lelaran t, keparalelelan p, panjang salt, dan panjang output, kemudian mengira cara pengesahan serentak mempengaruhi memori, CPU, kependaman (latency), dan pendedahan kepada penafian perkhidmatan (denial-of-service). Parameter yang lebih tinggi tidak bermakna lebih selamat secara automatik. Jika trafik serangan menghabiskan memori perkhidmatan, ketersediaan pengesahan akan gagal terlebih dahulu.

Ketiga, bolehkah calon memigrasikan data yang tidak boleh dibalikkan (irreversible)? Sistem tidak mengetahui kata laluan teks biasa bagi setiap pengguna, jadi ia tidak boleh menyahsulit hasil bcrypt di luar talian dan menukarnya kepada Argon2id. Laluan biasa adalah dengan berjaya mengesahkan rekod warisan dan menggunakan teks biasa yang dibekalkan dalam permintaan tersebut untuk mencipta rekod semasa. Akaun yang lama tidak aktif memerlukan pengesah warisan terkawal, pembalutan (wrapping) sementara, atau set semula, bergantung pada risiko algoritma warisan dan sejarah pendedahannya.

Akhir sekali, jawapan yang mantap mengendalikan perlumbaan data (race conditions) dan sempadan operasi. Peningkatan log masuk tidak boleh menimpa set semula kata laluan yang berlaku serentak. Pepper tidak sepatutnya berada di sebelah pangkalan data cincangan. Versi algoritma, parameter, dan keadaan migrasi memerlukan kebolehcerapan, tetapi log tidak boleh mengandungi kata laluan, cincangan lengkap, atau pepper. "Kod baharu telah digunakan (deployed)" bukanlah kriteria penyelesaian.

Penjelasan Sebelum Menjawab

  • Bolehkah setiap format sedia ada dikenal pasti dengan pasti? Tentukan algoritma, parameter, pengekodan aksara, lokasi salt, dan versi pustaka bersejarah. Jangan teka format dan mencuba beberapa pengesah untuk baris yang tidak dapat dikenal pasti.
  • Bagaimanakah bcrypt warisan mengendalikan input melebihi 72 bait? Tiru semantik pengekodan dan pemotongan pelaksanaan bersejarah supaya migrasi tidak mengubah kelayakan berkesan pengguna secara senyap.
  • Pernahkah pangkalan data, sandaran, atau set cincangan warisan terdedah sebelum ini? Membalut pangkalan data semasa tidak boleh menarik balik ringkasan pantas tanpa salt yang telah pun terdedah. Set semula paksa dan tindakan sesi mungkin diperlukan.
  • Apakah bajet sumber sebenar tika pengesahan? Dapatkan memori garis dasar, kuota CPU, had keserempakan cincangan, kelajuan penskalaan automatik, kependaman p95 dan p99 sasaran, serta kadar kegagalan yang boleh diterima.
  • Adakah FIPS atau kekangan pematuhan lain terpakai? Ia boleh mengekang algoritma dan pelaksanaan, tetapi label pematuhan tidak menggantikan pengukuran parameter atau reka bentuk migrasi.
  • Adakah pepper sudah wujud? Sahkan storannya, kebergantungan panggilan, versi, keupayaan penggiliran, sempadan audit, dan tingkah laku apabila perkhidmatan kunci tidak tersedia.
  • Apakah sempadan transaksi untuk perubahan kata laluan dan pengeluaran sesi? Urutan migrasi, set semula serentak, dan pengeluaran sesi mesti jelas, atau kata laluan lama mungkin memperoleh sesi baharu selepas set semula.
  • Bagaimanakah nilai perniagaan dan risiko membahagikan akaun yang lama tidak aktif? Akaun berkeistimewaan, akaun yang aktif baru-baru ini, dan akaun yang tidak aktif bertahun-tahun boleh mempunyai tarikh akhir dan keperluan pengesahan semula yang berbeza.

Kerangka Jawapan 30 Saat

"Saya akan mentakrifkan matlamat utama sebagai ketahanan terhadap tekaan luar talian selepas berlakunya kebocoran pangkalan data cincangan dan melindungi kapasiti pengesahan dalam talian secara berasingan. Kata laluan baharu menggunakan Argon2id dengan salt rawak bebas. Rekod membawa algoritma, versi, m/t/p, salt, dan output. Jika kita menggunakan pepper, ia berada dalam sistem kunci di luar pangkalan data. Saya akan menggunakan minimum semasa OWASP sebagai titik permulaan calon, kemudian melakukan ujian beban pada tika yang setara dengan pengeluaran untuk memori serentak, CPU, dan kependaman p99 dan bukannya sekadar menyalin satu nilai.

Semasa log masuk, versi rekod yang diisytiharkan memilih tepat satu pengesah warisan. Selepas pengesahan berjaya, saya mengira rekod Argon2id semasa dan melakukan compare-and-swap (CAS) terhadap cincangan lama. Jika perubahan serentak menyebabkan ia gagal, saya memuat semula dan mengesahkan rekod terkini daripada menimpa set semula kata laluan. Kata laluan baharu dan yang diset semula menggunakan format semasa serta-merta. Akaun SHA-256 tanpa salt diberi tarikh akhir migrasi yang lebih singkat; apabila pembalutan selamat tidak tersedia atau pendedahan telah berlaku, ia mesti diset semula.

Titik akhir menggunakan ralat seragam, cincangan olok-olok (dummy hash) semasa, had kadar akaun dan sumber yang bebas, serta keserempakan cincangan terhad untuk menentang penghitungan akaun dan keletihan memori. Selepas keluaran, saya menjejaki migrasi mengikut versi algoritma, kependaman, memori, kegagalan, konflik CAS, dan penyelesaian set semula. Saya mengisytiharkan penyelesaian hanya selepas format warisan berisiko tinggi mencapai sifar, ujian perlumbaan dan beban puncak lulus, serta latihan penggiliran kunci berjaya."

Penerangan Langkah demi Langkah

Langkah 1: Asingkan permukaan serangan dalam talian dan luar talian

Log masuk biasa ialah laluan dalam talian. Pemprosesan titik akhir (endpoint throughput), kawalan setiap akaun, kawalan sumber, sistem risiko, dan pemantauan mengekang penyerang. Meneka selepas kebocoran pangkalan data ialah laluan luar talian: penyerang menjalankan pengesah pada GPU, ASIC, atau tika awan mereka sendiri tanpa had kadar aplikasi. Storan kata laluan terutamanya meningkatkan kos setiap percubaan calon pada laluan kedua tersebut.

SHA-256 tanpa salt mempunyai dua masalah. Ia pantas, dan kata laluan yang sama menghasilkan ringkasan yang sama, jadi penyerang boleh menggunakan semula kerja yang telah dikira sebelumnya dan mengenal pasti kumpulan yang menggunakan semula kata laluan. Salt rawak bebas bagi setiap rekod menjadikan kata laluan yang sama menghasilkan output yang berbeza dan memaksa kerja pengiraan dilakukan bagi setiap rekod. Salt boleh disimpan bersama cincangan dan tidak perlu dirahsiakan. Salt tidak menjadikan SHA-256 yang pantas sebagai cincangan kata laluan yang sesuai; ketahanan yang bermakna datang daripada algoritma khusus, boleh dilaraskan, dan sebaik-baiknya sukar dari segi memori (memory-hard).

Pepper ialah kawalan yang berasingan. Ia adalah rahsia pihak pelayan yang dikongsi merentas rekod atau diuruskan mengikut versi, dan ia mesti diasingkan daripada pangkalan data kata laluan, biasanya dalam perkhidmatan pengurusan kunci (KMS), HSM, atau persekitaran pelaksanaan terlindung. Ia boleh mengurangkan impak kebocoran pangkalan data sahaja, tetapi ia tidak menggantikan salt bagi setiap rekod mahupun cincangan perlahan. Jika pangkalan data dan pepper kedua-duanya terdedah, pemprosesan kelompok pangkalan data tidak boleh menukar kunci (rekey) rekod yang terjejas dengan selamat kerana perkhidmatan tidak memiliki kata laluan teks biasa pengguna.

Langkah 2: Pilih parameter dan kira kapasiti pengesahan

Untuk rekod baharu, gunakan pelaksanaan Argon2id yang diselenggara. Satu calon minimum OWASP semasa ialah m=19456 KiB, t=2, dan p=1. RFC 9106 memberikan cadangan umum memori yang lebih tinggi, termasuk 64 MiB, tiga laluan, dan empat lorong untuk pilihan yang dikekang memori. Dokumen-dokumen ini menyasarkan kekangan operasi yang berbeza, jadi tiada satu tupel yang merupakan pemalar perkhidmatan Web sejagat.

Proses pemilihan yang lebih wajar dipertahankan ialah:

  1. Mulakan daripada calon yang telah disemak pada CPU, had memori, dan masa jalan (runtime) yang sama seperti yang digunakan dalam pengeluaran.
  2. Ukur median pengesahan tunggal, p95, p99, memori pemastautin sebenar, dan masa CPU.
  3. Uji beban campuran trafik puncak normal, lonjakan log masuk, kata laluan salah, dan akaun yang tidak wujud.
  4. Hadkan keserempakan dan perhatikan masa giliran, OOM kontena, pendikit (throttling) CPU, dan tamat masa huluan.
  5. Pilih kos penyerang tertinggi yang mampan dalam bajet ketersediaan, dan catatkan perkakasan, versi pustaka, dan tarikh pengukuran.

Pada 19 MiB, memori kerja cincangan teori untuk 24 operasi serentak sudah mencapai 456 MiB, sebelum mengambil kira garis dasar proses, overhed pustaka, objek permintaan, dan margin keselamatan. Jika satu pengesahan mengambil masa 250 milisaat pada tika sasaran, anggaran maksimum kasarnya ialah kira-kira 96 penyelesaian sesaat. Melayani 1500 sesaat memerlukan sekurang-kurangnya kira-kira 16 tika setara yang tersedia secara berterusan, dengan ruang kepala tambahan untuk kependaman ekor (tail latency), kegagalan, dan kelengahan penskalaan automatik. Pengiraan ini mendedahkan magnitud kapasiti; ujian beban menentukan nilai akhir.

Gunakan salt rawak 128-bit bebas yang baharu bagi setiap rekod dan, contohnya, output 256-bit. Biarkan pustaka matang menjana dan menghurai pengekodan standard dan bukannya memasang medan kriptografi secara manual. Input kata laluan memerlukan pengekodan bait yang stabil dan didokumentasikan sebelum pencincangan. Jika Unicode diterima, tentukan penormalan dan gunakannya secara konsisten semasa pendaftaran, log masuk, dan migrasi.

Langkah 3: Jadikan rekod kelayakan boleh menerangkan diri sendiri dan boleh berkembang

Rekod mesti membawa maklumat bukan rahsia yang diperlukan untuk pengesahan. Pengekodan Argon2 boleh kelihatan seperti ini:

text
$argon2id$v=19$m=19456,t=2,p=1$SALT_BASE64$TAG_BASE64

Format warisan juga memerlukan pemetaan deterministik seperti {bcrypt}, {pbkdf2-sha256}, dan {sha256-legacy}. Label ialah protokol penghuraian, bukan pengesahan keselamatan. Tolak label yang tidak diketahui, medan yang hilang, nilai Base64 yang tidak sah, atau parameter di luar dasar dan hantar akaun ke baris gilir pemulihan terkawal. Jangan cuba algoritma secara berurutan sehingga salah satu daripadanya kebetulan sepadan.

Penghuraian parameter memerlukan had atas. Jika penyerang boleh mengusik rekod, mereka boleh menetapkan nilai memori atau lelaran yang melampau dan memakan sumber perkhidmatan melalui permintaan log masuk. Pengesah hanya menerima algoritma yang digunakan dan julat parameter yang dibenarkan. Rekod di luar julat menghasilkan peristiwa keselamatan tanpa data sensitif dan memerlukan pemulihan akaun.

Jadual kelayakan memerlukan sekurang-kurangnya pengekodan semasa, masa kemas kini kelayakan, dan keadaan pelupusan keselamatan. Laporan migrasi boleh diagregatkan daripada awalan pengekodan atau scheme_id kekardinalan rendah. Jangan sekali-kali meletakkan cincangan penuh, salt, kata laluan calon, rahsia pepper, atau perantaraan pengesahan dalam log, label metrik, atau sistem analitik.

Langkah 4: Tingkatkan dengan selamat selepas log masuk yang berjaya

Fungsi migrasi menghurai rekod dan memanggil satu pengesah yang sepadan. Hanya selepas kelayakan warisan berjaya, perkhidmatan mempunyai teks biasa yang betul daripada permintaan ini dan boleh mengira rekod Argon2id semasa. Kekalkan kerja intensif di luar transaksi pangkalan data yang singkat dan syaratkan penulisan pada rekod lama:

text
record = loadCredential(userId)
ok = verifyByDeclaredScheme(record.hash, submittedPassword)
if !ok: rejectWithGenericError()

if needsRehash(record.hash):
  upgraded = hashWithCurrentPolicy(submittedPassword)
  changed = compareAndSwap(userId, expected=record.hash, replacement=upgraded)
  if !changed:
    latest = loadCredential(userId)
    if !verifyByDeclaredScheme(latest.hash, submittedPassword):
      rejectAndAskForFreshLogin()

issueSessionAfterCredentialStateIsConfirmed()

Compare-and-swap menghalang peningkatan log masuk daripada menimpa set semula kata laluan yang serentak. Kemas kini bersyarat yang gagal boleh bermakna log masuk lain telah menyelesaikan migrasi yang sama atau pengguna baru sahaja memilih kata laluan yang berbeza. Muat semula dan sahkan input semasa terhadap rekod terkini; jangan keluarkan sesi semata-mata kerana rekod lama pernah sepadan sebelum ini. Pendaftaran, perubahan kata laluan sukarela, dan pemulihan kata laluan menulis format semasa secara terus dan tidak pernah mencipta satu lagi rekod warisan.

Dasar risiko menentukan sama ada log masuk boleh diteruskan apabila penulisan peningkatan gagal. Ralat pangkalan data yang boleh dicuba semula boleh meninggalkan sementara rekod warisan yang boleh diterima dan mengeluarkan peristiwa kegagalan migrasi. Format berisiko tinggi boleh memerlukan peningkatan yang berjaya sebelum pengeluaran sesi. Dalam kedua-dua kes, hadkan percubaan semula supaya satu log masuk tidak melaksanakan beberapa cincangan intensif secara berterusan tanpa henti.

Langkah 5: Rawat format warisan yang boleh diterima dan berisiko tinggi secara berbeza

Bcrypt dan PBKDF2 yang cukup kuat boleh mengekalkan pengesahan baca sahaja semasa tempoh migrasi terkawal dan dinaik taraf selepas log masuk yang berjaya. Minimumkan pendedahan pengesah warisan: ia hanya melayani rekod sedia ada dan tidak boleh mencipta kelayakan baharu. Jejaki baki akaun, aktiviti, dan kelajuan migrasi bagi setiap format. Sebelum mengeluarkan pengesah pada tarikh akhirnya, selesaikan setiap akaun yang masih bergantung padanya.

SHA-256 tanpa salt mempunyai risiko yang lebih tinggi. Jika tiada pendedahan berlaku dan set semula universal serta-merta tidak dapat dilaksanakan, perkhidmatan boleh menganggap ringkasan sedia ada sebagai input kepada algoritma luar perlahan dengan salt baharu sebagai pengukuhan pangkalan data sementara. Pengesahan terlebih dahulu menghasilkan semula operasi SHA-256 bersejarah dan kemudian mengesahkan lapisan luar. Selepas log masuk yang berjaya, perkhidmatan tetap menggantikannya dengan rekod Argon2id standard yang dikira daripada kata laluan yang diserahkan.

Pembalut (wrapper) tersebut tidak setara dengan Argon2id(password). Ia tidak boleh menarik balik ringkasan dalaman yang telah pun bocor, dan ia tidak membaiki masalah pengekodan bersejarah, pemotongan, atau kata laluan lemah. Jika cincangan warisan atau sandaran telah terdedah, akaun tersebut mempunyai keistimewaan, atau semantik format tidak pasti, wajibkan set semula, batalkan sesi yang berkaitan, dan pulihkan melalui aliran pengesahan bebas. Akaun biasa yang tidak aktif selama bertahun-tahun juga boleh dibekukan log masuk kata laluannya pada tarikh akhir dan menggunakan pemulihan apabila kembali dan bukannya mengekalkan pengesah paling lemah selama-lamanya.

Langkah 6: Reka bentuk versi pepper dan respons terhadap kebocoran data

Jika pepper digunakan, langkah prapemprosesan berkunci yang telah disemak boleh mendahului cincangan kata laluan, atau HMAC boleh melindungi outputnya. Pembinaan yang matang dan semakan keselamatan harus memutuskan komposisi yang tepat. Pangkalan data hanya menyimpan pengecam versi pepper bukan rahsia; kunci sebenar kekal di luar pangkalan data dan sandarannya. Perkhidmatan pengesahan menggunakan akses keistimewaan paling rendah (least privilege), dengan jangka hayat cache yang eksplisit dan tingkah laku yang jelas semasa kegagalan perkhidmatan kunci.

Penggiliran rutin boleh mengekalkan kunci semasa dan sebelumnya untuk seketika. Selepas pengesahan berjaya dengan versi lama, kira semula rekod penuh daripada teks biasa yang diserahkan dan pepper semasa. Kunci lama tidak boleh kekal selama-lamanya. Pelan penggiliran mengira akaun pada versi sebelumnya dan menetapkan laluan set semula atau pembekuan kepada akaun yang tidak berhijrah.

Lapiskan respons kebocoran data mengikut bukti:

  • Pangkalan data sahaja: kekalkan bukti, tutup titik masuk, tingkatkan pemantauan, dan buat keputusan mengenai set semula selepas menilai algoritma dan parameter. Pepper rahsia memberikan pertahanan tambahan tetapi tidak menjadikan kata laluan yang lemah selamat.
  • Pepper sahaja: gilirkan kunci, siasat log akses, dan tentukan sama ada penyerang mungkin juga telah memperoleh pangkalan data cincangan.
  • Pangkalan data dan pepper yang sepadan: kendalikan ini sebagai pendedahan cincangan kata laluan, paksa akaun yang terjejas untuk set semula, batalkan atau pendekkan sesi yang berkaitan, dan beri amaran kepada pengguna untuk menukar kata laluan yang digunakan semula.

Penggiliran yang berjaya tidak memadamkan pendedahan bersejarah. Rekod insiden harus merangkumi versi yang terjejas, skop akaun, sandaran, sesi, pemberitahuan, peratusan penyelesaian, dan pengecualian sisa.

Langkah 7: Tahan penghitungan akaun dan keletihan sumber secara serentak

Akaun yang tidak wujud, kata laluan salah, akaun dilumpuhkan, dan kegagalan migrasi mengembalikan semantik ralat luaran yang sama, termasuk status dan bentuk respons yang konsisten. Untuk akaun yang tidak wujud, jalankan satu cincangan olok-olok terkawal di bawah dasar semasa untuk mengurangkan jurang masa ketara antara pulangan serta-merta dan pengesahan intensif. Algoritma warisan yang bercampur masih boleh mempunyai pemasaan yang berbeza. Migrasi, pengukuhan masa jalan, dan pengukuran statistik harus mengurangkan perbezaan yang boleh dieksploitasi; jangan berjanji bahawa setiap respons rangkaian adalah masa malar (constant-time) yang sempurna.

Pencincangan intensif itu sendiri mencipta permukaan penafian perkhidmatan. Sebelum baris gilir cincangan, lakukan pendikit sumber kasar dan semakan kesahan permintaan yang tidak mendedahkan sama ada sesuatu akaun wujud. Untuk kerja yang diterima, laksanakan kuota akaun dan sumber yang bebas, baris gilir terhad global, dan 24 permit keserempakan bagi setiap tika. Satu baldi (bucket) yang dikunci oleh pasangan IP-dan-nama pengguna membolehkan penyerang menukar satu dimensi berulang kali dan mengelak had agregat.

Apabila baris gilir penuh, gagalkan pantas dengan respons sementara yang seragam dan bukannya mengumpul kerja tanpa had. Isyarat penskalaan harus merangkumi masa giliran, cincangan aktif, ruang kepala memori, dan pendikit CPU, bukan hanya jumlah permintaan. Log mengandungi pengecam akaun dalaman yang tidak boleh dibalikkan, versi skema kekardinalan rendah, kelas hasil, dimensi pendikit, dan baldi kependaman. Ia tidak mengandungi kata laluan yang diserahkan, rekod kelayakan lengkap, atau bahan kunci.

Langkah 8: Lancarkan secara berperingkat dan terima dengan bukti

Mulakan dengan inventori baca sahaja. Sahkan bahawa setiap rekod warisan boleh dihurai, dan sahkan pelaksanaan bersejarah dengan vektor ujian yang diketahui dalam persekitaran terpencil. Kemudian gunakan kod yang boleh membaca setiap format warisan yang disokong tetapi hanya menulis format semasa. Jadikan pendaftaran baharu dan perubahan kata laluan menulis Argon2id terlebih dahulu. Dayakan peningkatan log masuk untuk kohort kecil, perhatikan konflik CAS, kegagalan pengesahan, dan keluk sumber, serta kembangkan secara beransur-ansur.

Sebelum keluaran penuh, sahkan sekurang-kurangnya:

  • Tingkah laku kata laluan betul, kata laluan salah, panjang sempadan, Unicode, dan rekod cacat untuk setiap format bersejarah.
  • Perlumbaan antara peningkatan log masuk dan set semula kata laluan serentak, membuktikan bahawa log masuk lama tidak boleh menimpa kata laluan baharu atau mengeluarkan sesi yang tidak sah.
  • Latihan penggiliran dan kegagalan untuk versi pepper semasa, sebelumnya, dan tidak diketahui.
  • Kependaman, memori, CPU, pembarisan gilir, dan penskalaan pada sasaran 1500 pengesahan sesaat dengan trafik serangan bercampur.
  • Taburan mesej, status, saiz, dan kependaman untuk akaun yang tidak wujud dan setiap kelas kegagalan.
  • Imbasan untuk medan sensitif dalam pangkalan data, sandaran, log, metrik, dan penjejakan ralat.

Papan pemuka migrasi mengelompokkan mengikut algoritma dan peringkat risiko: jumlah kiraan, kiraan aktif baru-baru ini, peningkatan harian yang berjaya, sebab kegagalan, penyelesaian set semula mandatori, dan tarikh akhir. Penyelesaian teknikal bermakna setiap penulisan baharu menggunakan dasar semasa; SHA-256 tanpa salt dan versi yang terdedah berada pada sifar; pengesah warisan yang tidak diperlukan telah dialih keluar; sebarang format warisan yang boleh diterima yang masih tinggal mempunyai pengecualian yang didokumentasikan; ujian beban puncak dan perlumbaan lulus; penggiliran pepper dan latihan pemulihan mempunyai bukti; dan SLO pengesahan kekal dalam perjanjian.

Contoh Jawapan Berkualiti Tinggi

"Saya akan terlebih dahulu mengasingkan dua permukaan serangan. Kawalan titik akhir mengekang serangan dalam talian; ia tidak mengekang serangan luar talian selepas kebocoran pangkalan data cincangan berlaku. Oleh itu, kata laluan memerlukan cincangan khusus yang sukar dari segi memori dengan salt rawak bebas dan kos yang boleh dilaraskan. Rekod baharu menggunakan pelaksanaan Argon2id yang matang dan menerangkan sendiri versi algoritma, m/t/p, salt, dan output. Jika didayakan, pepper diindividukan versinya dalam sistem kunci di luar pangkalan data dan sandarannya.

Saya tidak akan menyalin parameter terus daripada blog. Saya akan menggunakan 19 MiB, t=2, p=1 semasa OWASP sebagai satu calon minimum dan mengukur p50, p95, p99 tunggal dan serentak, CPU, serta memori sebenar pada tika yang setara dengan pengeluaran, kemudian menguji beban pada puncak normal dan trafik serangan. Sembilan belas MiB didarabkan dengan 24 operasi serentak sudah menjadi 456 MiB memori kerja, jadi perkhidmatan memerlukan baris gilir terhad, permit keserempakan, dan ruang kepala tika yang mencukupi. Pustaka yang matang menjana salt rawak bagi setiap rekod, dan rekod tersebut menyimpan parameter untuk peningkatan pada masa hadapan.

Semasa log masuk, format yang diisytiharkan memilih tepat satu pengesah. Selepas kata laluan warisan berjaya, saya mengira rekod Argon2id semasa di luar transaksi pangkalan data dan mengemas kini hanya jika cincangan lama masih sepadan. Jika CAS gagal, saya memuat semula kelayakan terkini dan mengesahkan input ini sekali lagi. Log masuk serentak kemudiannya boleh menumpu (converge), manakala log masuk lama tidak boleh menimpa set semula kata laluan serentak. Saya mengeluarkan sesi hanya selepas mengesahkan keadaan kelayakan semasa. Pendaftaran, perubahan sukarela, dan pemulihan hanya menulis format baharu sejak hari pertama.

Bcrypt dan PBKDF2 yang masih boleh diterima mendapat tempoh migrasi yang ditetapkan dengan sokongan pengesahan sahaja. SHA-256 tanpa salt memasuki baris gilir berisiko lebih tinggi. Jika ia tidak pernah bocor, pembalut luar perlahan dengan salt baharu boleh memberikan pembendungan jangka pendek, tetapi ia tidak menggantikan pencincangan semula kata laluan sebenar. Akaun terdedah, berkeistimewaan, dan yang lama tidak aktif diset semula atau dibekukan mengikut tarikh akhir. Pengesah warisan tidak kekal selama-lamanya.

Titik akhir menggunakan ralat seragam dan cincangan olok-olok semasa untuk mengurangkan perbezaan penghitungan akaun, ditambah dengan had sumber dan akaun yang bebas, baris gilir global, dan had keserempakan memori untuk menentang penafian perkhidmatan amplifikasi cincangan. Bukti penyelesaian merangkumi taburan versi, sifar rekod warisan berisiko tinggi, kegagalan migrasi dan konflik CAS, ujian beban puncak dan perlumbaan, imbasan log sensitif, penggiliran pepper, dan latihan kebocoran data. Saya akan mengisytiharkan penyelesaian hanya selepas semakan tersebut lulus dan pengesah warisan yang dirancang telah ditamatkan."

Kesilapan Biasa dan Penambahbaikan

  • Menyimpan kata laluan sebagai SHA-256 dengan salt → salt menghalang penggunaan semula kerja merentas akaun tetapi tidak menghalang tekaan pantas bagi satu rekod → gunakan cincangan kata laluan khusus, boleh dilaraskan, dan sukar dari segi memori.
  • Mendakwa cincangan tidak boleh dipecahkan → tekaan calon masih boleh menemui kata laluan yang lemah → nyatakan matlamat sebagai meningkatkan kos luar talian, di samping penyekatan kata laluan terjejas dan MFA.
  • Menganggap parameter OWASP adalah optimum secara kekal → perkakasan, pustaka, sumber tika, dan trafik berubah → catatkan persekitaran penanda aras, ukur semula, dan tingkatkan mengikut versi.
  • Menukar setiap rekod bcrypt kepada Argon2id di luar talian → cincangan standard baharu tidak boleh diterbitkan tanpa teks biasa → cincang semula selepas pengesahan berjaya dan balut, set semula, atau bekukan baki rekod mengikut risiko.
  • Mengemas kini migrasi tanpa syarat nilai lama → log masuk boleh menimpa set semula kata laluan yang telah selesai → gunakan compare-and-swap, kemudian muat semula dan sahkan semula selepas kegagalan.
  • Memegang kunci baris pengguna (user-row lock) semasa pencincangan → kerja intensif memanjangkan tempoh kunci dan pegangan kolam sambungan → kira di luar transaksi dan lakukan penulisan bersyarat yang singkat.
  • Menyimpan pepper dalam jadual konfigurasi pangkalan data yang sama → satu kebocoran pangkalan data memperoleh kedua-dua lapisan → simpan kunci dalam sistem yang dilindungi secara bebas dan audit mengikut versi.
  • Menggilapkan pepper dengan menukar satu pemboleh ubah persekitaran → rekod lama tidak boleh disahkan secara terus dengan kunci baharu → simpan dua versi untuk seketika, kemudian kira semula selepas log masuk berjaya atau wajibkan set semula.
  • Kembali serta-merta untuk akaun yang tidak wujud → masa respons mendedahkan kewujudan akaun → gunakan ralat seragam, cincangan olok-olok, dan ujian taburan kependaman empirikal.
  • Menjalankan Argon2id tanpa had keserempakan → penyerang boleh menguatkan penggunaan memori dan CPU → gunakan had dua dimensi, kemudian baris gilir terhad dan permit keserempakan.
  • Mengabaikan sempadan input bcrypt → tingkah laku bersejarah 72 bait boleh mengubah kelayakan berkesan semasa migrasi → tiru pengesah warisan dan wajibkan perubahan kata laluan eksplisit untuk akaun yang terjejas.
  • Hanya menyemak bahawa pendaftaran baharu menggunakan Argon2id → rekod warisan yang aktif atau berisiko tinggi kekal terdedah → jejaki inventori mengikut algoritma, risiko, dan aktiviti, dengan kriteria sifar dan pengecualian.

Soalan Susulan

Susulan 1: Mengapakah salt boleh disimpan dalam teks biasa manakala pepper mesti dirahsiakan?

Salt menjadikan input setiap rekod unik, menghalang kata laluan yang sama daripada berkongsi output dan kerja pengiraan sebelumnya. Penyerang yang mengetahui salt masih mesti meneka setiap rekod secara berasingan. Pepper menambah nilai kerana penyerang yang hanya menceroboh pangkalan data tidak mempunyai rahsia pihak pelayan, jadi ia mesti diasingkan daripada pangkalan data cincangan. Kawalan ini mempunyai tugas yang berbeza; pepper tidak menggantikan salt bebas bagi setiap rekod.

Susulan 2: Bolehkah pangkalan data meningkatkan kiraan lelaran Argon2id secara terus?

Tiada cincangan kata laluan berparameter lebih tinggi yang standard boleh diterbitkan daripada output lama tanpa teks biasa pengguna. Pembalut luar boleh mengukuhkan output lama secara sementara, tetapi ia mengubah semantik rekod dan tidak boleh memadamkan risiko output yang terdedah sebelum ini. Peningkatan standard masih perlu dikira semula selepas pengesahan kata laluan berjaya atau memerlukan set semula.

Susulan 3: Mengapa tidak membenarkan log masuk serta-merta selepas CAS gagal?

Kegagalan tersebut boleh bermakna permintaan lain telah menyelesaikan migrasi yang sama, atau ia boleh bermakna pengguna secara serentak menetapkan kata laluan berbeza melalui pemulihan. Kata laluan lama adalah tidak sah dalam kes kedua. Memuat semula rekod terkini dan mengesahkan input yang diserahkan membezakan kedua-dua kes ini; pengesahan yang gagal tidak boleh menerima sesi.

Susulan 4: Adakah parameter Argon2id yang lebih tinggi sentiasa lebih baik?

Kos memori atau masa yang lebih tinggi meningkatkan kos serangan luar talian dan penggunaan sumber log masuk yang sah. Parameter yang berlebihan mencipta kependaman ekor, pembentukan baris gilir, OOM tika, dan penguat penafian perkhidmatan untuk permintaan murah. Dasar yang betul ialah kos mampan tertinggi yang diukur di bawah kekangan perkakasan, keserempakan, penskalaan, dan SLO sebenar, dan ia mesti dinilai semula apabila perkakasan dan ancaman berubah.

Susulan 5: Apakah yang sepatutnya berlaku kepada akaun yang tidak aktif selama lima tahun dan masih menggunakan bcrypt?

Kelaskan ia mengikut keistimewaan, sejarah pendedahan, dan parameter warisan. Akaun biasa berisiko rendah boleh dibekukan log masuk kata laluannya selepas tarikh akhir migrasi dan menetapkan kata laluan baharu melalui pemulihan terkawal apabila pengguna kembali. Akaun berkeistimewaan atau yang terjejas harus diset semula lebih awal dan dibatalkan sesinya. Mengekalkan pengesah warisan selama-lamanya menghalang migrasi daripada benar-benar selesai.

Sumber awam

Soalan berkaitan