2014-06-11 41 views
5

根據Microsoft's documentation on NEWSEQUENTIALID,NEWSEQUENTIALID的輸出是可預測的。但是,可預見的可預測性如何?假設我有一個由NEWSEQUENTIALID生成的GUID,它將如何難以:NEWSEQUENTIALID的可預測性如何?

  • 計算下一個值?
  • 計算以前的值?
  • 計算第一個值?
  • 計算第一個值,即使不知道任何GUID?
  • 計算行數?例如。當使用整數時,/order?id=842告訴我應用程序中有842個訂單。

下面是關於我在做什麼以及各種折衷的一些背景信息。

其中一個安全使用GUID作爲整數作爲主鍵的好處是GUID很難猜測。例如。假設黑客看到類似/user?id=845的URL,他可能會嘗試訪問/user?id=0,因爲數據庫中的第一個用戶可能是管理用戶。此外,黑客可以迭代/user?id=0..1..2以快速收集所有用戶。

類似地,整數的一個缺點是他們泄漏了信息。 /order?id=482告訴我,網店自實施以來已有482個訂單。

不幸的是,使用GUID作爲主鍵具有衆所周知的性能的缺點。爲此,SQL Server引入了NEWSEQUENTIALID函數。在這個問題上,我想知道NEWSEQUENTIALID的輸出是多麼可預測。

回答

3

底層操作系統功能是UuidCreateSequential。該值來自您的一個網卡MAC地址和per-os-boot incremental value。請參閱RFC4122。 SQL Server會執行一些byte-shuffling以使結果正確排序。所以從某種意義上說,這個價值是高度可預測的。具體來說,如果你知道一個值,你可以立即預測一個相似值的範圍。

然而,人們無法預測id=0的等價物,也不能預測52DE358F-45F1-E311-93EA-00269E58F20D意味着商店至少售出了482件物品。

唯一的'批准'隨機代是CRYPT_GEN_RANDOM(其中包裝CryptGenRandom),但這顯然是一個可怕的關鍵人選。

+0

優秀而徹底的迴應! –

1

•計算下一個值?是

Microsoft說:

如果隱私是一個問題,請不要使用此功能。可以猜測下一個生成的GUID的值,因此可以訪問與該GUID相關的數據。

因此有可能獲得下一個值。如果可以獲得預先的信息,我不會找到信息。

來自:http://msdn.microsoft.com/en-us/library/ms189786.aspx

編輯:幾個有關NEWSEQUENTIALID和安全的另一個詞:http://vadivel.blogspot.com/2007/09/newid-vs-newsequentialid.html

編輯: NEWSEQUENTIALID包含服務器的MAC地址(或其中一人),因此知道一個順序ID給作爲安全或DoS攻擊的一部分的潛在攻擊者信息。 from:Are there any downsides to using NewSequentialID?

+0

謝謝您的回覆。我知道NEWSEQUENTIALID是可以預測的。在這個問題上,我想知道* how *如何預測。 –

4

在大多數情況下,下一個newsequentialid可以通過取當前值並將第一個十六進制數加1來預測。

換句話說:

1E 29E599-45F1-E311-80CA-00155D008B1C

之後是

1F 29E599-45F1-E311- 80CA-00155D008B1C

之後是

29E599-45F1-E311-80CA-00155D008B1C

偶爾,該序列將從一個新的值重新啓動。

所以,這是很容易預測

NewSequentialID圍繞窗口函數的包裝UuidCreateSequential

+0

我在我的數據庫中觀察到類似的行爲。一連串的行似乎遵循一個模式,但突然跳到一個新的價值。這個新的價值可以被猜測嗎? –

2

你可以試試這個代碼:在這段時間

DECLARE @tbl TABLE (
    PK uniqueidentifier DEFAULT NEWSEQUENTIALID(), 
    Num int 
) 
INSERT INTO @tbl(Num) values(1),(2),(3),(4),(5) 
select * from @tbl 

在我的機器是結果:

PK          Num 
52DE358F-45F1-E311-93EA-00269E58F20D 1 
53DE358F-45F1-E311-93EA-00269E58F20D 2 
54DE358F-45F1-E311-93EA-00269E58F20D 3 
55DE358F-45F1-E311-93EA-00269E58F20D 4 
56DE358F-45F1-E311-93EA-00269E58F20D 5 

你應該嘗試一下在不同時間/日期的時間間隔內插行爲。 我試了幾次,第一部分每次都在改變(你在結果中看到:52 ...,53 ...,54 ...等等)。我等了一段時間來檢查它,過了一段時間後,第二部分也增加了。我想這種接受繼續到所有的部分。基本上它看起來像簡單的+=1導入轉化爲Guid。

編輯:

如果你想連續的GUID,你想有過值的控制,你可以使用Sequences

樣品的編號:

select cast(cast(next value for [dbo].[MySequence] as varbinary(max)) as uniqueidentifier) 
+0

那有什麼用?爲什麼不使用1,2,3,4,5? –