Vì vậy, nếu bạn có một trang web và người dùng đăng ký, bạn sẽ lưu mật khẩu của anh ấy dưới dạng hàm băm. Khi họ đăng nhập, trang web của bạn sẽ lấy mật khẩu đã gửi, băm mật khẩu đó và so sánh việc gửi được băm với hàm băm được lưu trữ, phải không?
Có, với ba chi tiết bổ sung theo cách hiện đại tiêu chuẩn để thực hiện việc này:
- Mật khẩu truy cập trang web được mã hóa TLS; nó được giải mã trước khi băm.
- Muối (được rút ngẫu nhiên khi đăng ký mật khẩu hoặc/và tên người dùng/email) được băm cùng với mật khẩu và được máy chủ lưu trữ dọc theo hàm băm của mật khẩu.
- Nó được sử dụng một hàm băm lặp đi lặp lại chậm, hy vọng bộ nhớ cứng được thiết kế cho mật khẩu, như Argon2. Điều này được thiết kế để bảo vệ trong trường hợp máy chủ cho phép danh sách băm và muối bị rò rỉ (những rò rỉ như vậy xảy ra thường xuyên). Biện pháp phòng ngừa này khiến việc tìm mật khẩu trở nên khó khăn hơn (hay chính xác hơn là mật khẩu được chấp nhận, rất có thể là mật khẩu gốc) trong từ điển các mật khẩu thông thường, bằng cách băm mật khẩu ứng cử viên và muối và so sánh với hàm băm mật khẩu, giống như cách máy chủ kiểm tra một mật khẩu khi đăng nhập.
Giả sử bạn đang băm một câu bằng SHA-256, bạn có BAO GIỜ giải mã được một hàm băm như vậy hay thậm chí có khả năng không?
Không. Đầu tiên, "giải mã" không phải là thuật ngữ chính xác để tìm đầu vào của hàm băm với đầu ra của nó; thuật ngữ chính xác là "đảo ngược". Và, một hàm băm được thiết kế để không thể đảo ngược trong hoạt động bình thường. Nếu đầu vào của hàm băm không xác định và được chọn ngẫu nhiên trong một tập hợp lớn và thiết kế hàm băm tốt, thì thực tế không thể đảo ngược hàm băm.
Whatsapp nói rằng tin nhắn của tôi đã được mã hóa. Vì vậy, nếu tôi mã hóa chúng khi tôi gửi chúng, làm thế nào để thiết bị của những người khác giải mã chúng?
Băm không giống như mã hóa. Băm biến đổi một tin nhắn theo cách được thiết kế để không thể đảo ngược và không sử dụng khóa. Mã hóa biến đổi một tin nhắn theo một khóa mã hóa, theo cách có thể đảo ngược bởi một tin nhắn bằng khóa giải mã.
Khóa giải mã phải là bí mật, nếu không thì mục tiêu mã hóa (che giấu những gì đã được mã hóa đối với những kẻ thù không biết khóa giải mã) sẽ không được đáp ứng. Trong mã hóa đối xứng (ví dụ: AES-GCM), khóa mã hóa và khóa giải mã giống nhau. Trong mã hóa bất đối xứng (ví dụ: RSA, ECIES), chúng khác nhau: khóa mã hóa có thể được công khai và được gọi là khóa chung; khóa giải mã là khóa riêng.
Khi bạn gửi tin nhắn bằng ứng dụng hiện đại sử dụng mã hóa bất đối xứng (như Whatsapp), đây là bức tranh toàn cảnh:
- Ứng dụng của bạn rút ra một khóa duy nhất thông báo đối xứng ngẫu nhiên.
- Ứng dụng của bạn mã hóa tin nhắn bằng cách sử dụng mã hóa đối xứng với khóa duy nhất của tin nhắn này và kết quả sẽ được gửi.
- Ứng dụng của bạn liên tục mã hóa khóa duy nhất của tin nhắn đối với từng người nhận dự kiến, sử dụng mã hóa bất đối xứng (ví dụ: ECIES) và từng khóa công khai của người nhận dự định và kết quả sẽ được gửi.
- Khi người nhận cần giải mã tin nhắn, trước tiên, ứng dụng của họ sẽ nhận được khóa duy nhất của tin nhắn đã mã hóa được mã hóa dưới khóa chung của họ và giải mã nó (theo giải mã bất đối xứng) bằng khóa riêng của họ, thu được khóa duy nhất của tin nhắn.
- Ứng dụng của người nhận nhận được tin nhắn được mã hóa, giải mã nó theo quá trình giải mã đối xứng bằng khóa duy nhất của tin nhắn, sau đó hiển thị tin nhắn đã giải mã.
Cơ chế chính bảo vệ tính bí mật của thông điệp là mã hóa đối xứng. Mã hóa bất đối xứng bảo vệ tính bảo mật của khóa duy nhất của thông báo, do đó gián tiếp bảo vệ tính bảo mật của thông báo. Băm thường được sử dụng nội bộ như một khối xây dựng trong một số bước, nhưng không phải là cơ chế mã hóa tin nhắn hoặc khóa duy nhất của tin nhắn.