• Vui lòng đọc nội qui diễn đàn để tránh bị xóa bài viết
  • Tìm kiếm trước khi đặt câu hỏi

Tạo dãy số mật mã ngẫu nhiên

Các thủ thuật liên quan đến xử lý chuỗi và thời gian

Điều hành viên: tungcan5diop, QUANITGROBEST

Hình đại diện của người dùng
meoconbuongbinh1712
Thành viên năng nổ
Thành viên năng nổ
Bài viết: 82
Ngày tham gia: T.Năm 28/12/2006 3:49 pm
Đến từ: Quê của người phụ nữ nặng nhất thế giới
Has thanked: 1 time
Been thanked: 2 time

Tạo dãy số mật mã ngẫu nhiên

Gửi bàigửi bởi meoconbuongbinh1712 » T.Sáu 28/03/2008 4:57 pm

Thủ thuật: Tạo dãy số mật mã ngẫu nhiên
Tác giả: Sưu tầm
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.RNGCryptoServiceProvider.


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.Cryptography.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.

Mã: Chọn hết

  1. using System;
  2. using System.Security.Cryptography;
  3.  
  4. public class SecureRandomNumberExample {
  5.  
  6.     public static void Main() {
  7.    
  8.         // Tạo mảng byte dùng để lưu trữ dữ liệu ngẫu nhiên.
  9.         byte[] number = new byte[32];
  10.        
  11.         // Tạo bộ tạo số ngẫu nhiên mặc định.
  12.         RandomNumberGenerator rng = RandomNumberGenerator.Create();
  13.        
  14.         // Tạo dữ liệu ngẫu nhiên.
  15.         rng.GetBytes(number);
  16.        
  17.         // Hiển thị dữ liệu ngẫu nhiên.
  18.         Console.WriteLine(BitConverter.ToString(number));
  19.     }
  20. }

Mã: Chọn hết

  1. Imports System
  2. Imports System.Security.Cryptography
  3.  
  4. Public Class Form1
  5.     Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
  6.         ' Tạo mảng byte dùng để lưu trữ dữ liệu ngẫu nhiên.
  7.         Dim number(32) As Byte
  8.  
  9.         ' Tạo bộ tạo số ngẫu nhiên mặc định.
  10.         Dim rng As RandomNumberGenerator = RandomNumberGenerator.Create()
  11.  
  12.         ' Tạo dữ liệu ngẫu nhiên.
  13.         rng.GetBytes(number)
  14.  
  15.         ' Hiển thị dữ liệu ngẫu nhiên.
  16.         MsgBox(BitConverter.ToString(number))
  17.     End Sub
  18. End Class

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.


The worst way to miss someone is to be sitting right beside them knowing
you can't have them

thanhtuan1983
Thành viên chính thức
Thành viên chính thức
Bài viết: 14
Ngày tham gia: T.Hai 22/09/2008 3:57 pm

Re: Tạo dãy số mật mã ngẫu nhiên

Gửi bàigửi bởi thanhtuan1983 » T.Năm 25/09/2008 3:47 pm

Chào U!
Mình có 1 ứng dụng dùng password để đăng nhập nhưng mình chỉ bảo mật bằng cách đổi chữ ra số để lưu và ngược lại đổi số ra chữ để kiểm tra đăng nhập. do đó nó không có tính bảo cao. Ứng dụng của mình là lấy dữ liệu từ SQL.
Bạn có thể chỉ giúp mình sử dụng chức năng trên để bảo mật được không? (Mình có thấy 1 ứng dụng người ta làm bảo mật như sau: cùng 1 password nhưng mỗi lần cấu hình thì lưu lại chữ khác nhau, VD: password: test1 -> ascvbra, lần 2 vẫn là test1 nhưng là AChvdff)

trandn
Bài viết: 4
Ngày tham gia: T.Ba 24/06/2008 2:44 pm

Re: Tạo dãy số mật mã ngẫu nhiên

Gửi bàigửi bởi trandn » T.Năm 13/11/2008 2:04 am

thanhtuan1983 đã viết:Chào U!
Mình có 1 ứng dụng dùng password để đăng nhập nhưng mình chỉ bảo mật bằng cách đổi chữ ra số để lưu và ngược lại đổi số ra chữ để kiểm tra đăng nhập. do đó nó không có tính bảo cao. Ứng dụng của mình là lấy dữ liệu từ SQL.
Bạn có thể chỉ giúp mình sử dụng chức năng trên để bảo mật được không? (Mình có thấy 1 ứng dụng người ta làm bảo mật như sau: cùng 1 password nhưng mỗi lần cấu hình thì lưu lại chữ khác nhau, VD: password: test1 -> ascvbra, lần 2 vẫn là test1 nhưng là AChvdff)


Mỗi lần có 1 password thì làm sao so sánh password đã lưu hả U?


Quay về “[.NET] Chuỗi và Thời gian”

Đang trực tuyến

Đang xem chuyên mục này: Không có thành viên nào trực tuyến.1 khách