2016-02-12 11 views
10

Lưu ý rằng đây không phải là đơn đăng ký của tôi, đó là ứng dụng tôi đang áp dụng cho khách hàng. Tôi thường đặt câu hỏi như thế này trên https://security.stackexchange.com/, tuy nhiên vì đây là nhiều chương trình liên quan hơn mà tôi đã hỏi tại đây.UuidCreate có sử dụng CSPRNG không?

Đã cấp, RFC 4122 cho UUID không chỉ định loại 4 UUID phải được tạo bằng Trình tạo số ngẫu nhiên giả mã hóa an toàn (CSPRNG). Đơn giản chỉ cần nói

Đặt tất cả các bit khác thành giá trị ngẫu nhiên (hoặc giả ngẫu nhiên) được chọn.

Mặc dù, một số triển khai thuật toán, chẳng hạn như this one in Java, hãy sử dụng CSPRNG.

Tôi đang cố gắng tìm hiểu xem liệu việc triển khai của Microsoft có thực hiện hay không. Chủ yếu là xung quanh cách NET hoặc MSSQL Server tạo ra chúng.

Kiểm tra .NET source chúng ta có thể nhìn thấy đoạn mã này:

Marshal.ThrowExceptionForHR(Win32Native.CoCreateGuid(out guid), new IntPtr(-1)); 
return guid; 

Kiểm tra CoCreateGuid docco, nó khẳng định

Chức năng CoCreateGuid gọi hàm RPC UuidCreate

Tất cả tôi có thể tìm hiểu về chức năng này là here. Tôi dường như đã đến cuối lỗ thỏ.

Hiện tại, có ai có bất kỳ thông tin nào về cách UuidCreate tạo UUID của nó không?

Tôi đã nhìn thấy nhiều bài viết liên quan:

Đầu tiên trong số đó nói:

Một GUID không đảm bảo về sự ngẫu nhiên, nó đảm bảo xung quanh tính duy nhất. Nếu bạn muốn ngẫu nhiên, hãy sử dụng Random để tạo một chuỗi .

Tôi đồng ý với điều này, ngoại trừ trong trường hợp của tôi cho ngẫu nhiên, con số không thể đoán trước bạn muốn tất nhiên sử dụng một CSPRNG thay vì Random (ví dụ RNGCryptoServiceProvider).

Và các quốc gia sau (trên thực tế trích dẫn từ Wikipedia):

Cryptanalysis của máy phát điện WinAPI GUID cho thấy, kể từ khi chuỗi các V4 GUID là giả ngẫu nhiên; đưa kiến ​​thức đầy đủ về tình trạng nội , người ta có thể dự đoán trước và sau giá trị

Bây giờ, ở phía bên kia của hàng rào this post từ Will Dean nói

Lần cuối cùng tôi nhìn vào điều này (một vài năm trước đây, có lẽ là XP SP2), tôi bước ngay vào mã hệ điều hành để xem thực tế đang xảy ra, và nó tạo ra một số ngẫu nhiên với máy phát số ngẫu nhiên an toàn .

Tất nhiên, ngay cả khi nó hiện đang sử dụng CSPRNG, điều này sẽ được thực hiện cụ thể và có thể thay đổi tại bất kỳ thời điểm nào (ví dụ: mọi cập nhật cho Windows). Không có khả năng, nhưng về lý thuyết có thể.

Quan điểm của tôi là không có tài liệu tham khảo kinh điển về điều này, ở trên là để chứng minh rằng tôi đã thực hiện nghiên cứu của mình và không có bài đăng nào ở trên tham chiếu bất cứ điều gì có thẩm quyền.

Lý do là tôi đang cố gắng quyết định xem một hệ thống sử dụng GUID cho mã thông báo xác thực cần phải được thay đổi hay không. Từ quan điểm thiết kế thuần túy, câu trả lời là số nhất định có, tuy nhiên theo quan điểm thực tế, nếu chức năng Windows UuidCreate không sử dụng CSPRNG, thì không có rủi ro trực tiếp cho hệ thống. bất cứ ai có thể rụng bất kỳ ánh sáng về điều này?

Tôi đang tìm bất kỳ câu trả lời nào có nguồn có uy tín để sao lưu.

+0

Câu hỏi kỳ lạ. Giả sử ai đó nói "có".Bạn đang đi trên cơ sở sự an toàn của hệ thống của bạn trên những gì một người lạ trên Internet nói với bạn? Gọi cho Microsoft. –

+1

Không, tôi yêu cầu một số bằng chứng theo cách này hay cách khác. ví dụ. [xem nhận xét của tôi ở đây] (http://stackoverflow.com/questions/816882/how-to-predict-the-next-guid-from-a-given-guid/817150#comment58381222_817150). – SilverlightFox

+0

Lấy Windbg và bước vào cuộc gọi và xem những gì nó làm. Sau đó, cho ít nhất một os tại một thời điểm bạn sẽ biết. Các hướng dẫn vẫn sẽ không phù hợp với những gì bạn đang sử dụng chúng, nhưng bạn sẽ có ít nhất bị trầy xước ngứa này. –

Trả lời

10

Mặc dù tôi vẫn chỉ là một gã nào trên Internet, tôi đã chỉ lặp đi lặp lại việc thực hiện bước vào UuidCreate, trong một ứng dụng 32-bit chạy trên một phiên bản 64-bit của Windows 10.

Dưới đây là một chút ngăn xếp từ một phần thông qua quá trình:

> 0018f670 7419b886 bcryptPrimitives!SymCryptAesExpandKeyInternal+0x7f 
> 0018f884 7419b803 bcryptPrimitives!SymCryptRngAesGenerateSmall+0x68 
> 0018f89c 7419ac08 bcryptPrimitives!SymCryptRngAesGenerate+0x3b 
> 0018f8fc 7419aaae bcryptPrimitives!AesRNGState_generate+0x132 
> 0018f92c 748346f1 bcryptPrimitives!ProcessPrng+0x4e 
> 0018f93c 748346a1 RPCRT4!GenerateRandomNumber+0x11 
> 0018f950 00dd127a RPCRT4!UuidCreate+0x11 

Khá rõ ràng là sử dụng RNG dựa trên AES để tạo số. GUID được tạo ra bằng cách gọi các hàm thế hệ GUID của người khác vẫn không thích hợp để sử dụng như các thẻ thông báo không xác thực, bởi vì đó không phải là mục đích của hàm tạo GUID - bạn chỉ đang khai thác một hiệu ứng phụ.

"Không chắc chắn của bạn, nhưng về mặt lý thuyết có thể". về những thay đổi trong việc thực hiện giữa các phiên bản hệ điều hành được thay cho lời nói dối bởi tuyên bố này trong các tài liệu cho "UuidCreate":

Nếu bạn không cần mức độ bảo mật này, ứng dụng của bạn có thể sử dụng chức năng UuidCreateSequential, mà cư xử chính xác khi hàm UuidCreate thực hiện trên tất cả các phiên bản khác của hệ điều hành.

tức là nó được sử dụng để dễ dự đoán hơn, giờ đây ít có thể dự đoán được.

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