2009-08-31 13 views
17

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, PasswordDeriveBytesRfc2898DeriveBytes, 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.

+0

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

+0

@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

+5

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

Trả lời

25

Họ không phải là những điều tương tự.

Rfc2898DeriveBytes là triển khai PBKDF2. PasswordDeriveBytes là một triển khai thực hiện PBKDF1. PBKDF2 tạo ra một đầu ra khác nhau, sử dụng một phương pháp khác, và số vòng lớn hơn nhiều so với PBKDF1.

Chức năng băm mật khẩu, chẳng hạn như các chức năng này, được sử dụng cho dẫn xuất khóa được cho là chậm. Đó là điểm - nó làm cho họ khó khăn hơn nhiều để crack.

Hai chức năng không tương thích và PasswordDeriveBytes không an toàn.

+0

Cảm ơn BlackAura. Tôi có thể hiểu việc thực hiện PBKDF2 nên được làm chậm, nhưng không phải là có thực hành tốt nhất để sử dụng lớp Rfc2989DeriveBytes, chẳng hạn như làm thế nào để bộ nhớ cache/tái sử dụng cùng một khóa/IV? Chạy một phương thức nhiều lần chậm như trong môi trường sản xuất là không thể chấp nhận được. : P – tshao

+4

Nói chung, bạn chỉ muốn sử dụng các chức năng này để tạo khóa từ mật khẩu. Thông thường cho một cái gì đó giống như một kho lưu trữ được bảo vệ bằng mật khẩu, hoặc tương tự. Để mã hóa một tệp lưu trữ, bạn tạo một IV ngẫu nhiên và tạo khóa từ mật khẩu và IV. Bạn lưu trữ IV (nhưng không bao giờ là chìa khóa). Sau đó bạn có thể sử dụng lại khóa cho mỗi tệp trong kho lưu trữ, miễn là mỗi tệp được mã hóa với một IV khác (cũng được lưu trữ trong tệp lưu trữ). Việc sử dụng duy nhất cho các chức năng này là băm mật khẩu. Bạn sẽ làm điều này một lần, khi người dùng đăng nhập. Đối với bất kỳ mục đích sử dụng nào khác, có thể có cách tốt hơn. – BlackAura

9

Tôi nghĩ rằng bạn đang thiếu điểm xuất phát. Nó được cho là chậm. Nó cố ý sử dụng thuật toán chậm mà không thể tăng tốc bằng mẹo thông minh.Thông số "số lần lặp" điển hình phải nằm trong phạm vi 2^16-2^20 và giới thiệu độ trễ 0,1-0,5 giây giữa người dùng nhập mật khẩu và khóa được tạo. Mục đích là để bảo vệ chống lại mật khẩu yếu được chọn bởi "người dùng không biết gì lười biếng" và làm chậm tìm kiếm bạo lực.

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