O Marcus Adams'ın cevabın bir uzantısıdır rağmen, burada bahsedilen görmedim o bir şey, bir ihtimal varsa belirlemek ve bir kullanıcının kimliğini doğrulamak hem tek bir bilgi parçası kullanarak olmamalıdır ki zamanlama saldırıları , hangi olabilir Bir dizi karşılaştırmasının ne kadar ileri gittiğini tahmin etmek için yanıt sürelerindeki farklılıkları kullanın.
Kullanıcıyı veya kimlik bilgilerini aramak için "anahtar" kullanan bir sistem kullanıyorsanız, bu bilgi parçası, binlerce istek göndererek ve veritabanınızın bulması (veya bulmaması) için geçen süreyi inceleyerek zaman içinde aşamalı olarak tahmin edilebilir. bir kayıt bulun. Bu, özellikle "anahtar" anahtarın tek yönlü karması yerine düz metin olarak saklanıyorsa geçerlidir. Anahtarı kullanıcıya tekrar görüntüleyebilmeniz gerekirse, kullanıcıların anahtarlarını düz metin olarak veya simetrik olarak şifrelenmiş olarak saklamak isteyebilirsiniz.
İkinci bir bilgi parçasına veya "sırrına" sahip olarak, önce bir zamanlama saldırısına karşı savunmasız olabilecek "anahtar" ı kullanarak kullanıcıyı veya kimlik bilgilerini arayabilir, ardından değerini kontrol etmek için zamanlama açısından güvenli bir karşılaştırma işlevi kullanabilirsiniz. sır".
İşte Python'un bu işlevi uygulaması:
https://github.com/python/cpython/blob/cd8295ff758891f21084a6a5ad3403d35dda38f7/Modules/_operator.c#L727
Ve hmac
kitaplıkta (ve muhtemelen diğerlerinde) açığa çıkar :
https://docs.python.org/3/library/hmac.html#hmac.compare_digest
Burada dikkat edilmesi gereken bir nokta, bu tür bir saldırının aramadan önce karma hale getirilmiş veya şifrelenmiş değerler üzerinde çalışacağını düşünmediğimdir, çünkü karşılaştırılan değerler, giriş dizesindeki bir karakter her değiştiğinde rastgele değişir. Bunun iyi bir açıklamasını burada buldum .
API anahtarlarını depolamak için çözümler şu şekilde olacaktır:
- Ayrı bir anahtar ve sır kullanın, kayda bakmak için anahtarı kullanın ve sırrı kontrol etmek için zamanlama açısından güvenli bir karşılaştırma kullanın. Bu, kullanıcıya anahtarı ve sırrı bir kullanıcıya tekrar göstermenizi sağlar.
- Ayrı bir anahtar ve sır kullanın, sır üzerinde simetrik, belirleyici şifreleme kullanın ve şifrelenmiş sırlar arasında normal bir karşılaştırma yapın. Bu, kullanıcıya anahtarı ve sırrı tekrar göstermenize olanak tanır ve sizi zamanlama açısından güvenli bir karşılaştırma yapma zorunluluğundan kurtarabilir.
- Ayrı bir anahtar ve sır kullanın, sırrı görüntüleyin, karma oluşturun ve saklayın, ardından karma sırrın normal bir karşılaştırmasını yapın. Bu, iki yönlü şifreleme kullanma zorunluluğunu ortadan kaldırır ve sistem tehlikeye girerse sırrınızı güvende tutma avantajına sahiptir. Sırrı kullanıcıya tekrar gösterememenin dezavantajı var.
- Tek bir anahtar kullanın , kullanıcıya bir kez gösterin, hashing uygulayın, ardından karma veya şifreli anahtar için normal bir arama yapın. Bu tek bir anahtar kullanır, ancak kullanıcıya tekrar gösterilemez. Sistem tehlikeye atılırsa anahtarları güvende tutma avantajına sahiptir.
- Tek bir anahtar kullanın , kullanıcıya bir kez gösterin, şifreleyin ve şifrelenmiş sırrı normal bir şekilde arayın. Kullanıcıya tekrar gösterilebilir, ancak sistemin güvenliği aşılırsa anahtarların savunmasız kalması pahasına.
Bunlardan 3'ün en iyi güvenlik ve rahatlık dengesi olduğunu düşünüyorum. Anahtarlar verilirken bunun birçok web sitesinde uygulandığını gördüm.
Ayrıca, gerçek güvenlik uzmanlarını bu yanıtı eleştirmeye davet ediyorum. Bunu başka bir tartışma noktası olarak ortaya çıkarmak istedim.