Trước hết, tôi đồng ý với các câu trả lời khác chỉ ra rằng việc tránh điều này sẽ an toàn hơn nhiều và chỉ lưu trữ băm mật khẩu, không phải mật khẩu hoặc bất cứ điều gì có thể chuyển đổi thành mật khẩu.
Tuy nhiên, có những lúc bạn cần ít nhiều cho phép phục hồi. Trong trường hợp mật khẩu, bạn thường muốn khôi phục bằng cách đơn giản cho phép quản trị viên thay đổi mật khẩu khi / nếu cần thay vì khôi phục mật khẩu hiện có.
Tuy nhiên, một khả năng khác là bạn cho phép người dùng lưu trữ dữ liệu trên máy chủ được mã hóa bằng mật khẩu của riêng họ. Trong trường hợp này, chỉ cần cho phép quản trị viên thay đổi mật khẩu là không đủ. Mật khẩu mới sẽ không hoạt động để giải mã dữ liệu và hầu hết người dùng sẽ thấy không thể chấp nhận được khi tất cả dữ liệu được mã hóa của họ không thể truy cập được khi / nếu họ quên / mất mật khẩu. Đối với tình huống này, có một giải pháp thay thế hợp lý an toàn và vẫn cho phép phục hồi khi thực sự cần thiết.
Thay vì sử dụng mật khẩu của người dùng để mã hóa dữ liệu, bạn tạo một khóa ngẫu nhiên để mã hóa chính dữ liệu đó. Sau đó, bạn lưu trữ khóa đó, ở một vài nơi: một lần được mã hóa bằng mật khẩu của người dùng và ở một nơi khác được mã hóa bằng mật khẩu quản trị viên. Sau đó, khi (không thực sự nếu) người dùng mất mật khẩu và không thể truy cập dữ liệu trực tiếp nữa, bạn có thể sử dụng mật khẩu quản trị viên để giải mã khóa thực và sử dụng để khôi phục dữ liệu và / hoặc mã hóa lại khóa với mật khẩu mới của người dùng.
Nếu bạn không muốn tin tưởng hoàn toàn vào một quản trị viên, bạn cũng có thể quản lý điều đó. Ví dụ: bạn có thể quyết định rằng 5 người sẽ có khóa quản trị viên và bạn muốn ít nhất ba người trong số họ đồng ý trước khi khóa có thể được phục hồi. Trong trường hợp này, khi bạn lưu trữ mật khẩu được mã hóa cho mục đích quản trị, bạn lưu trữ nó nhiều lần, mỗi lần cho mỗi bộ trong số ba quản trị viên (không chiếm nhiều dung lượng, vì bạn chỉ lưu trữ nhiều khóa , vì bạn chỉ lưu trữ nhiều khóa , tại ~ 256 bit mỗi lần, không phải nhiều bản sao của dữ liệu). Mỗi bản sao đó được mã hóa liên tiếp với (băm) từng mật khẩu cho ba quản trị viên đó.
Để giải mã nó, bạn cần xác định ba quản trị viên đang nhập mật khẩu của họ và chọn khóa được mã hóa phù hợp cho bộ ba đó, sau đó giải mã bằng cách sử dụng một trong ba mật khẩu để cuối cùng nhận được khóa gốc. Sau đó, bạn có thể sử dụng dữ liệu đó để tự phục hồi dữ liệu hoặc bạn chỉ có thể mã hóa lại bằng mật khẩu mới (hàm băm) của người dùng để họ vẫn có thể truy cập dữ liệu của họ.
Tuy nhiên, khi bạn làm điều này, bạn thực sự cần phải sử dụng một thuật toán mã hóa tiêu chuẩn và (theo sở thích mạnh mẽ), một triển khai tiêu chuẩn, nổi tiếng, được nghiên cứu kỹ lưỡng về nó.