CRC ne zaman kullanmak için MD5 / SHA1'den daha uygundur?


130

Hata tespiti için CRC'yi MD5 veya SHA1 gibi daha modern hashing işlevlerine karşı kullanmak ne zaman uygundur? Birincisinin gömülü donanım üzerinde uygulanması daha mı kolay?

Yanıtlar:


114

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.


1
@gili: Sonuçta tek bir dword elde etmek için her zaman sadece dwords'ü x veya birlikte kullanabilirsiniz.
Blindy

2
@Dustin: Cevabınızda tamamen haklısınız, ancak "CRC sayısal olarak çok daha verimli" ifadesini "CRC hesaplama açısından çok daha kolay" olarak değiştirmeyi düşünün. MD5 / SHA-1 algoritmaları karmaşıktır, ancak gerçekten 'verimsiz' IMO değildir.
Coxy

1
@coxymla haklısınız, kullanmam gereken kelime "karmaşık", "verimsiz" değil. Teşekkürler!
tanımlar

27
Herhangi bir uzun hash'i 32 bite düşürmek için, sadece ilk 32 biti alın.
orip

1
Hedefiniz güvenlik ise, asla kullanmamalısınız MD5, SHA-1ayrıca kaçınılmalıdır, bazı varyantları SHA-2önerilir.
Peter

33

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 .



3
Cevap hala doğru olsa da, MD5 ve SHA1 günümüzde aynı güvenlik seviyesinde. Başka bir deyişle, yalnızca kasıtsız hataları tespit etmek için iyidir.
Piskvor

21

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.


Bağlantı koptu. Belki açıklamayı kendiniz yazabilirsiniz? Değilse cevap işe yaramaz.
2014

Tamam, cevabıma sonucu ekleyeceğim.
Andre Luus

Garip, kriter göre burada , CRC aslında hız ve çarpışmaların sayısı açısından oldukça iyi yapar.
ostrokach

Gerçekten çok ilginç. Bağlandığım çalışmaya tekrar bakmak zorunda kaldım, ancak tahmin etmem gerekirse bunun nedeni farklı test uygulamaları olabilir. Bir karar vermem gerekseydi, araştırmanın tavsiyesini alırdım, bilimsel olarak daha sağlam görünüyor.
Andre Luus

Milyonlarca URL'yi karma deneyimime göre, CRC64 8 kez çarpıştı ve MD5 5 çarpıştı. Açıkçası MD5 daha iyiydi, ancak CRC64 harika ve çok daha hızlı ve daha basit bir karmadır.
J. Dimeo

18

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:

  • Kullanım "crc32b" İhtiyacınız http://en.wikipedia.org/wiki/Cyclic_redundancy_check ve Güvenlik konusunda umurumda değil.
  • 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:

    1. güvenliği önemsediğinizde bazı güvenlik sorunları
    2. daha uzun karma dizesi ve ihtiyacınız olan tek şey CRC olduğunda "crc32b" den daha yavaştır

bitleri kastediyorsun, karakter değil
esskar

Pek sayılmaz. echo hash ('crc32', 'Hızlı kahverengi tilki tembel köpeğin üzerinden atladı.'); "413a86af" yankıları, 8 karakter uzunluğundaki dizge nedir. Btw, HEX formatında saklanan 32bit sayıdır. Örneğin, "sha256", 64 karakter uzunluğunda dize veren, yine HEX olarak saklanan 256 bitlik karma değerine sahiptir.
Martin

45
Bu sonuçlar çok aldatıcıdır. Bu karma algoritmalar büyük bir veri kümesine uygulandığında ( yerine Savaş ve Barış"The quick brown fox jumped over the lazy dog." ), CRC'nin MD5'ten ne kadar hızlı olduğunu görürsünüz.
ubiquibacon

1
MD5 / Sha1'in doğru çözüm olduğu bir ara durum (kitaplıklarda yinelenen kontrol) vardır: yok olma ihtimali düşük olan hash çarpışmasını dikkatlice işleyen bir düşmanın olduğu durumu ele almaları gerekmez, ancak kazara çarpışmaları halletmeleri gerekir. Yani: Bit hatalarını ve bozulmayı algılama: CRC32 Kitaplıklardaki çarpışmaları algılama: MD5 / SHA1 Karşıt uygulamalar: Sha256 ve üstü. Elbette, milyarlarca giriş içeren bir kütüphaneniz varsa, muhtemelen karma bitlerinizi de artırmanız gerekecektir.
Dewi Morgan

PHP? bir ARM platformunda, gömülü kod, 16MHz 46 baytlık bir CRC32, belki 12 mikrosaniye. Donanım desteği var. Donanım destekli AES bile birkaç yüz kat daha yavaş olacaktır. Yardımsız arama tablosu CRC hala yaklaşık 50 mikrosaniye içinde gelmelidir.
ilgitano


9

Her şey gereksinimlerinize ve beklentilerinize bağlıdır.

Bu karma işlev algoritmaları arasındaki hızlı kısa farklar şunlardır :

CRC (CRC-8/16/32/64)

  • olduğu olmayan bir şifreleme müzakere algoritması (bu döngüsel artıklık kontroller göre lineer bir fonksiyonunu kullanarak var)
  • 9, 17, 33 veya 65 bit üretebilir
  • kriptografik garanti vermediği için kriptografik amaçlarla kullanılması amaçlanmamıştır,
  • dijital imzalarda kullanım için uygun değil, çünkü kolayca geri döndürülebilir 2006 ,
  • şifreleme amacıyla kullanılmamalıdır,
  • farklı dizeler çarpışmayı oluşturabilir,
  • 1961'de icat edildi ve Ethernet ve diğer birçok standartta kullanıldı,

