Tôi đang làm việc trên một chức năng mã hóa dựa trên các lớp kế thừa từ SymmetricAlgorithm như TripleDES, DES vvPasswordDeriveBytes vs Rfc2898DeriveBytes, cũ nhưng cách nhanh hơn
Về cơ bản đang có hai tùy chọn để tạo ra chìa khóa phù hợp và IV cho lớp thuật toán của tôi, PasswordDeriveBytes
và Rfc2898DeriveBytes
, cả hai đều được thừa kế từ lớp trừu tượng DeriveBytes.
Phương pháp PasswordDeriveBytes.GetBytes()
được đánh dấu là lỗi thời trong khuôn khổ .NET trong khi Rfc2898DeriveBytes.GetBytes() được khuyến nghị, vì nó khớp với tiêu chuẩn PBKDF2. Tuy nhiên, dựa trên thử nghiệm của tôi, gọi phương thức GetBytes()
tương tự trong lớp Rfc2898DeriveBytes chậm hơn 15 lần so với lớp PasswordDeriveBytes
, dẫn đến việc sử dụng CPU không mong muốn (luôn cao hơn 50%).
Here're một số thử nghiệm dữ liệu:
- Iterations: 100
- Thuật toán loại: DES
- Original Text: "Tôi là một chìa khóa kiểm tra, mã hóa tôi xin vui lòng"
- Thời gian:
- PasswordDeriveBytes: 99ms
- Rfc2898DeriveBytes: 1,373ms
Dựa trên thử nghiệm, hiệu suất kém của Rfc2898DeriveBytes
không được chấp nhận trong môi trường sản xuất.
Có ai nhận thấy vấn đề này trước đây không? Bất kỳ giải pháp tôi vẫn có thể sử dụng một tiêu chuẩn mà không cần nhấn hiệu suất? Bất kỳ rủi ro nào để sử dụng phương pháp lỗi thời (có thể bị xóa trong phiên bản sau)?
Thanks guys!
Edit:
Có lẽ tôi tìm thấy nơi mà vấn đề là ... Giá trị mặc định lặp đi lặp lại số đếm cho PasswordDeriveBytes
là 100, trong khi đối với Rfc2898DeriveBytes
là 1000. Sau khi tôi thay đổi chúng với số tương tự như 1000, thực hiện Rfc2898DeriveBytes
chỉ là hai lần.
Bạn có thường xuyên nhận được chìa khóa trong môi trường sản xuất không? Và, liên quan đến dữ liệu thời gian của bạn, khi bạn nói "100 lần lặp lại" - đó là các lần lặp lại trên khóa người nhận hoặc bạn đã tạo ra 100 khóa. Bất kỳ dữ liệu perf nào dựa trên 100 thử nghiệm đều là nghi ngờ, nhưng tôi nghĩ bạn thực sự đã thử nghiệm MỘT bản dùng thử. Như trong tất cả các trường hợp phân tích perf, nó là simly không thích hợp để rút ra kết luận về hiệu suất máy chủ dựa trên thời gian phản ứng của một thử nghiệm duy nhất. – Cheeso
@Cheeso Bài kiểm tra chỉ là một bài kiểm tra đơn vị về hiệu suất cho hai lớp này và nó không được thực hiện trong một ứng dụng thực tế. "100 lần lặp lại" tôi đã đề cập là một chút bối rối, điều đó chỉ có nghĩa là tôi đã thực hiện mỗi người trong số họ 100 lần. Đó không phải là một thử nghiệm thực sự hoàn hảo nhưng chỉ là một so sánh. – tshao
Tôi nghĩ rằng bạn có thể đã bỏ lỡ điểm 'Rfc2898DeriveBytes' về cơ bản là _designed_ là chậm để kiểm tra băm mật khẩu (được thực hiện cho mỗi lần đăng nhập và do đó không thường xuyên) không nhận thấy hiệu suất khi tấn công brute force. Nếu bạn cần để tạo ra vô số các băm 'Rfc2898DeriveBytes' không phải dành cho bạn, nhưng nếu bạn cần một số bảo mật từ các cuộc tấn công vũ phu thì đó là. – Keith