Tôi có mục tiêu cấp cao về việc tạo một lớp tiện ích tĩnh đóng gói mã hóa cho ứng dụng .NET của tôi. Bên trong tôi muốn giảm thiểu các sáng tạo đối tượng không cần thiết.An toàn chủ đề của lớp mã hóa .NET?
Câu hỏi của tôi là: chủ đề an toàn của các lớp thực hiện mã hóa đối xứng trong .NET Framework là gì? Cụ thể là System.Security.Cryptography.RijndaelManaged
và các loại ICryptoTransform
mà nó tạo ra.
Ví dụ, trong hàm tạo lớp của tôi, tôi có thể đơn giản làm điều gì đó theo các dòng sau không?
static MyUtility()
{
using (RijndaelManaged rm = new RijndaelManaged())
{
MyUtility.EncryptorTransform = rm.CreateEncryptor(MyUtility.MyKey, MyUtility.MyIV);
MyUtility.DecryptorTransform = rm.CreateDecryptor(MyUtility.MyKey, MyUtility.MyIV);
}
}
Side-bước vấn đề là nó an toàn để có Key và IV tồn tại trong lớp này, ví dụ khối này sẽ trả về một số câu hỏi khác:
Tôi có thể tiếp tục tái sử dụng các EncryptorTransform và DecryptorTransform hơn và hơn? Các thuộc tính
*.CanReuseTransform
và*.CanTransformMultipleBlocks
ngụ ý "có", nhưng có bất kỳ cảnh báo nào mà tôi cần lưu ý không?Vì
RijndaelManaged
thực hiệnIDisposable
độ nghiêng của tôi là đặt nó trong một khốiusing
đặc biệt vì nó có thể gắn với libs ở cấp hệ điều hành bên ngoài. Có bất kỳ cảnh báo nào với điều này vì tôi đang giữ các đối tượngICryptoTransform
xung quanh?Có thể là câu hỏi quan trọng nhất, trong môi trường đa luồng, tôi có gặp phải vấn đề khi chia sẻ các đối tượng giữa các chủ đề không?
Nếu câu trả lời cho # 3 là câu trả lời không an toàn, tôi có bị giảm hiệu năng nghiêm trọng khi khóa trong khi tôi sử dụng các đối tượng
ICryptoTransform
không? (Phụ thuộc vào tải tôi giả sử.)Nó có thể hoạt động hiệu quả hơn để đơn giản khởi tạo
RijndaelManaged
mới mỗi lần không? Hoặc lưu trữ mộtRijndaelManaged
và tạo ranew RijndaelManaged().CreateEncryptor(...)
mỗi lần?
Tôi hy vọng rằng một người nào đó ở đó biết cách hoạt động của tính năng này hoặc trải nghiệm các vấn đề từ việc triển khai tương tự. Tôi đã thấy rằng rất nhiều loại hiệu suất và các vấn đề liên quan đến chuỗi này thường không thể hiện bản thân cho đến khi có một lượng tải lớn.
Cảm ơn!
tư vấn âm thanh tốt. Tôi đoán tôi đã giả định rằng việc tạo và phá hủy một số đối tượng này có chi phí do phụ thuộc cơ bản khi các lớp SDK nền tảng định hướng. Nếu không ai nghĩ rằng đây là một mối quan tâm được bảo hành, thì có vẻ như các cơ chế đồng bộ hóa cuối cùng có thể là nút cổ chai lớn hơn. – mckamey
Đúng là bạn không nên dành thời gian tối ưu hóa sớm, nhưng chỉ muốn bỏ ở đây trong trường hợp của chúng tôi, chúng tôi thấy rằng việc thực hiện ~ 500 mã hóa nhỏ (tất cả cùng một mật khẩu) mất gần 10 giây. Gần như tất cả thời gian đã được dành để tạo ra các bộ mã hóa. Tái sử dụng ICryptoTransforms là giải pháp hiển nhiên. – Bernard
2cents của tôi, tôi thấy rằng _not_ sử dụng lại ICryptoTransform đã gây ra hiệu suất rất xấu của ứng dụng của chúng tôi. – gorillapower