SQL Server'da güvenli bir şekilde UNIQUEIDENTIFIER oluşturun


15

UNIQUEIDENTIFIERKullanıcıların belirli verilere erişmek için kullanabileceği bir erişim anahtarı olarak kullanmayı düşünüyorum . Anahtar bu anlamda bir şifre görevi görecektir.

Bir INSERT...SELECTifadenin bir parçası olarak birden çok tanımlayıcılar oluşturmak gerekir . Mimari nedenlerden dolayı bu durumda sunucu tarafındaki tanımlayıcıları oluşturmak istiyorum.

Güvenli bir şekilde rastgele nasıl oluşturabilirim UNIQUEIDENTIFIER? NEWIDHerhangi bir güvenlik özelliği vaat etmediği için bunun yeterince rasgele olmayacağını unutmayın . Ben unguessable kimlikleri gerekir çünkü System.Security.Cryptography.RandomNumberGenerator SQL Server eşdeğerini arıyorum . Her şey dayanan CHECKSUM, RANDya GETUTCDATEda hak olmaz.


2
@AaronBertrand en azından bir rakam her zaman ise 4. Ama tahmin edilebileceklerine dair güçlü kanıtlara sahip olmamam, olmadıkları anlamına gelmez. Bu güvenlik kararını bu gözlem üzerine dayandıramam.
usr

1
Belki de NEWID, "Debian zayıf SSH anahtarları" kadar rastgele: en.wikinews.org/wiki/… Onları test eden geliştiriciye kesinlikle rastgele baktılar ...
usr

2
Bu 4, GUID'nin oluşturulmasında hangi algoritmanın kullanıldığını gösterir. en.wikipedia.org/wiki/Globally_unique_identifier#Algoritma
Mr.Mindor

1
Güvenliğiniz seviyesindeki tek belirleyici faktörün bit entropisi olduğunu anlıyor musunuz? NEWID'in ihtiyaçlarınız için yeterince rastgele olmadığı fikri, kullanım durumunuz için "güvenli" olması gereken bit entropi miktarı hakkında bir fikriniz olduğu anlamına gelir. Bu sayı nedir?
Cade Roux

2
@usr - "iç devlet hakkında tam bilgi verildiğinde" herhangi bir yaklaşımı kırabilir .

Yanıtlar:


26
SELECT CAST(CRYPT_GEN_RANDOM(16) AS UNIQUEIDENTIFIER)

Hile yapmalıydım, düşünürdüm.

CRYPT_GEN_RANDOM

Kripto API (CAPI) tarafından oluşturulan rasgele bir rasgele sayı döndürür.


4

Sadece iki sentim, ama bu iyi bir fikir olmayabilir. Eric Lippert'in GUID'lerde ( bölüm 1 , bölüm 2 , bölüm 3 ) mükemmel serisini açıklamak için kısaltma, Küresel Güvenlikli Benzersiz Tanımlayıcı değil GSUID değil, GUU'dur.

Sorun, GUID'ler NEWID () kullanan herkes gibi düşmanca olmayan bir kapsamda üretildiğinde, tüm değerlerin benzersiz olması garantilidir (iyi, bir çeşit, Eric'in makalesi, bölüm 3). Ancak düşman bir varlık bu kapsama girerse, hem bir sonraki üretilen GUID'yi tahmin edebilir, hem de kendi başlarına çarpışmalara neden olabilirler.

GUID'e benzeyen bir yapının içinde sakladığınız bir değer üretme yönteminizi oluşturarak, esasen düşman bir varlık haline gelmiş olursunuz. Bir GUID'nin sözleşmesini benzersiz olmaktan rastgele olmaya değiştirdiniz . Matematikte biri muhtemelen senin hala benzersiz olduğunu kanıtlayabildiğimden daha iyi olsa da, bu sadece üretim yönteminin sınırları içinde. Bu sözde GUID'leri NEWID () GUID'leriyle karıştırırsanız, tüm bahisler kapalıdır.

Bunun iyi bir fikir olmadığını söylüyorum , çünkü değerleri nasıl kullandığınızı tam olarak bilmiyorum. Değerleri üreten tek varlık sizseniz (mix ve eşleşme yok) ve / veya değerlere devam etmiyorsanız ve / veya çarpışmalarla ilgilenmiyorsanız, bu bir sorun olmayabilir. Bu öğelerden herhangi biri doğru değilse, yeniden değerlendirmek isteyebilirsiniz.


İlginç noktalar. Veri türü seçimim UNIQUEIDENTIFIERçoğunlukla bir tesadüf. Bu türü kullanarak 16 baytlık bir miktar işlemek uygundur. Bir şifre olarak düşünüyorum. Yine de benzersiz olmalı. Asla bir çarpışma görmeyeceğime eminim (ve uygulama olsa bile çökecektir - bu da güvenlidir).
usr

Kabul etmiyorum, benzersiz olmaktan ziyade rastgele hale gelirse onu nasıl şifrelediğinize bağlıdır. Kolayca aynı olabilir.
Dawesi

4

Göre https://blogs.msdn.microsoft.com/sqlprogrammability/2006/03/23/newsequentialid-histrorybenefits-and-implementation/ , NEWID () işlevi sadece v4 tarzı döndüren Windows fonksiyon CoCreateGuid, sarar GUID . Ve https://msdn.microsoft.com/en-us/library/bb417a2c-7a58-404f-84dd-6b494ecf0d13#id11'e göre , 1999'da Windows 2000'den beri,

"Windows'ta yerleşik tüm sürüm 4 GUID'leri için rastgele bitler, Windows CryptGenRandom şifreleme API'sı veya eşdeğeri, şifreleme anahtarlarının oluşturulması için kullanılan aynı kaynak aracılığıyla elde edilir"

Bu yüzden, NEWID () 'in kriptografik olarak güvenli olabileceğini söyleyebilirim - en azından sağladığı 122 entropinin ölçüsü kadar.


İlginç. Ben şahsen güvenlik nedeniyle buna güvenmezdim. Ne Windows ne de SQL Server bu konuda bir garanti vermez.
usr

@ usr Bir garantinin nasıl görüneceğinden emin değilim. "Garanti" kelimesini kullanmaz, ancak standart MSDN Windows SDK belgeleri gibi görünür. MS'in gelecekteki Windows sürümlerinde GUID'lerin kriptografik rasgeleliğini düşürmesi son derece olası değildir. Kazanacak bir şey olmazdı.
Jordan Rieger

Bu MSDN sayfası yalnızca tarihi seçimleri belgeliyor, ancak bunun gelecekte de devam edeceğini söylemiyor. Aynı SQL Server için. Bunun yıkılacağı koşulları hayal edemiyorum. Fakat birçok felaket RNG çöküşü yaşandı. Bunun gibi varsayımlar çoğu zaman yanlış çıktı. Buluşsal bir argüman.
usr

@usr Peki, herhangi bir MSDN belgesi Windows'un gelecekteki davranışlarını nasıl garanti edebilir ? Bu durumlarda umabileceğimiz en fazla şey mevcut davranışın belgelenmesidir. Davranış değişirse, belgeleri günceller. Bu nedenle bu Stack Overflow Q & As sürüm etiketlerine sahiptir ve zaman zaman güncellenir.
Jordan Rieger

Değişmeyecekleri şeyler için garanti veriyorlar. Ürünü değiştirebilirler, ancak "bu özelliklerle güvenlik açısından kritik bir işlev" derler. Söz konusu dokümantasyonu geleceğe dair bir açıklamadan çok tarihsel bir görüş gibi yorumluyorum.
usr
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.