Bir iletinin güvenliğini (yani bir iletinin belirli bir karma ile tam olarak eşleştiğini) sağlamak için bir karma değerinin ne kadar büyük olması gerektiğini belirleyen bir tür kural var mı? 32 bit sayı veya 8 harfli ASCII parola gibi) herhangi bir iletiye uygulanabilecek bir şey.
belirli bir hash ile tam olarak bir mesaj eşleşir
Güvercin deliği prensibi nedeniyle bu mümkün değildir. Karma işlevine giriş iletisi, karma değerinden daha büyük olabildiği sürece, bazı iletilerin birbiriyle çarpıştığı ve harita ile eşleştiği garantilidir . aynı karma. Bu normaldir ve karmaların güvenliği için tek başına bir sorun değildir.
Sadece hash fonksiyonunun o kadar büyük olduğundan emin olmanız gerekir bilerek bu tür çarpışmaları (çarpışma saldırısı) bulmak hesaplamaya olanaksızdır. n bitlik karma özet, n/2 çarpışma direncine sahiptir. bit. Bir çarpışma saldırısına karşı 128 bit güvenlik elde etmek için, 256 bitlik bir karma özete sahip olmak gerekir. Bu, elbette, kısayol alan ve kaba kuvvetten daha kolay çarpışmalar bulabilen saldırılardan kaçınmak için hashın kriptografik olarak güvenli ( SHA-256 gibi ) olduğunu varsaymaktır.
Neye ulaşmak istediğinize çok bağlıdır. Birincisi, zaten orman tarafından işaret edildiği gibi, bir karmanın sadece bir girdi haritası açısından gerçekten istedikleriniz - genel durumda - mümkün değildir. mümkündür özel girdi, karma girdi kadar uzunsa veya daha uzunsa. 32 bit tamsayılardan bahsettiğinizden, aslında 32 bit tamsayı-tamsayı karmaları vardır.
Bununla birlikte, olası giriş sayısının 32 bitte o kadar az olduğunu, bir arama tablosu oluşturmanın aslında oldukça uygun olduğunu unutmayın (sadece 32GB alır, bu yüzden şu anda kullandığım bilgisayarda arama tablosu tamamen RAM'e sığar!). Bunun gerçek bir algoritma kullanmadığından bağımsız olarak, muhtemelen olamaz güvenli olduğunu söylemeye gerek yok.
Bir şeyi (dosya veya dize gibi) karma ile tanımlamayı planlıyorsanız ve kötü niyetli müdahale bir değerlendirme değilse veya en azından ilk önce değil Öncelikle, 64 biti "yeterince iyi" ve 128 biti "kesinlikle güvenli" olarak düşünebilirsiniz.
Kriptografik olarak güvenli karmaların verdiği garantileri bile sağlamayan CRC32, şeyleri birbirinden ayırmak ve yıllardır kaza değişikliklerini güvenilir bir şekilde tanımlamak için "oldukça iyi" olarak kabul edildi (ve 64 bit, tamamen farklı bir büyüklük düzenidir. 32 ile karşılaştırıldığında !!!). IDs 128 bittir ve açıkça olmadıklarında "benzersiz" olarak kabul edilirler. Ancak tüm pratik konular için, onlar.
Linux çekirdeğini ve milyarlarca cihazlarda kullanılan güvenlikle ilgili diğer yazılımları barındırmak için diğer şeylerin yanı sıra kullanılan GIT'i de ekleyecektim (böylece bir saldırı için çok ilginç bir hedef haline getiriyor) ) şeyleri ayrı ve güvenli tutmak için 128 bit karma kullanır, ancak aslında 160 bittir ...
Şimdi, kötü niyetli müdahale bir endişe ise, büyük olasılıkla bir güvenli = karma algoritma (böylece CRC hile yapmayacaktır), ancak zorunlu olarak daha fazla bite ihtiyacınız yoktur. Sadece neyi korumak istediğinize, ne kadar süre ve ne tür bir saldırıya karşı olduğuna bağlıdır.
Siphash veya Cityhash (varsayılan olarak, orijinal/ortak yapılandırmada, 32 ve 128 bit varyantları da vardır) sadece 64 bittir. Hangisi güçlüdür ve kullanırsanız kesinlikle güvenlidir; İnternet üzerinden gönderdiğiniz makul boyutta mesajların bütünlüğünü sağlamak için. Yeterince güçlü bir saldırgan 15-20 dakika içinde bir çarpışma bulabilir mi? Elbette. Ama kimin umrunda, 15 dakika sonra onunla bir şeyler yapmak için 14 dakika 59 saniye çok geç.
Öte yandan, daha uzun süre saklanan bir şey için kullanmayı planlıyorsanız hiç de değil iyi.
Bu durumda, en azından 128, daha iyi 160 bit ve makul bir "kesinlikle güvenli" demek için 256 bit veya daha yukarıya ihtiyacınız olacak, yine = Ne tam olarak istediğiniz. "Hemen hemen herkes için yeterince iyi" olarak kabul edilen AES-CGM'nin en fazla 128 biti vardır (96'ya kadar).
Saldırganınız iki giriş seçecek mi, bu yüzden doğum günü saldırısı uygulanabilir mi? Bu durumda 128 bit sadece 64 bit değerindedir (veya projeksiyonlar varsa kuantum bilgisayarlarda 42 bit). Bu kesinlikle biraz yetersiz ve "kesinlikle güvenli", "yeterince iyi" demek için yeterli değil.
sadece ikinci ön koşul saldırıları hakkında endişeleniyor musunuz, yani girdilerden birini seçiyor musunuz? Bu durumda 128 bit "kudretli", 160 bit "kırılmaz" ve 256 bit "gülünç kırılmaz" olacaktır. Algoritmanın kendisi kırılmadığı sürece.
tl, dr
Sonuç olarak, önkoşulları dikkate almanızı gerektirmeyen koşulsuz bir cevabı tercih ediyorsanız, bu cevabın 256 veya daha fazla .
256 bit "gülünç şekilde imkansız" alanı içinde, ancak algoritmaların zamanla kırıldığını düşünmeliyiz, bu yüzden 256 bit algoritma olabilir sadece bir iş yüküne değer 10-20 yıl içinde 2 ^ 140 veya 2 ^ 150 bilmenin bir yolu yoktur. Biraz paranoyak iseniz, "kesinlikle güvenli" demek için yeterli olmayabilir (çoğu insan için hala yeterli olsa da).
Bu nedenle, paranoya seviyenizi bilmeden "256 veya daha fazla" diyorum. Birkaç ekstra bit gerçekten çok pahalı değil, ancak kocaman etkisi var. 384 hatta 512 yap, neden olmasın. 512 bit algoritma çok, çok önemli ölçüde kırılmış ve 2 ^ 300 gibi bir iş yüküne zayıflamışsa ve para boyutlu uzaylıların icat ettiği hiper-kuantum-süper-sihirli bilgisayarlar, matematiksel ve fiziksel olarak imkansız uygulayarak magic, bunu 2 ^ 150 bit'lik bir iş yüküne daha da azaltın, o zaman hala gitmek için çok iyisiniz.
Bir karma işlevinin çıktı boyutu güvenlik düzeyine bir üst sınır koyar. Herhangi bir kriptografik hash fonksiyonunun sahip olması beklenen üç ana özellik, çarpışma, ilk preimage ve ikinci preimage saldırılarına karşı dirençtir.
Bir algoritmanın n - bit güvenliği varsa, ilgili güvenlik özelliklerini ihlal eden ve 2'den daha azını gerektiren bir saldırı olmadığı anlamına gelir.n adımlar (yaklaşık olarak ve ortalama olarak) başarılı olmak için. n yeterince büyükse, hiç kimsenin bir sisteme saldırmak için yeterli bilgi işlem gücüne sahip olmadığından neredeyse emin olabiliriz.
n - bit çıktısı olan bir karma işlevinden, preimage saldırıları söz konusu olduğunda n - bit güvenlik kadar bekleyebiliriz, ancak daha yüksek değil . Bir kimse kaba kuvvetle varsayımsal olarak bir preimage arayabilir ve ortalama 2n dener.)
Ancak çarpışma direnci için doğum günü problemi , n bit yerine 2 * n bit'e ihtiyacınız olduğu anlamına gelir.
Genellikle 128 bit güvenlik hedefliyoruz, bu da kabul edilebilir en küçük özet boyutunun 256 bit olduğu anlamına gelir. 128 bitlik güvenlik, sizi birkaç çıkış biti kullanarak yine de güvenli olacağınız kadar büyük bir güvenlik marjıyla bırakır, ancak çok az bit kullanmak risklidir.
Not: Bu bir üst sınırdır. Murmur3, CityHash, xxHash ve diğerleri gibi algoritmalar yüksek kalitede olduklarını ve uzun çıktılara sahip olduklarını iddia etseler de, anlamlı bir güvenlik sağlamazlar.
Kesinlikle yalnızca çıktı boyutuna göre bir algoritma seçmeyin. Çıktı boyutu yalnızca bir karma'nın maksimum teorik gücünü belirler. Gerçek gücü değil.
Bunun yerine, insanların güvenli olduğunu kabul ettikleri çarpışmaya dayanıklı bir hash fonksiyonu seçin, örn. Blake-2, SHA-3, Skein veya SHA-2.
Not 2: SHA-512 gibi bir şey kullanıyorsanız, algoritmayı farklı girişler her zaman benzersiz çıktılarla sonuçlanacakmış gibi ele alabilirsiniz. Olasılık neredeyse bire eşit olduğunda, herhangi bir gerçek dünya girdi seti için yinelenen özetler elde edemezsiniz.
Çarpışma özetlerini görme olasılığı hem hash etmeye çalıştığınız mesajların sayısına hem de kaç tane çıkış olabileceğine bağlıdır. Karma yapmaya çalışabileceğiniz farklı mesajların sayısı doğal olarak sınırlıdır, çünkü karmaları hesaplama gücünüz sınırlıdır.
Karma işlevleri tam olarak injektif değildir, ancak yazılım geliştiricileri büyük bir çarpışmaya dayanıklı karma işlevini kullanabilir ve bunu doğru gibi davranabilir. Yanlışlıkla bir veya daha fazla çarpışma üretme şansı teknik olarak sıfır değildir, ancak bir kişinin beyni ne kadar inanılmaz derecede imkansız olduğunu kavrayamaz.
Her bir mesaj özeti tam olarak bir mesaja karşılık gelecek şekilde sahip olmamız gerekiyorsa, özümümüz mümkün olan en uzun mesaj kadar büyük olmalıdır.
İletiyi dev bir N-bit tamsayı olarak alıyoruz ve ters çevrilebilir bir işlev kullanarak ondan başka bir N-bit tamsayı hesaplıyoruz. Bunu yapmanın bir yolu, mesajı simetrik bir şifre ile şifrelemek olacaktır (bu anahtar daha sonra karma işlevini belirtir).
Tabii ki, en uzun mesaj olduğu sürece hash pratik değildir, çünkü mesaj özetleri için önemli bir gereklilik, bunların sindirilen mesajların kendilerinden çok daha küçük olan sabit, küçük bir boyutta olmalarıdır.
Bununla birlikte, küçük bir mesajı, çarpışmadan arınmış ve mesajın kurtarılması zor olan bir koda dönüştürmeniz gerekiyorsa, yukarıdakiler bunu yapmanın bir yolu olacaktır.