Yanıtlar:
CRC, örneğin ağ paraziti, hat gürültüsü, bozulma vb. Gibi verilerde meydana gelebilecek rastgele hataları tespit etmek için iyi çalışır.
CRC, sayısal olarak MD5 veya SHA1'den çok daha az karmaşıktır. MD5 gibi bir hash işlevi kullanmak, muhtemelen rasgele hata tespiti için gereğinden fazla olur. Bununla birlikte, herhangi bir tür güvenlik kontrolü için CRC kullanmak, MD5 gibi daha karmaşık bir hashing işlevinden çok daha az güvenli olacaktır.
Ve evet, CRC'nin gömülü donanıma uygulanması çok daha kolaydır, bunun için IC üzerinde farklı paketlenmiş çözümler bile alabilirsiniz.
MD5
, SHA-1
ayrıca kaçınılmalıdır, bazı varyantları SHA-2
önerilir.
CRC, verilerdeki kasıtsız değişikliklere karşı tasarlanmıştır. Yani, kasıtsız hataları tespit etmek için iyidir, ancak bir verinin kötü niyetle işlenmediğinden emin olmanın bir yolu olarak faydasız olacaktır.
Ayrıca bakınız bu .
CRC karmalarının karma tablolar için ne kadar uygunsuz olduğunu gösteren bir çalışma buldum . Aynı zamanda algoritmanın gerçek özelliklerini de açıklar. Çalışma ayrıca diğer karma algoritmaların değerlendirilmesini de içerir ve saklanması gereken iyi bir referanstır.
Karmalar için CRC ile ilgili sonuç:
CRC32 hiçbir zaman karma tablo kullanımı için tasarlanmamıştır. Bu amaçla kullanmak için gerçekten iyi bir neden yok ve bunu yapmaktan kaçınmanızı tavsiye ederim. CRC32'yi kullanmaya karar verirseniz, anahtar sekizlilerinin beslendiği uçtan itibaren karma bitleri kullanmanız kritik önem taşır. Bu, belirli CRC32 uygulamasına bağlıdır. CRC32'yi bir "kara kutu" hash işlevi olarak görmeyin ve genel amaçlı bir karma olarak kullanmayın. Her bir uygulamayı uygunluk açısından test ettiğinizden emin olun.
GÜNCELLEME
Görünüşe göre site kapalı. İnternet arşivi bir kopyası vardır gerçi.
Bu PHP kodunun her satırını 1.000.000 döngüsünde çalıştırdım. Sonuçlar yorumlarda (#).
hash('crc32', 'The quick brown fox jumped over the lazy dog.');# 750ms 8 chars
hash('crc32b','The quick brown fox jumped over the lazy dog.');# 700ms 8 chars
hash('md5', 'The quick brown fox jumped over the lazy dog.');# 770ms 32 chars
hash('sha1', 'The quick brown fox jumped over the lazy dog.');# 880ms 40 chars
hash('sha256','The quick brown fox jumped over the lazy dog.');# 1490ms 64 chars
hash('sha384','The quick brown fox jumped over the lazy dog.');# 1830ms 96 chars
hash('sha512','The quick brown fox jumped over the lazy dog.');# 1870ms 128 chars
Benim sonucum:
Ek güvenlik katmanına ihtiyacınız olduğunda "sha256" (veya daha yüksek) kullanın.
"Md5" veya "sha1" kullanmayın çünkü şunlara sahiptir:
"The quick brown fox jumped over the lazy dog."
), CRC'nin MD5'ten ne kadar hızlı olduğunu görürsünüz.
Uygulama, hız ve güvenilirlikle ilgili CRC bilgileri için CRC hata algılama algoritmaları için ağrısız bir kılavuza bakın . CRC'lerle ilgili her şeye sahiptir.
Birisi verilerinizi kötü niyetle değiştirmeye çalışmadığı ve CRC değişikliğini gizlemediği sürece yeterlidir. "İyi" (standart) bir polinom kullanın.
Her şey gereksinimlerinize ve beklentilerinize bağlıdır.
Bu karma işlev algoritmaları arasındaki hızlı kısa farklar şunlardır :
kriptografik bir hash algoritmasıdır,
Mesaj özeti olarak bilinen 160 bitlik (20 bayt) bir karma değer üretir
kriptografik bir karmadır ve 2005'ten beri artık güvenli sayılmamaktadır,
şifreleme amacıyla kullanılabilir,
ilk olarak 1993'te (SHA-0 olarak), ardından 1995'te SHA-1 olarak yayınlandı,
seriler: SHA-0, SHA-1, SHA-2, SHA-3,
Özetle, SHA-1'i kullanmak artık iyi finanse edilen rakiplere karşı güvenli kabul edilmiyor, çünkü 2005'te kriptanalistler SHA-1'e yönelik saldırılar buldular, bu da devam eden kullanım için yeterince güvenli olmayabileceğini gösteriyor . Federal kurumlar çarpışma direnci gerektiren uygulamalar için SHA1-1 kullanmayı bırakınız ve 2010'dan sonra SHA-2 kullanması gerektiğini ABD NIST tavsiye NIST .
Bu nedenle, bir dosyanın bütünlüğünü (bozulmaya karşı) kontrol etmek için basit ve hızlı bir çözüm arıyorsanız veya performans açısından bazı basit önbelleğe alma amaçları için, kullanmayı düşünebileceğiniz hashing için CRC-32'yi düşünebilirsiniz. MD5, ancak herhangi bir çarpışma olasılığını önlemek için profesyonel uygulama geliştiriyorsanız (güvenli ve tutarlı olmalıdır) - SHA-2 ve üstünü (SHA-3 gibi) kullanın.
PHP'de bazı basit kıyaslama testleri:
# Testing static text.
$ time php -r 'for ($i=0;$i<1000000;$i++) crc32("foo");'
real 0m0.845s
user 0m0.830s
sys 0m0.008s
$ time php -r 'for ($i=0;$i<1000000;$i++) md5("foo");'
real 0m1.103s
user 0m1.089s
sys 0m0.009s
$ time php -r 'for ($i=0;$i<1000000;$i++) sha1("foo");'
real 0m1.132s
user 0m1.116s
sys 0m0.010s
# Testing random number.
$ time php -r 'for ($i=0;$i<1000000;$i++) crc32(rand(0,$i));'
real 0m1.754s
user 0m1.735s
sys 0m0.012s\
$ time php -r 'for ($i=0;$i<1000000;$i++) md5(rand(0,$i));'
real 0m2.065s
user 0m2.042s
sys 0m0.015s
$ time php -r 'for ($i=0;$i<1000000;$i++) sha1(rand(0,$i));'
real 0m2.050s
user 0m2.021s
sys 0m0.015s
İlişkili:
Korumaya çalıştığın şeyi söylemiyorsun.
Bir CRC, kötü amaçlı sistem değişikliğini önlemenin aksine, gömülü sistemlerde kazara veri bozulmasına karşı bir kontrol olarak sıklıkla kullanılır. Bir CRC'nin yararlı olabileceği yerlere örnekler, aygıt yazılımı bozulmasına karşı koruma sağlamak için sistem başlatma sırasında bir EPROM görüntüsünü doğrulamaktır. Sistem önyükleyici, uygulama kodu için CRC'yi hesaplayacak ve kodun çalışmasına izin vermeden önce saklanan değerle karşılaştıracaktır. Bu, yanlışlıkla program bozulması veya başarısız bir indirme olasılığına karşı koruma sağlar.
Bir CRC, FLASH veya EEPROM'da depolanan konfigürasyon verilerini korumak için benzer şekilde kullanılabilir. CRC yanlışsa, veriler geçersiz olarak işaretlenebilir ve varsayılan veya yedek veri kümesi kullanılabilir. CRC, cihaz arızası nedeniyle veya kullanıcının konfigürasyon veri deposunun güncellenmesi sırasında gücü kesmesi nedeniyle geçersiz olabilir.
Bir hash'in, birden çok bit hatası olan bir CRC'ye göre bozulmayı tespit etme olasılığının daha yüksek olduğu yönünde yorumlar yapılmıştır. Bu doğrudur ve 16 veya 32 bitlik bir CRC kullanıp kullanmama kararı, kullanılan bozuk bir veri bloğunun güvenlik sonuçlarına ve 2'de 1 veya 2 ^ 32 olasılığını gerekçelendirip doğrulayamayacağınıza bağlı olacaktır. veri bloğu yanlış olarak geçerli ilan edildi.
Birçok cihazda standart algoritmalar için yerleşik bir CRC üreteci bulunur. Texas'tan MSP430F5X serisi, CRC-CCITT Standardının bir donanım uygulamasına sahiptir.
CRC'yi yalnızca hesaplama kaynakları çok sıkıysa (yani, bazı gömülü ortamlar) veya birçok çıktı değerini saklamanız / taşımanız gerekiyorsa ve alan / bant genişliği sıkı olduğunda kullanın (CRC'ler genellikle 32 bit ve MD5 çıktısının 128 bit olduğu durumlarda, SHA1 160 bit ve 512 bit'e kadar diğer SHA değişkenleri).
CRC'yi "sahteciliği" yapmak çok kolay olduğundan güvenlik kontrolleri için asla CRC kullanmayın.
Yanlışlıkla hata tespiti için bile (kötü niyetli değişiklik tespiti yerine) karmalar basit bir CRC'den daha iyidir. Kısmen, bir CRC'nin hesaplanmasının basit yolu nedeniyle (ve kısmen, CRC değerlerinin genel hash çıktılarından daha kısa olması ve dolayısıyla çok daha küçük bir olası değer aralığına sahip olması nedeniyle), iki veya daha fazla hatanın olduğu bir durumda çok daha olasıdır. , bir hata diğerini maskeleyecektir, böylece iki hataya rağmen aynı CRC'ye sahip olursunuz.
Kısacası: düzgün bir karma algoritma kullanmamanız için bir nedeniniz yoksa , basit CRC'lerden kaçının.
Son zamanlarda akıllıca bir CRC kullanımıyla karşılaştım. Yazarı jdupe dosya çoğaltma tanımlama ve kaldırma aracı (popüler exif aracı jhead aynı yazar) dosyalar arasında ilk geçişi esnasında kullanır. Aynı görünen dosyaları işaretlemek için her dosyanın ilk 32K'sinde bir CRC hesaplanır, ayrıca dosyalar aynı boyutta olmalıdır. Bu dosyalar, tam bir ikili dosya karşılaştırması yapılacak dosyalar listesine eklenir. Büyük medya dosyalarını kontrol etmeyi hızlandırır.
Temel bilgilerle başlayalım.
Kriptografide, bir karma algoritma, bir özet işlemi aracılığıyla birçok biti daha az bite dönüştürür. Mesajların ve dosyaların bütünlüğünü onaylamak için karmalar kullanılır.
Tüm karma algoritmalar çarpışmalar oluşturur. Bir çarpışma, birkaç çok bitli kombinasyonun aynı daha az bit çıktısını oluşturmasıdır. Bir karma algoritmanın kriptografik gücü, bir bireyin belirli bir girdi için çıktının ne olacağını belirleyememesiyle tanımlanır çünkü eğer yapabilirlerse, meşru bir dosyayla eşleşen bir karma ile bir dosya oluşturabilir ve varsayılan bütünlüğü tehlikeye atabilirler. sistemin. CRC32 ve MD5 arasındaki fark, MD5'in tahmin edilmesi daha zor olan daha büyük bir karma oluşturmasıdır.
Mesaj bütünlüğünü uygulamak istediğinizde - yani mesaj aktarılırken değiştirilmemiştir - çarpışmaları tahmin edememe önemli bir özelliktir. Bir 32-bit hash tanımlayabilir 4 milyar farklı mesajlar 4 milyar farklı benzersiz karmalar kullanarak veya dosyaları. 4 milyar ve 1 dosyanız varsa, 1 çarpışmanız garantilidir. 1 TB Bitspace, Milyarlarca Çarpışma olasılığına sahiptir. Saldırgan isem ve bu 32 bitlik karmanın ne olacağını tahmin edebilirsem, hedef dosyayla çarpışan virüslü bir dosya oluşturabilirim; aynı hash'e sahip.
Ek olarak, 10 mbps iletim yapıyorsam, bir paketin crc32'yi atlamak ve hedefe doğru devam etmek ve yürütmek için bozulma olasılığı çok düşüktür. Diyelim ki 10 mbps'de saniyede 10 hata alıyorum . Bunu 1 gbps'ye çıkarırsam, şimdi saniyede 1.000 hata alıyorum . Saniyede 1 exabit'e çıkarsam, saniyede 1.000.000.000 hata oranına sahip olurum . 1 \ 1,000,000 çarpışma oranımız olduğunu varsayalımiletim hataları, Anlam 1 milyon iletim hatası, bozuk verilerin tespit edilmeden geçmesine neden olur. 10mbps'de her 100.000 saniyede bir veya günde yaklaşık bir kez gönderilen hata verilerini alıyorum. 1 gbps'de her 5 dakikada bir olur. Saniyede 1 exabit hızında, saniyede birkaç kez konuşuyoruz.
Wireshark'ı açarsanız, tipik Ethernet başlığınızın bir CRC32'ye sahip olduğunu, IP başlığınızın bir CRC32'ye sahip olduğunu ve TCP Başlığınızın bir CRC32'ye sahip olduğunu görürsünüz ve bu, daha yüksek katman protokollerinin yapabileceklerine ek olarak; Örneğin IPSEC, yukarıdakilere ek olarak bütünlük denetimi için MD5 veya SHA kullanabilir. Tipik ağ iletişimlerinde birkaç hata kontrolü katmanı vardır ve 10 mbps'nin altındaki hızlarda HALA ara sıra saçma.
Döngüsel Artıklık Denetimi'nin (CRC) birkaç yaygın sürümü vardır ve birkaç yaygın değildir, ancak genellikle yalnızca bir mesajın veya dosyanın aktarım sırasında hasar gördüğünü (birden çok bitin çevrilmesi) söylemek için tasarlanmıştır. CRC32 kendi başına, çarpışma oranı nedeniyle büyük, skaler kurumsal ortamlarda günümüz standartlarına göre çok iyi bir hata kontrol protokolü değildir; Ortalama bir sabit sürücüde 100 binin üzerinde dosya bulunabilir ve bir şirketteki dosya paylaşımları on milyonlarca dosyaya sahip olabilir. Karma alanın dosya sayısına oranı çok düşük. CRC32'nin uygulanması hesaplama açısından ucuzken MD5 değildir.
MD5, kötü amaçlı bir dosyanın zararsız görünmesi için çarpışmaların kasıtlı olarak kullanılmasını durdurmak üzere tasarlanmıştır. Güvensiz olarak kabul edilir çünkü hashspace, bazı saldırıların gerçekleşmesini sağlamak için yeterince haritalandırılmıştır ve bazı çarpışmalar öngörülebilirdir. SHA1 ve SHA2 bloktaki yeni çocuklar.
Dosya doğrulaması için, Md5 birçok satıcı tarafından kullanılmaya başlandı, çünkü onunla hızlı bir şekilde multigabayt dosyaları veya çok satırlı dosyaları yapabilirsiniz ve bunu genel işletim sisteminin CRC32 kullanımı ve desteğinin üzerine yığabilirsiniz. Önümüzdeki on yıl içinde dosya sistemleri hata denetimi için MD5 kullanmaya başlarsa şaşırmayın.