Bu gerçekten pratik bir soru değil, daha çok bir merak meselesi. Bir CS profesörünün md5ing şifrelerinden SHA1'e değil, anahtar olarak kendisini kullanarak şifreyi AES'e yükseltmesini önerdiğini duydum. Bunun gerçekten az ya da çok güvenli olup olmadığı hakkında bir bilgisi var mı?
Konuyla ilgili bazı düşünceler:
Yanıtlarda bazı ortak noktalar ve karşı noktalar:
AES şifrelemesi, çarpışmaya karşı dayanıklı olacak şekilde tasarlanmamıştır ve bu nedenle aynı karma dizgi uzunluğu için muhtemelen daha fazla çarpışma olacaktır.
Daha uzun bir tuz kullanıyorsak, şifrelenmiş parola bir SHA1 karma değerinden daha uzun olacaktır. Bu, çarpışmaları karşılaştırılabilir bir düzeye indirmek için yeterli olabilir - ya da olmayabilir.
AES şifrelemesi, 16 bayt içinde şifrenin ne kadar sürdüğünü gösterir.
AES yöntemine ekleyebiliriz: şifreledikten sonra, makul bir uzunluğa (çarpışmalardan kaçınmak için SHA1'den daha uzun) doğru ya da keseriz.
Kısa cevap: kötü fikir, yapma.
Daha uzun cevap: Alıştırmanın amacı, sunucunun doğrulama verilen bir şifreyi saklamasına izin veren bir şey saklamaktır, ancak yeniden inşa etmek parolaya izin vermez; ikinci özellik istenir, böylece bir saldırgan tarafından sunucu veritabanına gayri meşru bir okuma erişiminin sonuçları sınırlı kalır.
Bu nedenle, belirli bir şifreyi doğrulama değerine dönüştüren tek yönlü deterministik dönüşüm istiyoruz. Dönüşüm şöyle olacaktır:
Bu işlevler çok hızlı olduğundan ve tuzlanmadığından, MD5 veya SHA-1'in tek bir çağrılması her iki hesapta da başarısız olur. Yavaşlık birçok çağrının (binlerce, muhtemelen milyonlarca) iç içe yerleştirilmesiyle yapılabilir ve tuz, bunu yapmanın iyi ve kötü yolları olsa da, "bir yere" enjekte edilebilir. PBKDF2 bunu yapan standart bir dönüşümdür ve bu konuda kötü değildir ( bcrypt biraz tercih edilmelidir ).
Ancak, MD5 ve SHA-1 en az bir şeyi doğru yapar: tek yönlü olmak için tasarlanmış. Bunu yapmak zor; tek yönlü işlevlerin gerçekten var olabileceği teorik olarak kanıtlanmamıştır. Dünyanın dört bir yanındaki kriptograflar şu anda yeni, daha iyi bir tek yönlü karma işlevi tasarlamak için rekabet ile ilgileniyorlar.
Profesörünüzün önerdiği şey, tek yönlülük için tasarlanmış bir işlevi, değil tek yönlülük için tasarlanmış bir işlevle değiştirmektir. Yavaşlık ve tuzlama ile ilgili hiçbir şeyi düzeltmez, ancak MD5 ve SHA-1 ile ilgili tek iyi şeyi kaldırır. Dahası, AES'in ilgili anahtar saldırılarla ilgili nispeten zayıf olduğu bilinmektedir - bu, AES'nin kastedildiği, yani şifreleme için kullanıldığı sürece bir sorun değildir, ancak önemli bir hale gelir. tek yönlü karma işlevi için bir yapı taşına dönüştürüldüğünde sorun. AES tasarımının parçalarını yeniden kullanarak güvenli bir karma işlevi oluşturmak mümkün görünüyor, ancak önemli ölçüde yeniden işleme gerektiriyor (örneğin Whirlpool ve ECHO ).
Bu yüzden ev yapımı AES tabanlı şifre karma şemasını kullanmayın; bu nedenle, "ev yapımı" olan hiçbir şey kullanmayın: bu bir felaket tarifi. Güvenlik test edilemez; güvenli bir algoritma oluşturmanın bilinen tek yolu, yüzlerce eğitimli kriptografın birkaç yıl boyunca ona yakından bakmasını sağlamaktır. Bunu kendiniz yapamazsınız. Yalnız bir kriptograf bile bunu riske atmaz.
Bunun yerine bcrypt kullanın. PBKDF2 de fena değil.
Çoğu web sitesi md5 veya sha1 (doğru?) Kullandı, bu yüzden bir bilgisayar korsanı bunu beklerdi. Böylece AES yöntemini daha güvenli hale getirir.
Çoğu web sitesi MD5 veya SHA1 kullansa bile, AES sadece orada kullanılmadığı için bunu daha güvenli hale getirmez - bu sadece güvenliği tarafından güvenliği artırmak için genellikle etkili bir şekilde katkıda bulunmayan müstehcenlik ; iyi bir algoritma (verilen amaç için iyi test edilmiş) kullanmak ve herkese açık bir şekilde dokümante etmek, iyi olup olmadığından emin olamayacağınız bir algoritma kullanmaktan çok daha güvenli olacaktır ve kullanarak.
Şu anda AES veya böyle bir şifreleme algoritması kullanırken aşağıdaki olası dezavantajları düşünebilirim:
Bu yaklaşımda gördüğüm acil sorunlardan biri AES'in sabit anahtar uzunluğudur. AES-128 kullanıldığında, parola 16 bayt ile sınırlandırılır. Daha uzun parolalar veya uzun parolalar ne olacak?
Herhangi bir şifre uzunluğuna uyum sağlamak için bir karma fonksiyonuna ihtiyacınız olacaktır, bu yüzden başlangıç noktasına geri dönün.
Blok-şifreyi karma-fonksiyona dönüştürmenin iyi çalışılmış ve güvenli * yolları olduğunu, Davies-Meyer, Matyas-Meyer-Oseas veya Miyaguchi-Preneel gibi PGV modları olduğunu unutmayın.
(*) Uygun bir "güvenli" tanımı için.
Ancak şunu düşünün:
Sitenize giriyorum ve sisteminiz için yapılandırılmış AES anahtarları olduğunu fark etmek için yeterli erişim elde ediyorum, sadece "şifreli" görünen şey sizin şifrelerinizdir ... ne yapacağımı tahmin edin.
Onları karma tutar, tüm şifre veritabanınızı kolayca kazıma için çok daha az yer bırakır.
Bunun üzerine, bir site sahibi olarak, kullanıcı şifreleri ilk etapta şifresini çözmek istemiyorum, aksi takdirde "şifreleri kurtarma" seçeneği, daha yüksek up'ların isteyebileceği olası bir özellik haline gelir ve teknik olarak, altta yatan sistem bir karma sistemi yerine bir şifreleme sistemi kullanılarak inşa edildiğinden (kötü bir neden, ancak yazılım geliştiricileri bu gibi taleplerle ilgilenir).
Temel olarak: Güvenlik söz konusu olduğunda, tuhaf ve kutunun dışında bir şey yapmaya çalışmayın, muhtemelen kendinize büyük bir güvenlik deliği yazacaksınız çünkü bir algoritma üzerinde çalışan bir takım ekibin araştırma miktarını koyamayacaksınız belirli bir amaç için yapmak zorundaydı.
Doğru cevap: Gerçekten hiç önemli değil.
Parolalar söz konusu olduğunda, tek pratik saldırı, doğru olanı kaba kuvvetle bulana kadar bir parola listesi denemektir. Kimse bunu yapmak için SHA1'e veya AES'ye doğrudan saldırmaya çalışmaz. Mevcut araştırma noktasında bile, SHA1'e saldırmak AES'den on bin kat daha kolay olurdu, her ikisi de hala imkansızdır (şifre karmalarını tersine çevirmek için, çarpışmalar burada önemli değildir). Bir araştırmacı diğer algoritmaya saldırmanın başka bir yolunu bulduğunda, olasılıklar gelecek yıl tersine çevrilebilir.
Önemli olan hash'ınızı ne kadar hızlı türettiğiniz/şifrenizi şifrelediğinizdir. Ancak; SHA1 daha hızlıdır ve daha yavaş olmasını istersiniz (kaba kuvvet saldırılarını savuşturmak için), sadece birkaç kez hash yapabilirsiniz.
Bir bilgisayar korsanının “beklediği” konuyla alakalı değildir, “beklenmedik” bir şey yapmak sadece belirsizdir. "Tüm şifre harflerini tersine çeviriyorum, şimdi daha güvenli" demek gibi. Olmayacak. Bilgisayar korsanı parola veritabanınıza erişebiliyorsa, parola karma türetme işlevinize erişimi olmadığından nasıl emin olabilirsiniz?
"Parolayı kendisiyle şifreleme" sırasında bir kusur: Şifreleme metninin uzunluğu saldırgana şifrenin uzunluğu hakkında bir ipucu verebilir. Bu korkunç.
Her durumda, şifreyi, tercihen kullanıcıya özgü bir şeyle tuzlamanız gerekir.
Blok şifrelerden oluşturulan MAC'lar (Mesaj Kimlik Doğrulama Kodları) vardır; en iyi bilinen muhtemelen CBC-MAC . Bir hash-mac ile karşılaştırıldığında sorunları var, özellikle:
Güvenli bir blok şifresi verildiğinde, CBC-MAC sabit uzunluktaki mesajlar için güvenlidir. Ancak, değişken uzunluklu mesajlar için tek başına güvenli değildir. Doğru mesaj etiketi (yani CBC-MAC) çiftlerini (m, t) ve (m ', t') bilen bir saldırgan, CBC-MAC'i de t 'olacak üçüncü bir m' 'mesajı üretebilir.
[...]
Bu sorun, bir mesaj boyutu bloğu (örneğin, Merkle-Damgård güçlendirmesi ile) eklenerek çözülemez ve bu nedenle, değişken uzunluktaki mesajların bütünlüğünü korumak için farklı bir çalışma modu, örneğin CMAC kullanılması önerilir.
Daha kısa cevap: Bir blok şifresinden oluşturulan bir MAC'ın güvenliği, onu nasıl oluşturduğunuza bağlıdır. Saf bir yapı neredeyse kesinlikle önemli kusurlara sahip olacaktır.
Alışılmadık bir algoritma tasarlamış olmanız onu güvenli hale getirmez. "kendi kendine yapılan" algoritmalar tehlikelidir, çünkü kimse bunların şifreleme analizini yapmamıştır.
@Thomas Pornin'in yukarıda yazdığı gibi, AES çarpışmalara dayanıklı olacak şekilde tasarlanmamıştır. Ayrıca, AES nispeten hızlıdır, bu da saldırıları basitleştirir.
SHA1 çarpışmaya dayanıklı olacak şekilde tasarlanmıştır, ancak SHA1 de çok hızlı olacak şekilde tasarlanmıştır, çünkü amacı kısa sürede büyük hacimli veri veya dosyaların karmasını oluşturmaktır. Amacı, karma parolalara yönelik saldırıları önlemektir.
Farklı saldırı türlerine dayanıklı bir parola karması oluşturmak istiyorsanız parola genişletmeyi düşünün. Teknoloji yığınınıza ve mevcut kitaplıklarınıza bağlı olarak bcrypt, scrypt, argon2 düşünün.