2009-08-10 35 views
5

Tôi đang xây dựng một dịch vụ web yêu cầu tôi tạo phiên tùy chỉnh và mật khẩu ngẫu nhiên, v.v.RNGCryptoServiceProvider tĩnh - Có an toàn và an toàn cho việc tạo phiên và mật khẩu ngẫu nhiên không?

Tôi đã tự hỏi nếu tạo một lớp tĩnh và sử dụng một phiên bản RNGCryptoServiceProvider tĩnh cho toàn bộ trang web là một ý tưởng hay? 1. Chủ đề có an toàn từ nhiều trường hợp yêu cầu http không? 2. Có an toàn không? Nếu tôi cho phép một người nào đó tạo nhiều phiên trong một khoảng thời gian ngắn, liệu có thể tìm ra trạng thái của RNG và dự đoán các phiên tiếp theo không?

trong dịch vụ của tôi mà người dùng khác biết khi ai đó đăng nhập và ban đầu tôi đã tạo RNGCryptoServiceProvider mới khi họ đăng nhập để tạo phiên, nhưng mối quan tâm của tôi là nếu dựa trên thời gian hiện tại, không thể có ai đó về mặt lý thuyết đi qua vài nghìn phiên để "đoán" phiên của người dùng khác nếu họ biết khoảng giây họ đăng nhập?

public static class random 
{ 
    private static RandomNumberGenerator _rng; 
    protected static RandomNumberGenerator rng 
    { 
     get 
     { 
      if (_rng == null) _rng = new RNGCryptoServiceProvider(); 
      return _rng; 
     } 
    } 
    public static byte[] Bytes(int number) 
    { 
     var value = new byte[number]; 
     rng.GetBytes(value); 
     return value; 
    } 
    public static byte Byte { get { return Bytes(1)[0]; } } 
    public static int Int { get { return BitConverter.ToInt32(Bytes(4), 0); } } 
    public static long Long { get { return BitConverter.ToInt64(Bytes(8), 0); } } 
} 

Trả lời

5

1) Nếu đó là mã hóa an toàn, mà nó là nghĩa vụ phải được, sau đó sắp xếp này đoán không nên khả thi.

2) Trên một mặt lưu ý, tôi khuyên bạn nên gỡ bỏ các instantiation JIT trong thuộc tính tĩnh annd thay vì làm như sau:

protected static readonly RandomNumberGenerator _rng = new RNGCryptoServiceProvider(); 
8

CSP dựa RNG trong CLR chỉ là một wrapper quanh CryptGenRandom. Giống như tất cả các hàm CSP, chúng hoạt động xung quanh một xử lý ngữ cảnh HCRYPTPROV. Nếu tôi nhớ chính xác điều đầu tiên mà nhà cung cấp thực hiện khi nhập 'ngữ cảnh' là thu được một phần quan trọng để bảo vệ 'ngữ cảnh'. Vì vậy, trong khi chức năng có nhiều khả năng ổn định trên các chủ đề, bạn thực sự nên sử dụng một riêng biệt cho mỗi thread để tránh tranh chấp.

Cập nhật

Theo MSDN Magazine này CLR thể sử dụng một bộ đệm Ví dụ thay vì một chồng một, làm cho RNGCryptoServiceProvider không an toàn trên đề trong việc triển khai trong tương lai:

Lưu ý rằng, như hiện đang được triển khai trong Khuôn khổ .NET 2.0, số hàm tạo không tham số RNGCryptoServiceProvider tạo thr ead-an toàn trường hợp. Như vậy, chúng ta có thể đã tạo thành viên riêng của chúng tôi để thay đã là một private static thành viên, và khi làm như vậy không phải tạo một đối tượng RNGCryptoServiceProvider mới cho mỗi thể hiện của CryptoRandom. Tuy nhiên, an toàn luồng này hiện không phải là được ghi lại theo bất kỳ cách nào và không được nướng theo cách nào vào hợp đồng của lớp học hoặc giao diện . Do đó, chúng tôi chưa dựa vào nó để triển khai.

Lưu ý rằng việc sử dụng này không liên quan đến sự an toàn của luồng API gốc, vấn đề bộ đệm là một vấn đề trình bao bọc CLR. Ngoài ra, nếu bạn sử dụng hàm tạo RNGCryptoServiceProvider mất byte [], thì không an toàn cho chắc chắn.

+0

+1 để biết chi tiết quan trọng. –

+3

Lớp 'RNGCryptoServiceProvider' là luồng an toàn kể từ .NET 3.5: xem https://msdn.microsoft.com/en-us/library/5f45t420%28v=vs.90%29.aspx (nhưng không phải trong Silverlight). –

-1
[ThreadStatic] protected static readonly RandomNumberGenerator _rng = new RNGCryptoServiceProvider(); 

ThreadStaticAttribute phải đảm bảo mỗi luồng đều có riêng.

+1

Bạn không thể khởi tạo đối tượng 'ThreadStatic', nó sẽ gây ra sự cố: https://confluence.jetbrains.com/display/ReSharper/%27ThreadStaticAttribute%27+usage –

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