Karma algoritmayı “güvenli” yapan nedir?


19

Bu ilginç soruyu okuduktan sonra , ihtiyacım olursa hangi güvensiz karma algoritmasını kullanacağım konusunda iyi bir fikrim olduğunu hissettim, ancak bunun yerine neden güvenli bir algoritma kullanabileceğimi bilmiyordum.

Peki ayrım nedir? Çıktı sadece karma şeyi temsil eden rastgele bir sayı değil mi? Bazı karma algoritmaları güvenli kılan nedir?


8
Bu soru IT Security SE sitesi için daha uygundur .
Bernard

@Bernard Eğer durum buysa, bununla iyiyim, ama sorum gerçekten güvenli bir karma nasıl veya ne zaman kullanılacağına değil, güvenli bir karma algoritmasını güvenli olmayan bir algoritmadan ayıran şeyle ilgili değildi. Bu bana bir programlama sorusu gibi görünüyor, ancak IT Security SE'ye göz atmıyorum, bu yüzden belki de orada çalışıyor.
CodexArcanum

2
IT Security
ChrisF

Yanıtlar:


34

Her kriptografik hash işlevinden birinin istediği üç özellik vardır H:

  • öngörüntü direnç : Verilen h, herhangi bir değer bulmak zor olmalı xile h = H(x).

  • İkinci öngörüntü direnci : Verilen x1bulmak zor olmalı x2 != x1ile H(x1) = H(x2).

  • çarpışma direnci : Bu iki değer bulmak zor olmalı x1 != x2ile H(x1) = H(x2).

Genel tablo dillerinde (dize) hash tabloları için kullanılan hash fonksiyonları ile genellikle bunlardan hiçbiri verilmez, sadece aşağıdakileri sağlarlar:

  • zayıf çarpışma direnci : Alanın rastgele (veya "tipik olarak") seçilmiş değerleri için çarpışma olasılığı azdır. Bu, bir saldırganın kasıtlı olarak çarpışma oluşturmaya veya ön görüntü bulmaya çalışması hakkında hiçbir şey söylemez.

Yukarıdaki üç özellik (arasında) her şifreleme hash fonksiyonu için tasarım hedefleridir. Bazı işlevler için (MD4, SHA-0, MD5 gibi) bunun başarısız olduğu bilinmektedir (en azından kısmen). Mevcut jenerasyonun (SHA-2) güvenli olduğu varsayılmaktadır ve bir sonraki ("Güvenli Karma Algoritma 3") bir yarışmadan sonra standartlaştırılmaktadır .

Bazı kullanımlar için (parola karma ve parolalardan anahtar türetme gibi), gerçekte kullanılan değerlerin xalanı o kadar küçüktür ki bu alanı kaba zorlama normal (hızlı) güvenli karma işlevleriyle uygulanabilir hale gelir ve bu da istediğimiz zamandır:

  • yavaş yürütme : Verilen x, değeri hesaplamak için minimum (tercihen yapılandırılabilir) miktarda kaynak gerekir H(x).

Ancak diğer birçok kullanım için bu istenmez, bunun yerine biri istenir:

  • hızlı yürütme : Verilen xdeğeri hesaplamak H(x)mümkün olduğunca hızlıdır (hala güvenli iken).

Sık sık yineleyerek hızlı bir işlevden yavaş bir karma işlevi oluşturmak için bazı yapılar (PBKDF2 ve scrypt gibi) vardır.

Daha fazla ayrıntı için, kardeş sitemiz Cryptography Stack Exchange'deki karma etikete bir göz atın .


3

Güvenli, bir çarpışma kullanarak sizi yanıltmak isteyen birinin (yani iki kaynağın aynı değere hash edilmesi) zorluk yaşayacağı anlamına gelir.

Bazı özellikler:

  • karmayı bilmek, bu değere hash olan bir dosya oluşturmak zordur (varyant, yeni dosyanın bir kısmı ve istenen hash verilir)

  • aynı değere sahip iki farklı dosya oluşturmak zordur (varyant, dosyaların bir kısmı verilir)


3

Birincil fark oldukça basittir: normal bir karma, süreçte çok fazla yavaşlamadan olabildiğince kazara çarpışma sayısını en aza indirgemek içindir.

Güvenli bir karma, biri birisine neden olmak için elinden geleni yapsa bile, çarpışmaları önlemeyi amaçladı. Genelde daha hızlı operasyon için herhangi bir çarpışma olasılığını değiştirmek istemezsiniz . Aslında, kasıtlı olarak yavaş çalışmayı sağlamak, çarpışmaları bulmayı daha da zorlaştırmasa bile, kendi başına bazı güvenlik avantajlarına sahiptir.