MD5

  • kriptografik bir hash algoritmasıdır,
  • 128 bitlik (16 bayt) bir karma değer üretme (32 basamaklı onaltılık sayılar)
  • bu bir kriptografik karmadır, ancak güvenlik konusunda endişeleriniz varsa kullanımdan kaldırılmış kabul edilir,
  • aynı MD5 hash değerine sahip bilinen dizeler var
  • şifreleme amacıyla kullanılabilir,

SHA-1

  • 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,

  • sha1 çarpışmasına bir örnek bulundu

  • 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.

Verim

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:


8

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.


6

CRC32 daha hızlıdır ve karma yalnızca 32 bit uzunluğundadır.

Hızlı ve hafif bir sağlama toplamı istediğinizde kullanın. CRC, ethernet'te kullanılır.

Daha fazla güvenilirliğe ihtiyacınız varsa, modern bir hashing işlevi kullanmanız tercih edilir.


5

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.


1
Uygun bir polinom kullanıyorsanız, CRC tüm yanlışlıkla veri değişikliklerini yakalayacaktır. Tam olarak doğru birden çok bit değiştirilirse 1/2 ^ 32 değişiklikleri kaçırılır.
Gerhard

Ve uygun bir polinom ile belirli ortak sınıfların tüm hatalarını da yakalayacaktır, örneğin patlama hataları.
erikkallen

Sorunun gömülü sistemlerle ilgili olması dışında cevabınıza katılıyorum. Kriptografik bir algoritmanın performansı, daha küçük gömülü sistemlerde sorunlu olabilir.
Craig McQueen

Buna kesinlikle katılmıyorum. CRC hata polinomları, 1,2,3,5'i kanıtlanabilir şekilde algılayabilecekleri ve bazı durumlarda 11 bit gibi bir şeye kadar hataları patlatabilecekleri şekilde dikkatlice seçilir. Kriptografik bir karma tamamen istatistikseldir, bu nedenle büyük özet değerleri kullanmanız gerekir. 8-32 bit, kriptografik bir hash özeti için gerçekçi değildir ve cpu programları ve geçitlerinde anlamsız bir şekilde pahalıdır. Gömülü sistemler üzerinde çalışıyorsanız kesinlikle alınacak bir cevap değil. Bir CRC'yi KULLANMAMANIN tek zamanı, akıllı bir düşman senaryosuyla uğraşmak zorunda olmanızdır.
ilgitano

5

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.


Bu yaklaşımla ilgili bir sorun, içinde kodlanmış bir CRC32 içeren bir dosya üzerinde çalıştırıldığında, ortaya çıkan CRC dosyadaki verilerden bağımsız olabilir (çünkü veri değişirse, CRC32, farkı iptal etmek için değiştirilecektir. ). CRC32'yi hesaplamadan önce verileri basit bir şekilde birleştirmek bu sorunu önleyecektir.
supercat

1
@supercat - Bunun aslında bir sorun olduğuna gerçekten inanmıyorum. Bir dosya, dosyanın geri kalanının crc32'si olan bir crc32 üstbilgisini içeriyorsa, dosya güncellendiğinde crc32 başlığındaki her bitin farklı olma şansı yaklaşık olarak% 50 olacaktır. Başlıktaki değişiklikler oldukça rastgele bir dağılım izlemelidir. Bunun CRC32'nin (başlık + veri) her zaman aynı olmasına veya herhangi bir şekilde dosyanın veri kısmına bağlı olmamasına neden olacağını göremiyorum.
teratorn

@teratorn: Sonunda bir CRC32'ye sahip olan ve belirli bir çekirdek sabiti kullanılarak hesaplanan tüm dosyanın CRC32'si her zaman başka bir sabit değer olacak şekilde hesaplanan bir dizi dosya gördüm. Bu, ikili kod görüntüleri gibi şeylerde oldukça yaygındır. Acme 1000 DVD oynatıcı, bellenim yükseltmeleri için sabit boyutlu kod görüntüleri kullanırsa ve her kod görüntüsünün belirli bir CRC32'ye sahip olmasını beklerse, çeşitli dosyaların CRC32'lerini hesaplayan bir rutin, Acme 1000 için farklı kod görüntülerini ayırt edemeyecektir.
supercat

Bu durumda CRC'nin amacı, dosyaların farklı olduğunu hızlı bir şekilde tespit etmektir. CRC aynı şekilde geri gelirse, şimdi pahalı bir ikili karşılaştırma yapmanız gerekir, böylece gömülü bir CRC algoritmayı bozmaz. CRC'nin ilk geçişi bunların aynı OLABİLECEĞİNİ söylediği, ancak bunların birçoğu olma ihtimalinin düşük olduğunu söylediği ve özel bir polinom kullanarak bundan kaçınabileceğiniz için bazı dosyalar ikili olarak karşılaştırılabilir.
ilgitano

4

CRC32 çok daha hızlıdır ve bazen donanım desteğine sahiptir (yani Nehalem işlemcilerde). Gerçekten, onu kullanacağınız tek zaman, donanımla arayüz oluşturuyorsanız veya performans konusunda gerçekten sıkı iseniz .


4

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.


1

CRC kodu daha basit ve daha hızlıdır.

Neye ihtiyacın var?

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.