Python 3.3 Percanggahan Fungsi Hash: Mendedahkan Mekanisme Keselamatan
Dalam Python 3.3, fungsi hash() telah diperhatikan untuk mengembalikan hasil yang berbeza-beza untuk rentetan yang sama merentas sesi yang berbeza. Tingkah laku yang kelihatan membingungkan ini berakar umbi dalam mekanisme keselamatan yang disengajakan yang dilaksanakan untuk menggagalkan serangan penafian perkhidmatan.
Untuk memahami mekanisme ini, adalah penting untuk menyedari bahawa Python menggunakan benih cincang rawak yang ditetapkan pada permulaan. Dengan memasukkan offset ini ke dalam pengiraan cincang, penyerang kehilangan keupayaan untuk mereka bentuk kunci yang bertujuan khusus untuk menyebabkan perlanggaran.
Untuk menggambarkan, pertimbangkan nilai cincang untuk rentetan "235":
>>> hash("235") -310569535015251310
Setelah memulakan konsol Python baharu, nilai cincang berubah:
>>> hash("235") -1900164331622581997
Kebolehubahan ini berfungsi sebagai langkah perlindungan terhadap penyerang yang mungkin mengeksploitasi prestasi kes terburuk sisipan dict, yang membawa kepada O(n^ 2) kerumitan. Akibatnya, penyerang tidak dapat meramalkan kekunci mana yang akan berlanggar dan mendorong penafian perkhidmatan.
Walau bagaimanapun, perlu diperhatikan bahawa pengimbangan itu tidak hanya melibatkan penambahan atau penolakan yang mudah. Ia terdiri daripada awalan dan akhiran, yang kedua-duanya tidak dapat diramalkan dan sentiasa berubah. Ini merumitkan penyimpanan dan penggunaan ofset.
Sebagai alternatif, untuk aplikasi yang memerlukan mekanisme pencincangan yang lebih stabil, seseorang boleh meneroka modul hashlib, yang menawarkan fungsi cincang kriptografi yang mantap. Ia adalah pilihan pilihan dalam projek pybloom kerana kebolehpercayaannya.
Atas ialah kandungan terperinci Mengapakah Fungsi Python 3.3 `hash()` Menghasilkan Keputusan Berbeza untuk Rentetan Yang Sama?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!