2009-07-07 51 views

Trả lời

10

Có thể bạn không nên làm điều này. Nếu cookie nhạy cảm, chỉ lưu trữ trên máy chủ.

Nếu bạn thực sự cần, có một số cách để thực hiện điều đó. Trước tiên, bạn sẽ cần phải chuyển đổi bản rõ để một mảng byte, như thế này:

var plainBytes = Encoding.UTF8.GetBytes(plaintext); 

Nếu bạn chắc chắn rằng bản rõ của bạn sẽ không bao giờ sử dụng Unicode, bạn có thể sử dụng thay vì ; điều này sẽ dẫn đến một cookie nhỏ hơn).

Sau đó, bạn sẽ cần mã hóa nó. Cách dễ nhất để làm điều đó là sử dụng DPAPI, như thế này. (Đầu tiên, thêm một tham chiếu đến System.Security.dll). Lưu ý rằng điều này sẽ không hoạt động trên một trang trại máy chủ.

var encryptedBytes = ProtectedData.Protect(plainBytes, null, DataProtectionScope.CurrentUser); 

Cuối cùng, bạn cần phải chuyển đổi nó trở lại văn bản để bạn có thể đưa nó vào cookie. Này được thực hiện tốt nhất trong Base64, như thế này:

Response.AddCookie("MyEncryptedCookie", Convert.ToBase64String(encryptedBytes)); 

Để giải mã các tập tin cookie, bạn sẽ cần phải đảo ngược các bước này, như thế này:

var encryptedBytes = Convert.FromBase64String(Request.Cookies["MyEncryptedCookie"].Value); 
var decryptedBytes = ProtectedData.Unprotect(encryptedBytes , null, DataProtectionScope.CurrentUser); 
var plaintext = Encoding.UTF8.GetString(decryptedBytes); 

Lưu ý rằng cookie sẽ rất lớn, ngay cả đối với các bản tóm tắt nhỏ.

Nếu bạn muốn sử dụng điều này trên một trang trại máy chủ, bạn có thể sử dụng AES; xem System.Security.Cryptography.RijndaelManaged.

+0

Cảm ơn SLaks! Tôi sẽ sử dụng một cái gì đó như RijndaelManaged! :-) – AndreMiranda

+0

Có lý do nào khiến bạn không thể lưu trữ nó trong trạng thái phiên không? – SLaks

+0

Tôi biết câu trả lời này thực sự cũ nên tôi có thể sai, nhưng tôi đã thử 'Response.AddCookie (...)' và tôi gặp lỗi. Thay vì sử dụng 'Response.Cookies.Add (HttpCookie)' – Ortund

2

Cách đơn giản nhất là không mã hóa nó! Chỉ cần sử dụng ID cookie (cộng với một muối) để tra cứu các giá trị (nội dung) trên máy chủ.

-2

Cách an toàn nhất để thực hiện việc này là sử dụng trạng thái phiên ASP.Net thay vì cookie. Vì trạng thái phiên không bao giờ được gửi đến máy khách, bạn sẽ không có gì phải lo lắng.

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