Python, size çarpışmak üzere tasarlanmış anahtarlar göndererek saldırganların uygulamanızı batırmasını önlemek için rastgele bir karma tohum kullanır. Orijinal güvenlik açığı açıklamasına bakın . Karmayı rastgele bir tohumla dengeleyerek (başlangıçta bir kez ayarlanır) saldırganlar artık hangi anahtarların çarpışacağını tahmin edemez.
PYTHONHASHSEED
Ortam değişkenini ayarlayarak sabit bir çekirdek belirleyebilir veya özelliği devre dışı bırakabilirsiniz ; varsayılan random
değerdir, 0
ancak özelliği tamamen devre dışı bırakarak sabit bir pozitif tam sayı değerine ayarlayabilirsiniz .
Python 2.7 ve 3.2 sürümlerinde bu özellik varsayılan olarak devre dışı bırakılır ( etkinleştirmek için -R
anahtarı veya seti PYTHONHASHSEED=random
kullanın); Python 3.3 ve sonraki sürümlerde varsayılan olarak etkindir.
Bir Python setindeki anahtarların sırasına güveniyorsanız, o zaman güvenmeyin. Python, bu türleri uygulamak için bir karma tablo kullanır ve bunların sırası , ekleme ve silme geçmişinin yanı sıra rastgele karma tohumuna da bağlıdır. Python 3.5 ve daha eski sürümlerde bunun sözlükler için de geçerli olduğunu unutmayın.
Ayrıca object.__hash__()
özel yöntem belgelerine bakın :
Not : Varsayılan olarak, __hash__()
str, bayt ve datetime nesnelerinin değerleri tahmin edilemeyen rastgele bir değerle "tuzlanmıştır". Tek bir Python sürecinde sabit kalmalarına rağmen, Python'un tekrarlanan çağrıları arasında tahmin edilemezler.
Bu, bir dikt eklemenin en kötü durum performansını, O (n ^ 2) karmaşıklığını kullanan, dikkatle seçilmiş girdilerin neden olduğu bir hizmet reddine karşı koruma sağlamayı amaçlamaktadır. Ayrıntılar için http://www.ocert.org/advisories/ocert-2011-003.html adresine bakın.
Karma değerlerin değiştirilmesi, diktlerin, kümelerin ve diğer eşlemelerin yineleme sırasını etkiler. Python, bu sıralama hakkında hiçbir zaman garanti vermemiştir (ve genellikle 32 bit ve 64 bit yapılar arasında değişir).
Ayrıca bakınız PYTHONHASHSEED
.
Kararlı bir hash uygulamasına ihtiyacınız varsa, muhtemelen hashlib
modüle bakmak istersiniz ; bu, kriptografik hash işlevlerini uygular. Pybloom projesi bu yaklaşımı kullanır .
Göreli konum bir ön ek ve bir son ek içerdiğinden (sırasıyla başlangıç değeri ve son XORed değeri) maalesef ofseti saklayamazsınız. Artı tarafta, bu, saldırganların zamanlama saldırılarıyla ofseti kolayca belirleyemeyeceği anlamına gelir.