Điểm:0

Sự cần thiết của PBKDF2 trong Thiết lập hiện tại?

lá cờ ie

Tôi có một mật khẩu duy nhất là các byte ngẫu nhiên mã hóa cơ sở dữ liệu. Ngay bây giờ tôi đang sử dụng sơ đồ mã hóa của https://gist.github.com/jbtule/4336842. Tóm lại, chúng tôi lấy một mật khẩu của mình, tạo muối cho khóa xác thực và khóa mật mã, chạy PBKDF2 với 10.000 lần lặp lại để tạo khóa, sau đó sử dụng AES để mã hóa và HMAC để xác thực. Các muối sau đó được lưu trữ bên cạnh bản mã.

Vấn đề của tôi là việc tạo khóa đang trở nên cực kỳ chậm. Quá trình mã hóa và giải mã đang diễn ra cùng với các quy trình CPU nặng nề khác và nhiều truy vấn, do đó, nhiều quá trình giải mã xảy ra đối với bất kỳ quy trình cụ thể nào. Đôi khi, bước tạo khóa có thể mất ~5 giây cho mỗi phần tử tôi muốn giải mã.Nhưng khi tôi đang đọc về nó, có vẻ như các chức năng phái sinh chính không cần thiết cho trường hợp sử dụng của tôi vì mật khẩu ban đầu là hoàn toàn ngẫu nhiên.

Tôi đang nghĩ đến việc chỉ lấy một mật khẩu duy nhất và nối nó với mật mã và muối xác thực trước khi mã hóa/giải mã AES và HMAC. Tôi cũng có thể đơn giản chuyển số lần lặp PBKDF2 xuống mức thấp như ~10, điều này có thể trông cẩu thả nhưng sẽ liên quan đến việc thay đổi ít mã hơn và ít thử nghiệm hơn. Có lỗ hổng bảo mật nào mà tôi đang thiếu ở đây không? Một trong hai giải pháp này có mở ra cho tôi một cuộc tấn công, bạo lực hay không? Từ những gì tôi đang đọc về việc tạo khóa, có vẻ như tôi không cần nó, nhưng các giải pháp homebrew luôn tệ nên tôi rất thận trọng trong việc loại bỏ bất kỳ bảo mật nào mà chúng tôi có. Cảm ơn bạn đã giúp đỡ.

Swashbuckler avatar
lá cờ mc
Miễn là mật khẩu có độ dài ít nhất bằng một khóa và *thực sự* ngẫu nhiên (được tạo bởi trình tạo số ngẫu nhiên mật mã) thì bạn không cần sử dụng PBKDF2. Nếu cả hai điều đó đều không đúng, bạn vẫn có thể sử dụng PBKDF2 và chỉ cần giảm số lần lặp lại nếu điều đó thực sự gây ra sự cố về hiệu suất.
SAI Peregrinus avatar
lá cờ si
Lưu ý rằng các khóa ngẫu nhiên thực sự có thể chứa các ký tự NULL được nhúng (0x00), trong khi mật khẩu là các chuỗi (thường là UTF-8) và do đó không thể chứa các NULL được nhúng (và thường không thể chứa các ký tự không in được khác) và do đó có ít hơn entropy hơn độ dài của chúng sẽ chỉ ra. PBKDF lấy mật khẩu dưới dạng chuỗi và xuất ra một chuỗi byte. Vì vậy, ngay cả khi tạo "mật khẩu" của bạn bằng CSPRNG, bạn vẫn muốn sử dụng KDF để chuyển đổi nó từ các ký tự "có thể in được" thành khóa.
Swashbuckler avatar
lá cờ mc
@SAIPeregrinus Vâng, tôi đã thấy một số vấn đề về khả năng tương tác trong đó một triển khai có thể xử lý null, nhưng một triển khai khác thì không.
Điểm:1
lá cờ ng

Bất cứ khi nào PBKDF2 được sử dụng làm KDF với khóa có entropy lớn, thì tham số lặp lại của nó có thể an toàn là 1, điều này sẽ cải thiện rõ rệt vấn đề hiện tại mà không tốn nhiều công sức. Điều đó áp dụng nếu khóa là mật khẩu có entropy ít nhất 128 bit (ví dụ: 22 ký tự được chọn ngẫu nhiên trong số 64 ký tự).

Mặt khác, nếu mật khẩu đủ đơn giản để có thể ghi nhớ hoặc nhập một cách thuận tiện hoặc được chọn bởi người dùng có ít động cơ hoặc không đủ phán đoán để sử dụng một mật khẩu tốt, thì cần phải có một số loại mật khẩu. kéo dài phím, như PBKDF2 cung cấp. Tuy nhiên PBKDF2 là một phương pháp kéo dài khóa cực kỳ kém. 10.000 lần lặp lại PBKDF2 gần như rõ ràng đối với kẻ tấn công sử dụng ASIC và là trở ngại có thể vượt qua đối với kẻ sử dụng GPU. Tôi khuyên bạn nên chuyển sang thứ gì đó tốt hơn (liên quan đến bộ nhớ): Argon2, scrypt, thậm chí là bcrypt nhỏ hơn, càng sớm càng tốt, đối với phần kéo dài mật khẩu. Và ngay cả khi bạn làm điều này, bạn cần có một lựa chọn tốt hơn là làm nó thường xuyên đến mức nó trở thành một nút thắt cổ chai.

Phương pháp chung nhất là bộ nhớ đệm. Nó hoàn toàn tốt để triệt để entropy-kéo dài mật khẩu chỉ một lần thành giả entropy 128 bit, viết mật khẩu đó dọc theo mật khẩu (có thể là trong RAM hoặc bất cứ thứ gì, miễn là các điều kiện truy cập không dễ dàng hơn so với chính mật khẩu), sau đó sử dụng mật khẩu đó thay vì mật khẩu mà không cần kéo dài thêm (chỉ có các dẫn xuất mà PBKDF2 có thể làm được).

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.