Đây là một câu hỏi hoàn toàn xuất phát từ sự tò mò, muốn hiểu thêm một chút về mật mã và xác thực. Cảm ơn trước cho bất cứ ai dành thời gian của họ để trả lời.
Thay vì thêm muối và băm mật khẩu, gửi nó đến máy chủ để xác thực chính bạn, một cái gì đó như thế này có thể hoạt động không? Một khách hàng tạo một cặp khóa riêng/công khai từ mật khẩu và muối ngẫu nhiên. Khóa công khai và muối được lưu trữ bởi máy chủ. Đối với mỗi lần đăng nhập, máy chủ sẽ gửi muối và một giá trị được tạo ngẫu nhiên để khách hàng ký. Máy khách tạo lại khóa riêng từ mật khẩu và muối, sau đó ký vào giá trị được tạo ngẫu nhiên và gửi giá trị đó đến máy chủ. Máy chủ xác minh chữ ký bằng khóa chung tương ứng.
Để làm chậm cuộc tấn công vũ phu, khóa phải được lấy từ mật khẩu và muối bằng cách sử dụng KDF chậm, trước khi tạo khóa riêng tư/công khai.
Ngoài ra, máy chủ có thể yêu cầu máy khách lấy khóa từ giá trị được tạo ngẫu nhiên, sử dụng một số KDF chậm, trước khi nó được ký — mặc dù đối với tôi, điều này có vẻ kém lý tưởng hơn là chỉ làm chậm quá trình tạo khóa. Để tiết kiệm tài nguyên máy chủ khi xác minh chữ ký, người ta có thể sử dụng cơ chế kiểu Proof of Work thay vì KDF chậm, trong đó khách hàng phải tìm một nonce sao cho hash(randomly_generated_value + nonce) > some_set_difficulty, sau đó nonce được ký và gửi tới máy chủ để được xác minh. Máy chủ thậm chí có thể thay đổi độ khó, chẳng hạn như tăng độ khó cho mỗi lần đăng nhập không thành công.
Điều gì sẽ là một số lợi thế và bất lợi của một kế hoạch như vậy? Tôi nghi ngờ việc để lộ muối trong mỗi lần đăng nhập sẽ là một vấn đề.