Soru:
Verilerin kendisini depolamadan, özel verilerin çift kontrolü için genel amaçlı yavaş / benzersiz hash rutini mi?
Bryan Field
2012-01-14 01:59:20 UTC
view on stackexchange narkive permalink

MD5, SHA1 gibi çeşitli hash rutinlerinin her tekrarında kaybolduğu bilinen bir benzersizlik yüzdesi olup olmadığını ve bunun diğer algoritmalarla nasıl karşılaştırılabileceğini merak ediyorum.

Teorik olarak yapabilirsem depolamak 256 ^ 16 * % 99 farklı değerler ve her birinin benzersiz MD5 eşdeğerleri var, 100 kez Hashing yapmak bana .99 ^ 100 = % 36,6 . Ad alanının genişliğine bakıldığında hangisi kötü değildir, ama gerçek yüzde nedir? Daha çok % 90 mı yoksa daha mı kötü? Yavaş, genel amaçlı bir hash için alternatif bir öneriniz var mı?

Kaba kuvvetin pahalı olduğundan emin olmak istiyorum ve idealden daha az entropiye sahip değerler olabilir, bunu yavaşlatmam gerekecek aşağıda, aşikar çözüm, süreci saçma bir şekilde tekrarlamaktır.

SHA-1 veya bir XOR kombinasyonu da düşünüyorum, ancak bu konudaki düşüncelerinizi duymak istiyorum.

Bir cevap:
Tom Leek
2012-01-14 02:43:25 UTC
view on stackexchange narkive permalink

Boşluk azalması meydana gelir, ancak böyle değildir.

Güvenli hash işlevlerinin, ortalama olarak rastgele bir işlevin yapacağı gibi davranması beklenir (yani, olası işlevler kümesi arasından tek tip olarak seçilen bir işlev ile aynı giriş ve çıkış uzunlukları). MD5 ve SHA-1'in nihai olarak güvenli olmadığı biliniyor (çünkü onlar için çarpışmaları rastgele bir işlevle bulabileceğimizden daha verimli bir şekilde bulabiliriz), ancak burada hala yeterince yakın tahminler var (yine de, birlikte çalışabilirlik dışında bunları kullanmamalısınız eski uygulamalarla; gerçekten SHA-256 gibi daha modern ve güvenli bir işlev kullanmalısınız).

Yani, n bitlik bir çıktı varsayarsak, 2 n n bit dizileri varsa, tüm çıktıların 2 n boşluğunun yaklaşık% 63.21'ini kapsamasını bekleyebilirsiniz. sup> olası çıktı değerleri (bu 1- (1 / e )). Alanın üçte birinden biraz fazlasını kaybedersiniz. Ancak , elde edilen tüm bu değerleri yeniden kullanırsanız, üçte birinden çok daha azını kaybedersiniz. Azaltma faktörü her tur için sabit değildir. Birkaç turdan sonra, tur başına ekstra azaltma çok azdır.

Belirli bir değere art arda birçok kez hash işlemi uyguladığınızda, aslında bir "rho yapısı" nda yürürsünüz. aşağıdaki şekil:

Rho structure when walking in a random function graph

Bu yapı, kabaca Yunanca ρ, "rho" harfine benzediği için bu şekilde adlandırılmıştır. Her nokta n bitlik bir değerdir ve her ok, karma işlevinizin uygulamasını temsil eder. Mavi nokta, başlangıç ​​noktanızdır. Yani fikir şu ki, işlevi yeterince çok kez uygulayarak, sonunda bir döngüye giriyorsunuz. Döngüde bir kez, hash fonksiyonunun art arda uygulamaları artık olası değerlerin alanını azaltmaz: sadece döngüde süresiz olarak yürürsünüz. Döngü uzunluğu, elde edebileceğiniz minimum alan boyutudur.

Hem "kuyruk" (döngüye girmeden önce geçtiğiniz değerler) hem de "döngünün" uzunlukları ortalama olarak 2 n / 2 sup >. Dolayısıyla, 128-bit çıktılı bir karma işlevi için, ardışık uygulamalar alanı 2 64 değerinin altına düşürmez, bu oldukça büyük bir değerdir; Bu minimum alana eşit bir şekilde ulaşmak, ortalama olarak 2 64 karma işlevi değerlendirmesi gerektirir, bu da pahalıdır.


Döngüyü, rho yapısını yürüyerek bulmak aslında Bir karma işlevi için çarpışmalar oluşturmak için kullanılabilen genel algoritmalardan biri olan Floyd'un döngü bulma algoritmasının temeli: rho yapısında, kuyruğun döngüye eklendiği noktada , bir çarpışma var (aynı değere hash olan iki farklı değer). Kriptografik olarak güvenli bir hash işlevi için, çarpışmaları bulmak zor olmalı; özellikle, Floyd'un algoritması hesaplama açısından uygulanabilir olmamalıdır; bu, n yeterince büyük hale getirilerek elde edilir (ör. SHA-256 için n = 256 : bu Floyd'un algoritmasının maliyetini artırır 2 128 , yani Dünya'da gerçekçi olarak mümkün değil).

Diğer bir deyişle: eğer yeterince geniş bir güvenli hash işlevi seçerseniz çıktı (güvenli olmanın bir ön koşulu), o zaman döngüye ulaşamayacak ve / veya yürüyemeyeceksiniz ve güvenliğiniz herhangi bir "alan azaltma" dan zarar görmeyecektir. Sonuç: Bir alan azaltma sorununuz varsa, o zaman güvenli bir karma işlevi kullanmıyorsunuzdur ve bu , düzeltmeniz gereken sorundur. Bu nedenle, SHA-256 kullanın.

Dairelerden kaçınan bir varyant kullansanız bile ("h_i = hash (i || h_ {i-1})" deyin), hash alanının yalnızca küçük bir kısmı kullanıldığında entropi kaybı gerçekten küçük olur.
Harika cevap!
IMHO, yapıyı rho yapısı olarak adlandırmak biraz yanıltıcıdır. Genellikle daha çok tüylü tüy yumağı gibidir. Bir hash fonksiyonunun çok büyük yineleme altındaki gücü, temelde ayrı kürk toplarının sayısı ve kürk toplarının boyutuyla belirlenir. Tüylerin uzunluğu yalnızca yineleme sayısı çok düşük olduğunda önemlidir.


Bu Soru-Cevap, otomatik olarak İngilizce dilinden çevrilmiştir.Orijinal içerik, dağıtıldığı cc by-sa 3.0 lisansı için teşekkür ettiğimiz stackexchange'ta mevcuttur.
Loading...