FresherKỹ thuậtXác thực & bảo mật
Hashing và mã hóa (encryption) khác nhau như thế nào?
Thử trả lời trước
Đáp án mẫu
Hashing là hàm một chiều: biến mọi đầu vào thành một digest có kích thước cố định và bạn không thể lấy lại đầu vào từ digest. Cùng một đầu vào luôn cho cùng kết quả, và chỉ cần đổi rất nhỏ là kết quả khác hoàn toàn. Encryption là hai chiều: có đúng key thì biến plaintext thành ciphertext và biến ngược lại.
Mỗi loại dùng cho một việc khác nhau:
- Hashing để kiểm tra dữ liệu mà không cần lưu nó, như mật khẩu (với hash chậm có salt như argon2id), tính toàn vẹn file, hoặc loại trùng. Hệ thống không bao giờ cần bản gốc.
- Encryption khi bạn cần đọc lại dữ liệu, như số thẻ để hoàn tiền, hoặc dữ liệu truyền qua TLS. Dùng chế độ có xác thực chuẩn như AES-256-GCM và bảo vệ key.
Một công cụ liên quan, HMAC, hash cùng một secret key để chứng minh thông điệp đến từ người giữ key đó, và đó là cách chữ ký webhook hoạt động.
Hash mật khẩu không phải là "mã hóa" nó, và mã hóa mật khẩu là sai lầm vì ai có key đều đọc được tất cả.
Điều cần nhớ: nếu không bao giờ cần lấy lại giá trị thì hash; nếu cần thì mã hóa.
Ý chính
- Hashing là một chiều, encryption đảo ngược được bằng key
- Mật khẩu được hash bằng hash chậm có salt
- Mã hóa dữ liệu bạn cần đọc lại
- HMAC thêm secret key vào hash
Câu hỏi nối tiếp thường gặp
- Vì sao SHA-256 là lựa chọn kém để lưu mật khẩu?
- Mã hóa đối xứng và bất đối xứng khác nhau thế nào?
Lỗi thường gặp
- Mã hóa mật khẩu để có thể khôi phục
- Gọi base64 là một dạng mã hóa