2012-09-08 11 views
11

Theo tài liệu MSDN cho RandomNumberGenerator:RandomNumberGenerator vs RNGCryptoServiceProvider

mã ứng dụng không trực tiếp sử dụng lớp này. Lớp trừu tượng này được cung cấp làm lớp cơ sở cho tất cả các trình tạo số ngẫu nhiên mã hóa.

Để thực hiện trình tạo số ngẫu nhiên mã hóa, hãy sử dụng lớp dẫn xuất RNGCryptoServiceProvider.

Tuy nhiên, tôi đã thấy đoạn mã sau sử dụng trên một vài dịp trong các căn cứ đoạn mã khác nhau:

byte[] bytes = new byte[...]; 
RandomNumberGenerator rng = RandomNumberGenerator.Create(); 
rng.GetBytes(bytes); 

Đáng chú ý nhất với StackExchange (mà tôi giả định bao gồm SO) và cũng với BCrypt.Net.

Vì vậy, tôi hơi bối rối - loại RandomNumberGenerator nào là mã trên trả về? Ngoài ra, có một chút sai sót mà một số cơ sở mã sử dụng RandomNumberGenerator thay vì RNGCryptoServiceProvider?

Tôi giả sử RandomNumberGenerator.Create() đang thực hiện theo mui xe mà tôi hoàn toàn bị thiếu ở đây, nhưng về mặt kỹ thuật (vì đó là lớp trừu tượng) không nên mã trên ném một lỗi?

Trả lời

15

Gọi phương thức RandomNumberGenerator.Create()RandomNumberGenerator.Create("System.Security.Cryptography.RandomNumberGenerator"), cuối cùng sẽ tạo một phiên bản RNGCryptoServiceProvider.

(Nó hiện một số tra cứu trong một cặp từ điển, vì vậy nó có khả năng mà bạn có thể thay đổi becaviour của cuộc gọi đó bằng cách đăng ký một máy phát ngẫu nhiên mặc định ở đâu đó.)

Các loại thực tế của đối tượng quay trở lại không xác định tại thời gian biên dịch, nó chỉ biết rằng nó sẽ kế thừa lớp RandomNumberGenerator, vì vậy bạn có thể sử dụng biến tham chiếu RandomNumberGenerator cho nó.

Cách tạo các loại phiên bản khác nhau tùy thuộc vào đầu vào được sử dụng ở một vài vị trí trong khung, ví dụ theo phương pháp WebRequest.Create.


Một người nào đó tại Micrsoft đã "cố định" tài liệu hiện tại (khung 4.5) cho phương pháp Create(). Bây giờ nó nói:

"Khi ghi đè trong một lớp học có nguồn gốc, tạo ra một thể hiện của việc thực hiện mặc định của một bộ tạo số ngẫu nhiên mật mã mà thể được sử dụng để tạo ra dữ liệu ngẫu nhiên."

Các tài liệu cho khuôn khổ 4,0 nói:

"Tạo một thể hiện của việc thực hiện mặc định của một mật mã bộ tạo số ngẫu nhiên có thể được sử dụng để tạo ra dữ liệu ngẫu nhiên."

Đây là mô tả chính xác về phương pháp thực hiện. Tôi sẽ đưa ra một yêu cầu để đưa mô tả đó trở lại trong tài liệu mới hơn.

+0

"* mà cuối cùng sẽ tạo ra một thể hiện của' RNGCryptoServiceProvider' * "- Các tiêu chuẩn cho điều này là gì? Tại sao không phải 'AesCryptoServiceProvider'/'SHA512' /' DAS' vv? Có phải chỉ là phương pháp tương tự với 'RNGCryptoServiceProvider' mà' RandomNumberGenerator' có nghĩa là quyết định nội bộ sẽ sử dụng thuật toán nào dưới mui xe? – James

+0

@James: Về cơ bản, đó là vì đó là trình tạo số ngẫu nhiên duy nhất được thực hiện theo mặc định (xem hệ thống phân cấp thừa kế http://msdn.microsoft.com/en-us/library/42ks8fz1). 'AesCryptuServiceProvider' là một thuật toán mã hóa, không phải là trình tạo số ngẫu nhiên.Trình tạo số ngẫu nhiên không dành riêng cho các thuật toán mã hóa khác nhau. Lý do duy nhất để làm cho nó có thể đăng ký một máy phát điện khác nhau, là ai đó có thể thấy rằng việc thực hiện hiện tại không tạo ra số ngẫu nhiên đủ tốt. – Guffa

+0

D'oh, đó là lỗi của tôi, giả sử tất cả 'CryptoServiceProvider' là của RNG! Vì vậy, thực tế chỉ có một phần thực thi của một phần RNG của khung công tác và đó là 'RNGCryptoServiceProvider', do đó, nó không quan trọng cái nào tôi sử dụng? – James

3

Tài liệu dành cho RandomNumberGenerator về cơ bản bị rối tung lên. Một ví dụ khác, có tài liệu như sau:

Khi được ghi đè trong lớp dẫn xuất, hãy tạo một thể hiện của một trình tạo số ngẫu nhiên được chỉ định.

... cho phương pháp tĩnh. Phương pháp tĩnh không thể bị ghi đè. Ai viết tài liệu rõ ràng không nghĩ thẳng.

tôi nghi ngờ ý định ban đầu là một cái gì đó như:

mã ứng dụng không trực tiếp thuyết minh lớp này. Lớp trừu tượng này được cung cấp làm lớp cơ sở cho tất cả các trình tạo số ngẫu nhiên mã hóa.

Tôi nghĩ mã bạn đã đăng (sử dụng phương pháp tĩnh Create) là hoàn toàn hợp lý. Đó là cùng một kiểu mẫu như được sử dụng cho XmlReader.Create v.v. - phương pháp tĩnh chọn triển khai phù hợp nhất.

+0

"* phương pháp tĩnh chọn triển khai phù hợp nhất *" - có một chút bực bội rằng không có tài liệu nào cho biết tiêu chí cho phiên bản * là * thích hợp nhất. – James

0

RandomNumberGenerator.Create là phương pháp nhà máy tĩnh. Chắc chắn nó sẽ trả về một trường hợp của một lớp học có nguồn gốc. Và cái đó không trừu tượng nên tất cả điều này là hợp pháp.

Lớp trừu tượng là làm được sử dụng ở mọi nơi thay vì sử dụng lớp bê tông hơn. Chúng có nghĩa là một giao diện thân thiện với phiên bản.

+0

"* Chắc chắn nó sẽ trả về một thể hiện của một lớp dẫn xuất *" - Tôi sẽ tưởng tượng nó là, tuy nhiên, nó không rõ ràng từ các tài liệu phiên bản nó đang trở lại. – James

+0

Loại thực tế được trả về có thể khác nhau. Bạn có thể ghi đè lên nó trong web.config (không có tham chiếu trong tầm tay, nhưng cả bộ nhớ của tôi và Reflector đều nói đây là trường hợp). Không có đảm bảo về loại trả lại. Loại bê tông có quan trọng với bạn không? – usr

+0

"* loại vấn đề cụ thể cho bạn *" - Đối với những gì tôi đang sử dụng nó cho có lẽ không phải là tất cả tôi cần là cho nó để tạo ra một số ngẫu nhiên an toàn. Tuy nhiên, tôi đã tò mò là tại sao các tài liệu được trích dẫn những thứ như "* Mã ứng dụng không trực tiếp sử dụng lớp này *" khi nó rõ ràng không phải là trường hợp. Từ các câu trả lời được đăng, có vẻ như đó là lỗi trong tài liệu. – James