Birçok sitenin şifre sıfırlama, abonelikten çıkma istekleri ve diğer benzersiz kimlik biçimleri için GUID'leri kullandığını görüyorum.
Muhtemelen caziptirler çünkü üretilmesi kolay, benzersiz, sıralı olmayan ve rastgele görünürler.
Ama bu amaçlar için yeterince güvenli mi?
Bana öyle geliyor ki, bir GUID verildiğinde, (bildiğim kadarıyla) kriptografik olarak güvenli olmaları amaçlanmadığı için sonraki GUID'leri tahmin etmek mümkün olabilir ...
Not:
http://example.com/forgotPassword/?id=b4684ce3-ca5b-477f-8f4d-e05884a83d3c
Tanımladığınız amaçlar için yeterince güvenli mi? Bence, genellikle evet. Güvenliğin önemli bir endişe kaynağı olduğu uygulamalarda yeterince güvenli midirler? Hayır. Rastgele olmayan bir algoritma kullanılarak üretilirler, dolayısıyla hiçbir şekilde kriptografik olarak rastgele veya güvenli değildirler.
Abonelikten çıkma veya abonelik doğrulama işlevi için gerçekten bir güvenlik sorunu görmüyorum. Öte yandan, bir çevrimiçi bankacılık uygulamasının bir kullanıcısını tanımlamak (veya kimliğin değerli olduğu bir sitenin gerçekten bir şifre sıfırlama işlevi) GUID'leri kesinlikle yetersizdir.
Daha fazla bilgi için, GUID'ler (veya Evrensel Olarak Benzersiz Tanımlayıcılar) için RFC 4122'nin bölüm 6 (Güvenlik Konuları) bölümüne göz atmak isteyebilirsiniz.
ID belirtimi , UUID oluşturma yöntemleri olan birkaç "sürümü" ayrıntılı olarak açıklar. Çoğu, örneğin geçerli tarihi kullanarak benzersizliği (UUID'nin ana noktasıdır) sağlamayı amaçlamaktadır. Bu etkilidir, ancak oluşturulan UUID benzersiz olsa da, aynı zamanda tahmin edilebilir, bu da onları bazı güvenlik kullanımları için yetersiz kılar.
Bununla birlikte, "sürüm 4" UUID oluşturma yöntemi (bölüm 4.4) , kriptografik olarak güçlü bir rasgele sayı üreteci kullanmalıdır. 128 bitin 6'sı geleneksel bir değere sabitlenmiştir (bunun bir sürüm 4 UUID olduğunu belirtmek için), bu nedenle RNG'den 122 bit kalır.
temel RNG güvenli ise (örneğin bir Linux/MacOS/* BSD sisteminde
/dev/urandom Veya
CryptGenRandom() Windows'ta), daha sonra birçok oluşturulan UUID verildiğinde, bir saldırganın başarı olasılığı 2'den yüksek olan bir sonrakini tahmin edememesi gerekir.-122nükleer füzeler için fırlatma kodları da dahil olmak üzere çoğu amaç için yeterince küçük.
122 rastgele bit, yüksek olasılıkla benzersizlik sağlar. Birçok sürüm 4 UUID oluşturursanız ve biriktirirseniz, yaklaşık 2 dakika sonra ilk çarpışmanızla karşılaşmayı bekleyebilirsiniz.61 UUID - bu yaklaşık 2 milyarlarca milyar dolar; sadece bu UUID sayısını depolamak 30 milyondan fazla terabayt kullanır. "Yalnızca" dikkate alırsanız 1012 bu UUID (bin milyar, 16 terabayt üzerinde depolanabilir), daha sonra bunlar arasında iki özdeş UUID olma riski yaklaşık 9.4 * 10-14, yani piyangoda milyonlarca dolar kazanmaktan 700 bin kat daha az muhtemel.
Bu nedenle, UUID are güvenlik amaçları için uygun eğer (ve ancak) güvenli bir RNG ile oluşturulan "sürüm 4" UUID'leri.
Windows 2000 veya daha yenisinde güvenlidirler. Güvenlik açınız ve riskiniz GUID nasıl üretildiğine bağlıdır. Windows 2000 veya daha yenisi, GUID) kriptografik olarak güvenli olan sürüm 4'ü kullanır.
Uygun bir kripto işlevi kullanarak benzersiz rastgele sayılardan oluşan tek atışlık bir jeneratör oluşturmak için ortak bir geliştirme dili kullanıyorsanız o kadar zor değildir (yalnızca Google'ı kullanarak en yaygın dillerde örnek olarak kullanılabilen 10 kod satırından bahsediyoruz ) ve basit bir yeni kılavuz kullanarak, temelde geliştirici bakış açısından tembelliktir.
Açıklanan senaryoda, unuttum parola işlevinde geçen Guid bazı temel özelliklere sahipse, "yeterince güvenli" dir:
1) Gerçekten kullanıcı kimliği ile hiçbir ilişkisi olmayan tek çekim değeri, bu yüzden şifre sıfırlandıktan sonra artık kullanılamaz
2) Geçerliliği için tanımlanmış bir zaman aralığı vardır (sonraki 30 dakika içinde şifreyi sıfırlayabilirsiniz veya bunun gibi bir şey)
Aynı Kılavuz'u kullanıyorsanız, şifreyi bir kereden fazla sıfırlayabilir veya şifre sıfırlama istemeyen kullanıcıların kılavuz ve sıfırlama şifresini tahmin edebilirsiniz veya yorumda Avid açıklamasında olduğu gibi, bir tür şifre kullanarak sıfırlama erişimine erişmeye çalışın tekrar eklemek eklemek o zaman hatalı ve bir Guid kullanmak veya kullanmamak uygulama tasarımı gerçek sorun değildir.
Öyleyse çok hassas bilgilerle uğraşmıyorsanız, belki bir rehber işe yarayabilir, ancak neden işleri ilk kez uygun bir şekilde yapmıyorsunuz ve güvenli bir rastgele dize oluşturmak için uygun bir kripto api kullanmıyorsunuz?
Saygılarımızla Massimo
Herhangi bir GUID nesil algoritması tarafından oluşturulan değil olan, ancak bunun yerine şifreli olarak güvenli bir PRNG tarafından üretilen 128 bit (16 bayt) olan sahte "GUID" ler, ve yalnızca geleneksel GUID tire işaretli onaltılık kodlama) kullanılarak temsil edilenler, çoğunlukla tek seferlik jetonlar için güvenlidir.
Ancak, doğum günü sorunuyla karşılaşırsınız, çünkü bir çarpışma varlığı 128 bit jetonlar için 2 ^ -64 civarındadır.
Çarpışma varlığının 2 ^ -128 veya 2 ^ -256 olduğu 256-bit veya 512-bit jetonları kullanmak daha iyidir.