İkincisinin bir örneği için: bir karma hesaplamak 50 ms sürüyorsa, normal bir kullanıcının girişinde önemli bir etkisi olmaz (yani, çoğu kullanıcı giriş yaptığında 50 ms'lik bir fark görmez). Aynı zamanda, bir saldırgan sözlük saldırısı yapmak istiyorsa, saniyede sadece 20 hash üretebilmek ciddi bir handikaptır. Başka bir deyişle, bir tür nedenden ötürü, güvenli bir karma için daha yavaştır.


3
Şifreleme karma işlevleri alanında, iki önemli alt grup vardır: hızlı olanlar (ileti kimlik doğrulaması, imza ve benzeri için kullanılır) ve yavaş olanlar - anahtar türetme ve parola karma için kullanılır. Bunları karıştırmayın, her ikisi için de uygulamalar var.
Paŭlo Ebermann

Aslında, çarpışmaları en üst düzeye çıkarmak için tasarlanmış karma işlevler de vardır : Soundex bir örnektir. Açıkçası, bu onu çok berbat bir güvenli hash fonksiyonu haline getiriyor.
Jörg W Mittag

@ JörgWMittag: Güvenli bir karma olarak sadece boktan değil, aynı zamanda bir karma tablosu ile kullanım için de oldukça zayıf olurdu. Daha sonra, kesinlikle biraz hash benzeri olsa da, Soundex'e bir hash fonksiyonu çağırmaktan çekinmeyin, çünkü amacı ve kullanımı normal hash fonksiyonlarından çok farklıdır.
Jerry Coffin

@JerryCoffin: Sanırım tanıma bağlı. Örneğin, İngilizce Wikipedia sayfası, bir karma işlevinin, daha büyük (potansiyel olarak sonsuz) bir dizi rasgele değer kümesini, daha küçük, sonlu bir (tipik olarak skaler) değerler kümesiyle eşleyen herhangi bir algoritma veya alt program olduğunu söylüyor. Oysa Alman Wikipedia sayfası "hashing" (Almanca: "zerhacken") ayrılmaz bir parçadır, yani çarpışmadan kaçınma ve eşlenen değerlerin dağılımının kilit önem taşıdığını söyler. Soundex ilk tanımı çok yerine getirir ancak ikincisini değil.
Jörg W Mittag

3

Bu http://www.codinghorror.com/blog/2012/04/speed-hashing.html her şeyi açıklayabildiğimden çok daha iyi açıklayacaktır. Makalede, sorunuzu doğrudan ele alan en önemli iki başlık aşağıda belirtilmiştir:

  • Güvenli karmalar kurcalamaya dayanıklı olacak şekilde tasarlanmıştır
    • giriş verilerinde küçük tek bit değişiklikleri ile çıkışını kökten değiştirir
  • Güvenli sağlama işlemleri yavaş olacak şekilde tasarlanmıştır

Sonunda TL; DR bölümü:

Eğer bir kullanıcıysanız:

Tüm şifrelerinizin 12 veya daha fazla karakterden, ideal olarak çok daha fazla olduğundan emin olun. Sadece şifreleri (türü değilse) hatırlamak çok daha kolay değil, aynı zamanda sadece uzunlukları nedeniyle kaba zorlamaya karşı gülünç güvenli olan geçiş ifadeleri benimsemenizi öneririz.

Bir geliştiriciyseniz:

Güvenli olmanız için gereken her şeyi sağlamak için yalnızca bcrypt veya PBKDF2 kullanın. Bu yeni karmalar GPU'lara uygulanması zor olacak şekilde özel olarak tasarlanmıştır. Başka herhangi bir karma kullanmayın. Hemen hemen her diğer popüler karma plan, her yıl için daha hızlı ve daha paralel ve programlanması daha kolay olan emtia GPU'larının dizileri tarafından kaba zorlamaya karşı savunmasızdır.


4
Jeff burada ikinci noktada yanlıştır ... bazı kullanımlar için (paroladan parola sağlama ve paroladan anahtar türetme gibi) yavaş olmak, diğer kullanımlar için (ileti kimlik doğrulaması, imzalar vb.) Hızlı (güvenli) hash fonksiyonları iyidir.
Paŭlo Ebermann

Haklısın Paŭlo. Karma performansı, karma uygulamasına bağlıdır. Ancak, yavaş karmalar hızlı olanlardan daha güvenlidir . Hızlı bir karma kullanmanızın nedeni, performans için güvenlikten ödün vermemenizdir.
Nate

2
@Doğru “Daha güvenli” her zaman belirsizdir, ancak en hayırsever uygulamada bile “yavaş karmalar her zaman hızlı olanlardan daha güvenlidir” kesinlikle yanlıştır. Bir karma hızının alakasız olduğu birçok uygulama vardır.
Gilles 'SO- kötü olmayı bırak'

@Gilles bir örnek verebilir misiniz? Bu aslında benim için kulağa doğru geliyor, ancak daha fazla ayrıntı yardımcı olacaktır.
Nate

2
@Nate Karmaların en belirgin uygulaması, bir veri parçasının bütünlüğünü doğrulamaktır: karmayı güvenli ancak muhtemelen düşük bant genişliğine sahip bir kanal üzerinden iletin, olası büyük yükü güvenli olmayan bir kanal üzerinden iletin, ardından alınan yükün beklenen karması. Hashler ayrıca imzalama yöntemlerinde belirgin bir şekilde anlaşılır (yalnızca bütünlüğü doğrulamakla kalmaz, aynı zamanda size verileri kimin gönderdiğini de gösterir). Şifreleri karıştırmak istisnadır.
Gilles 'SO- kötü olmayı bırak'

2

"Güvenli" bir karma, karma oluşturmak için kullanılan mesaj hakkında önceden bilgi sahibi olmadan formülik, tekrarlanabilir bir şekilde "parodi" yapmanın zor olduğuna inanılan bir karmadır. Bu bilgi genellikle gizli olduğundan, bu nedenle bir karma gereksinimi, bu kimlik doğrulamada kullanılması amaçlanan bir karma işlevinin iyi bir özelliğidir.

Bir mesaj M, bir hash fonksiyon hash () ve hash (M) tarafından L bit uzunluğunda üretilen bir hash değeri H verildiğinde, aşağıdakilerin hiçbiri, O (2 L ) süresi:

  • Hash () ve H verildiğinde M üretir. (Preimage direnci)
  • Hash () ve M verildiğinde , hash (M 2 ) == H. (zayıf çarpışma direnci) olacak şekilde farklı bir M 2 üretin.
  • Verilen hash (), hash (M 1 ) == hash (M 2 ) olacak şekilde herhangi bir M 1 ve M 2 üretin . (güçlü çarpışma direnci)

Ayrıca, "güvenli" bir karma 2 L karma uzunluğuna sahip olmalıdırbilgisayarın belirli bir donanımı gerçekleştirmesi için uygun bir adım değildir. 32 bit tam sayı karmasının yalnızca 2,1 milyar değeri olabilir; bir ön saldırı (belirli bir hash H üreten bir mesaj bulmak) biraz zaman alacak olsa da, özellikle kod kırma ile görevlendirilmiş devlet kurumlarının elinde olmak üzere birçok bilgisayar için bu mümkün değildir. Buna ek olarak, rastgele mesajlar oluşturan ve saklayan bir algoritma, olasılıklara göre, sadece 77.000 mesajı denedikten sonra her yeni mesajla yinelenen bir karma bulmada% 50 çekim yapar ve sadece 110.000 sonra tekrar. 64 bitlik karmalar bile yalnızca yaklaşık 5 milyar değer denedikten sonra çarpışma şansı hala% 50'dir. Doğum günü saldırısının küçük karmalara gücü budur. Aksine,ondalık sayı (1.5 * 10 34 ).

Kriptografik karmalara gösterilen çoğu saldırı, çarpışma saldırılarıdır ve 2 L' den daha kısa sürede çarpışan mesajlar üretme yeteneğini göstermiştir (çoğu hala üstel süredir, ancak üssü yarıya indirmek karmaşıklıktaki önemli bir azalmadır. 256-bit karmayı 128-bit kadar kolay, 128-bit kadar kolay bir 64-bit kadar kolay çözmek).

Küçük karma boyutuna ek olarak, hash açıkça güvensiz hale getirebilecek diğer faktörler şunlardır:

Düşük iş - bir karma veya başka "sağlama toplamı" tipi kullanım için tasarlanmış bir karma genellikle hesaplama açısından ucuz olacak şekilde tasarlanmıştır. Bu kaba kuvvet saldırısını çok daha kolay hale getirir.

"Yapışkan Durum" - Karma işlevi, belirli bir ek bayt girdisi verildiğinde şimdiye kadar tüm girişlerin mevcut karma değerinin değişmediği giriş örüntülerine eğilimlidir. "Yapışkan duruma" sahip olmak, çarpışmaları bulmayı kolaylaştırır, çünkü "yapışkan durum" karması üreten bir mesaj belirlediğinizde, karmayı "yapışkan durumunda tutan giriş baytları ekleyerek aynı karmaya sahip diğer mesajlar oluşturmak önemsizdir. ".

Difüzyon - Mesajın her girdi baytı, karma değerinin baytları arasında eşit derecede karmaşık bir şekilde dağıtılmalıdır. Belirli karma işlevleri, karma içindeki belirli bitlerde öngörülebilir değişiklikler yaratır. Bu yine çarpışma yaratmayı önemsiz kılar; Karma üreten bir ileti verildiğinde, iletiye yalnızca öngörülebilir şekilde değişen bitleri etkileyen yeni değerler ekleyerek çarpışmalar kolayca oluşturulabilir.


0

Eldeki görev için doğru algoritmayı kullanın.

CRC'ler hata algılama / düzeltme için kullanılır.

SHA2 gibi kriptografik mesaj özetleri, kriptografik yapılar (dijital imzalar, MAC'ler, anahtar türetme / şifre sağlama işlevleri) ve güvenlik protokolleri için bir yapı taşı olarak kullanılır.

Karma tablolarda / sözlüklerde / haritalarda SipHash kullanın .

Ne diyoruz güvensiz karma algoritmalar karma tablolarda kullanılmamalıdır aşağıdaki CVE girdileri tarafından kanıtlanmış olarak,: CVE-2011-, CVE-2003-0364, CVE-2011-4461, CVE-2011-4838, CVE-2011-4885 4462, CVE-2011-4815, CVE-2012-0840, CVE-2012-5371 , CVE-2012-5374, CVE-2012-5375

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.