2014-06-11 23 views
5

Theo Microsoft's documentation on NEWSEQUENTIALID, đầu ra của NEWSEQUENTIALID có thể dự đoán được. Nhưng dự đoán được như thế nào? Giả sử tôi có GUID được tạo bởi NEWSEQUENTIALID, mức độ khó khăn như sau:Dự đoán NEWSEQUENTIALID như thế nào?

  • Tính giá trị tiếp theo?
  • Tính giá trị trước đó?
  • Tính giá trị đầu tiên?
  • Tính giá trị đầu tiên, ngay cả khi không biết bất kỳ GUID nào?
  • Tính số lượng hàng? Ví dụ. khi sử dụng số nguyên, /order?id=842 cho tôi biết rằng có 842 đơn đặt hàng trong ứng dụng.

Dưới đây là một số thông tin cơ bản về những gì tôi đang làm và sự cân bằng khác nhau là gì.

Một trong những bảo mật lợi ích của việc sử dụng GUID trên các số nguyên làm khóa chính là GUID khó đoán. Ví dụ. giả sử một hacker thấy URL giống như /user?id=845, anh ấy có thể truy cập /user?id=0, vì có thể người dùng đầu tiên trong cơ sở dữ liệu là người dùng quản trị. Hơn nữa, tin tặc có thể lặp lại trên /user?id=0..1..2 để nhanh chóng thu thập tất cả người dùng.

Tương tự, bảo mật nhược điểm của số nguyên là chúng rò rỉ thông tin. /order?id=482 cho tôi biết rằng cửa hàng web đã có 482 đơn đặt hàng kể từ khi triển khai.

Thật không may, sử dụng GUID làm khóa chính có hiệu suất nổi bật là hiệu suất. Để kết thúc này, SQL Server đã giới thiệu hàm NEWSEQUENTIALID. Trong câu hỏi này, tôi muốn tìm hiểu làm thế nào dự đoán đầu ra của NEWSEQUENTIALID là.

Trả lời

3

Chức năng hệ điều hành cơ bản là UuidCreateSequential. Giá trị được lấy từ một trong các địa chỉ MAC của thẻ mạng của bạn và một số per-os-boot incremental value. Xem RFC4122. SQL Server thực hiện một số byte-shuffling để làm cho kết quả sắp xếp đúng cách. Vì vậy, giá trị là rất có thể dự đoán được, theo nghĩa nào đó. Cụ thể, nếu bạn biết một giá trị bạn có thể dự đoán ngay một dãy giá trị tương tự.

Tuy nhiên, người ta không thể dự đoán tương đương với id=0, cũng không thể dự đoán rằng 52DE358F-45F1-E311-93EA-00269E58F20D có nghĩa là cửa hàng đã bán ít nhất 482 mặt hàng.

Thế hệ ngẫu nhiên 'được chấp thuận' duy nhất là CRYPT_GEN_RANDOM (kết thúc tốt đẹp CryptGenRandom) nhưng đó rõ ràng là một ứng cử viên quan trọng khủng khiếp.

+0

Phản hồi tuyệt vời và toàn diện! –

1

• Tính giá trị tiếp theo? Có

Microsoft nói:

Nếu quyền riêng tư là mối quan tâm, không sử dụng chức năng này. Có thể đoán giá trị của GUID được tạo tiếp theo và, do đó, truy cập dữ liệu được liên kết với GUID đó.

Vì vậy, đó là khả năng nhận giá trị tiếp theo. Tôi không tìm thấy thông tin nếu nó có thể nhận được một prevoius.

từ: http://msdn.microsoft.com/en-us/library/ms189786.aspx

chỉnh sửa: một vài lời về NEWSEQUENTIALID và an ninh: http://vadivel.blogspot.com/2007/09/newid-vs-newsequentialid.html

Edit: NewSequentialID chứa địa chỉ của máy chủ MAC (hoặc một trong số họ), do đó biết một ID tuần tự cho một thông tin về kẻ tấn công tiềm năng có thể hữu ích như một phần của cuộc tấn công bảo mật hoặc DoS. từ: Are there any downsides to using NewSequentialID?

+0

Cảm ơn bạn đã trả lời. Tôi biết rằng NEWSEQUENTIALID có thể dự đoán được.Trong câu hỏi này, tôi muốn tìm hiểu * cách * dự đoán được. –

4

Trong hầu hết các trường hợp, newsequentialid tiếp theo có thể được dự đoán bằng cách lấy giá trị hiện tại và thêm giá trị đó vào cặp hex đầu tiên.

Nói cách khác:

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

Tiếp theo là

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

Tiếp theo là

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

thoảng, trình tự sẽ khởi động lại từ một giá trị mới.

Vì vậy, nó rất có thể dự đoán

NewSequentialID là một wrapper xung quanh các cửa sổ chức năng UuidCreateSequential

+0

Tôi đã quan sát hành vi tương tự trong cơ sở dữ liệu của mình. Một loạt các hàng dường như theo một mô hình nhưng sau đó đột nhiên nhảy đến một giá trị mới. Liệu giá trị mới này có thể được đoán là tốt? –

2

Bạn có thể thử mã này:

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

Trên máy tính của tôi trong thời gian này là kết quả:

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 

Bạn nên thử nó seve thời gian ral trong thời gian/ngày khác nhau để nội suy hành vi. Tôi đã thử nó chạy nhiều lần và phần đầu tiên thay đổi mọi lúc (bạn thấy trong kết quả: 52 ..., 53 ..., 54 ..., v.v ...). Tôi đã chờ một thời gian để kiểm tra nó, và sau một thời gian phần thứ hai được tăng lên quá. Tôi cho rằng sự tiếp tục xảy ra với tất cả các phần. Về cơ bản nó trông giống như đơn giản +=1 incementation chuyển thành Guid.

EDIT:

Nếu bạn muốn GUID tuần tự và bạn muốn có quyền kiểm soát các giá trị, bạn có thể sử dụng Sequences.

Mẫu mã:

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

Sử dụng sau đó là gì? Tại sao không chỉ sử dụng 1,2,3,4,5? –

Các vấn đề liên quan