Các giải pháp lập trình CSharp- P67
Số trang: 10
Loại file: pdf
Dung lượng: 2.65 MB
Lượt xem: 3
Lượt tải: 0
Xem trước 2 trang đầu tiên của tài liệu này:
Thông tin tài liệu:
Các giải pháp lập trình CSharp- P67: Các giải pháp lập trình C# khảo sát chiều rộng của thư viện lớp .NET Framework và cung cấp giải pháp cụ thể cho các vấn đềthường gặp. Mỗi giải pháp được trình bày theo dạng “vấn đề/giải pháp” một cách ngắn gọn và kèm theo là các ví dụ mẫu.
Nội dung trích xuất từ tài liệu:
Các giải pháp lập trình CSharp- P67 551 Chương 14: Mật mã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ớpRNGCryptoServiceProvider. Lớp này cung cấp một vỏ bọc được-quản-lý cho hàmCryptGenRandom của Win32 CryptoAPI, và bạn có thể sử dụng để đổ vào một mảng byte cácgiá 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ọiRandomNumberGenerator.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ớpmặ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.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)); }} 552 Chương 14: Mật mã 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.2. Tính mã băm của password Bạn cần lưu trữ password của người dùng một cách an toàn để bạn có thể sử dụng nó để xác thực người dùng đó trong tương lai. Đừng lưu trữ password của người dùng ở dạng plaintext vì đây là một nguy cơ bảo mật lớn. Thay vào đó, hãy tạo và lưu trữ một mã băm của password bằng một lớp giải thuật băm dẫn xuất từ lớp System.Security.Cryptography.HashAlgorithm. Khi xác thực, tạo mã băm của password và so sánh nó với mã băm đã được lưu trữ.Các giải thuật băm là các hàm mật mã một chiều, nhận plaintext có chiều dài thay đổi và tạomột giá trị số có kích thước cố định. Chúng là một chiều vì gần như không thể tìm lạiplaintext gốc từ mã băm. Các giải thuật băm là tất định (deterministic); áp dụng cùng giảithuật băm cho một mẩu plaintext luôn tạo ra cùng mã băm. Điều này khiến mã băm trở nênhữu ích cho việc xác định hai khối plaintext (trong trường hợp này là password) có giốngnhau hay không. Mục đích của các giải thuật băm bảo đảm rằng—mặc dù không phải khôngxảy ra—khả năng hai mẩu plaintext khác nhau tạo ra cùng mã băm là cực kỳ nhỏ. Ngoài ra,không có mối tương quan nào giữa sự giống nhau của hai mẩu plaintext và mã băm củachúng; một khác biệt nhỏ trong plaintext cũng có thể gây ra khác biệt đáng kể trong mã băm.Khi sử dụng password để xác thực một người dùng, bạn không quan tâm đến nội dung củapassword do người dùng nhập vào. Bạn chỉ cần biết rằng password được nhập trùng khớp vớipassword mà bạn đã ghi lại cho người dùng đó trong cơ sở dữ liệu tài khoản. Bản chất của cácgiải thuật băm khiến chúng trở nên lý tưởng trong việc lưu trữ password một cách an toàn.Khi người dùng cung cấp một password mới, bạn phải tạo mã băm của password và lưu trữmã băm này, rồi loại bỏ password dạng text. Mỗi khi người dùng xác thực với ứng dụng củabạn, tính mã băm của password do người đó cung cấp và so sánh nó với mã băm mà bạn đãlưu trữ. Người ta thường hỏi cách thu lấy password từ một mã băm. Và câu trả lời là không thể. Mục đích của mã băm là đóng vai trò như một token và bạn có thể tùy ý lưu trữ nó mà không sinh ra lỗ hổng bảo mật nào. Nếu người dùng quên password, bạn không thể tìm lại nó từ mã băm đã được lưu trữ; bạn phải reset tài khoản này thành giá trị mặc định nào đó, hoặc tạo một password mới cho người dùng. 553 Chương 14: Mật mãLớp trừu tượng HashAlgorithm cung cấp lớp cơ sở để tất cả các hiện thực giải thuật băm cụthể dẫn xuất từ đó. Thư viện lớp .NET Framework có sáu hiện thực giải thuật băm cụ thể(được liệt kê trong bảng 14.1), mỗi lớp hiện thực là một thành viên của không gian tênSystem.Security.Cryptography. Các lớp với phần đuôi là CryptoServiceProvider bọc lấy cácchức năng do Win32 CryptoAPI cung cấp, trong khi các lớp với phần đuôi là Managed đượchiện thực hoàn toàn bằng mã lệnh được-quản-lý.Bảng 14.1 Các hiện thực giải thuật băm Tên giải thuật Tên lớp Kích thước mã băm (bit) MD5 MD5CryptoServiceProvider 128 SHA hay SHA1 ...
Nội dung trích xuất từ tài liệu:
Các giải pháp lập trình CSharp- P67 551 Chương 14: Mật mã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ớpRNGCryptoServiceProvider. Lớp này cung cấp một vỏ bọc được-quản-lý cho hàmCryptGenRandom của Win32 CryptoAPI, và bạn có thể sử dụng để đổ vào một mảng byte cácgiá 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ọiRandomNumberGenerator.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ớpmặ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.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)); }} 552 Chương 14: Mật mã 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.2. Tính mã băm của password Bạn cần lưu trữ password của người dùng một cách an toàn để bạn có thể sử dụng nó để xác thực người dùng đó trong tương lai. Đừng lưu trữ password của người dùng ở dạng plaintext vì đây là một nguy cơ bảo mật lớn. Thay vào đó, hãy tạo và lưu trữ một mã băm của password bằng một lớp giải thuật băm dẫn xuất từ lớp System.Security.Cryptography.HashAlgorithm. Khi xác thực, tạo mã băm của password và so sánh nó với mã băm đã được lưu trữ.Các giải thuật băm là các hàm mật mã một chiều, nhận plaintext có chiều dài thay đổi và tạomột giá trị số có kích thước cố định. Chúng là một chiều vì gần như không thể tìm lạiplaintext gốc từ mã băm. Các giải thuật băm là tất định (deterministic); áp dụng cùng giảithuật băm cho một mẩu plaintext luôn tạo ra cùng mã băm. Điều này khiến mã băm trở nênhữu ích cho việc xác định hai khối plaintext (trong trường hợp này là password) có giốngnhau hay không. Mục đích của các giải thuật băm bảo đảm rằng—mặc dù không phải khôngxảy ra—khả năng hai mẩu plaintext khác nhau tạo ra cùng mã băm là cực kỳ nhỏ. Ngoài ra,không có mối tương quan nào giữa sự giống nhau của hai mẩu plaintext và mã băm củachúng; một khác biệt nhỏ trong plaintext cũng có thể gây ra khác biệt đáng kể trong mã băm.Khi sử dụng password để xác thực một người dùng, bạn không quan tâm đến nội dung củapassword do người dùng nhập vào. Bạn chỉ cần biết rằng password được nhập trùng khớp vớipassword mà bạn đã ghi lại cho người dùng đó trong cơ sở dữ liệu tài khoản. Bản chất của cácgiải thuật băm khiến chúng trở nên lý tưởng trong việc lưu trữ password một cách an toàn.Khi người dùng cung cấp một password mới, bạn phải tạo mã băm của password và lưu trữmã băm này, rồi loại bỏ password dạng text. Mỗi khi người dùng xác thực với ứng dụng củabạn, tính mã băm của password do người đó cung cấp và so sánh nó với mã băm mà bạn đãlưu trữ. Người ta thường hỏi cách thu lấy password từ một mã băm. Và câu trả lời là không thể. Mục đích của mã băm là đóng vai trò như một token và bạn có thể tùy ý lưu trữ nó mà không sinh ra lỗ hổng bảo mật nào. Nếu người dùng quên password, bạn không thể tìm lại nó từ mã băm đã được lưu trữ; bạn phải reset tài khoản này thành giá trị mặc định nào đó, hoặc tạo một password mới cho người dùng. 553 Chương 14: Mật mãLớp trừu tượng HashAlgorithm cung cấp lớp cơ sở để tất cả các hiện thực giải thuật băm cụthể dẫn xuất từ đó. Thư viện lớp .NET Framework có sáu hiện thực giải thuật băm cụ thể(được liệt kê trong bảng 14.1), mỗi lớp hiện thực là một thành viên của không gian tênSystem.Security.Cryptography. Các lớp với phần đuôi là CryptoServiceProvider bọc lấy cácchức năng do Win32 CryptoAPI cung cấp, trong khi các lớp với phần đuôi là Managed đượchiện thực hoàn toàn bằng mã lệnh được-quản-lý.Bảng 14.1 Các hiện thực giải thuật băm Tên giải thuật Tên lớp Kích thước mã băm (bit) MD5 MD5CryptoServiceProvider 128 SHA hay SHA1 ...
Tìm kiếm theo từ khóa liên quan:
kinh nghiệm lập trình CSharp mẹo lập trình ngôn ngữ lập trình C giáo trình lập trình CSharp lập trình java lập trình căn bản CSharpGợi ý tài liệu liên quan:
-
Thủ thuật giúp giải phóng dung lượng ổ cứng
4 trang 210 0 0 -
NGÂN HÀNG CÂU HỎI TRẮC NGHIỆM THIẾT KẾ WEB
8 trang 202 0 0 -
101 trang 199 1 0
-
Tìm hiểu về ngôn ngữ lập trình C: Phần 1 - Quách Tuấn Ngọc
211 trang 149 0 0 -
161 trang 129 1 0
-
142 trang 129 0 0
-
Giáo trình Vi điều khiển PIC: Phần 1
119 trang 116 0 0 -
Bài giảng Phương pháp lập trình: Chương 9 - GV. Từ Thị Xuân Hiền
36 trang 109 0 0 -
Excel add in development in c and c phần 9
0 trang 107 0 0 -
78 trang 101 0 0