? Bạn cần tạo một số ngẫu nhiên dùng cho các ứng dụng mật mã và bảo mật.
> Sử dụng một bộ tạo số ngẫu nhiên mật mã (cryptographic random number generator), chẳng hạn System.Security.Cryptography.RNGCryptoServiceProvi der.

Lớp System.Random là một bộ tạo số giả ngẫu nhiên, nó sử dụng một giải thuật toán học để mô phỏng việc tạo số ngẫu nhiên. Thực ra, giải thuật này là tất định (deterministic), nghĩa là bạn luôn có thể tính được số kế tiếp sẽ là gì dựa trên số đã được tạo trước đó. Điều này nghĩa là các số được tạo bởi lớp Random sẽ không phù hợp khi tính bảo mật được ưu tiên, chẳng hạn tạo khóa mật hóa và password.
Khi cần một số ngẫu nhiên không tất định (nondeterministic) dùng trong các ứng dụng liên quan đến mật mã hay bảo mật, bạn phải sử dụng bộ tạo số ngẫu nhiên dẫn xuất từ lớp System.Security.Cryptography.RandomNumberGenerator . Đây là một lớp trừu tượng mà tất cả các bộ tạo số ngẫu nhiên cụ thể đều sẽ thừa kế từ nó. Hiện tại, chỉ có một hiện thực là lớp RNGCryptoServiceProvider. Lớp này cung cấp một vỏ bọc được-quản-lý cho hàm CryptGenRandom của Win32 CryptoAPI, và bạn có thể sử dụng để đổ vào một mảng byte các giá trị byte ngẫu nhiên.
Các số do RNGCryptoServiceProvider sinh ra không thật sự ngẫu nhiên. Tuy nhiên, chúng “đủ” ngẫu nhiên để đáp ứng yêu cầu cho các ứng dụng mật mã và bảo mật trong hầu hết các môi trường chính phủ và thương mại.
Lớp cơ sở RandomNumberGenerator là một factory cho các lớp hiện thực dẫn xuất từ đó. Gọi RandomNumberGenerator.Create("System.Security.Cryp tography.RNGCryptoServiceProvider") sẽ trả về một thể hiện của RNGCryptoServiceProvider, và bạn có thể sử dụng nó để tạo số ngẫu nhiên. Ngoài ra, vì RNGCryptoServiceProvider là hiện thực duy nhất nên nó sẽ là lớp mặc định được tạo ra khi bạn gọi phương thức Create không có đối số: RandomNumberGenerator.Create().
Ví dụ dưới đây tạo một đối tượng RNGCryptoServiceProvider và sử dụng nó để tạo các giá trị ngẫu nhiên. Phương thức GetBytes đổ vào một mảng byte các giá trị byte ngẫu nhiên. Bạn có thể sử dụng phương thức GetNonZeroBytes nếu cần dữ liệu ngẫu nhiên không chứa giá trị zero.
Code:
using System;
using System.Security.Cryptography;

public class SecureRandomNumberExample {

    public static void Main() {
    
        // Tạo mảng byte dùng để lưu trữ dữ liệu ngẫu nhiên.
        byte[] number = new byte[32];
        
        // Tạo bộ tạo số ngẫu nhiên mặc định.
        RandomNumberGenerator rng = RandomNumberGenerator.Create();
        
        // Tạo dữ liệu ngẫu nhiên.
        rng.GetBytes(number);
        
        // Hiển thị dữ liệu ngẫu nhiên.
        Console.WriteLine(BitConverter.ToString(number));
    }
}
Những nỗ lực tính toán cần thiết để tạo một số ngẫu nhiên với RNGCryptoServiceProvider lớn hơn nhiều so với Random. Đối với mục đích thường ngày, sử dụng RNGCryptoServiceProvider là quá mức cần thiết. Bạn nên xem xét số lượng số ngẫu nhiên cần tạo và mục đích của các số này trước khi quyết định sử dụng RNGCryptoServiceProvider. Sử dụng lớp RNGCryptoServiceProvider quá mức và không cần thiết có thể ảnh hưởng đáng kể lên hiệu năng của ứng dụng.

Trích từ "Các giải pháp lập trình C#"