Nay mình đọc được một bài viết về security storage và nó có phần giống với đợt mik đi phỏng vấn hồi trước nên muốn chia sẻ với mọi người, hy vọng mn sẽ có những kiến thức và cái nhìn mới qua bài viết này.
Không lòng vòng nữa, vô ngay thui. 😆😆😆
Interview story
Trong tình huống này, mình xin phép note inteverviwer là ông A và bạn phỏng vấn là B nha mn.
A: Bạn có mention là có kiến thức tốt về security. Bạn có thể nói cụ thể hơn không?
B: Vâng. Em đã áp dụng để thiết kế module user trong hệ thống, lưu trữ password vào trong database và encrypt trước khi lưu trữ.
A: Bạn vừa mới dự án sử dụng encrypt mà không phải hasing để lưu trữ ?
B: Dạ
A: Vậy bạn lưu trữ key ở đâu ?
B: Key nào ạ?
A: Key mà bạn dùng để encrypt password ấy, và nhờ bạn nói rõ asymmetric hay symmetric encryption trong trường hợp này, và key đó là one per user hay là shared key
Symmetric là thuật toán sử dụng 1 key cho việc encryption password plaintext ra ciphertext và ngược lại decryption ciphertext thành plaintext.
Asymmetric là thuật toán sử dụng 2 cặp key: public và private key. Public key dùng để encrypt data, public key dùng để encrypt data và private key dùng để decrypt nó. Public key có thể công khai nhưng private key bắt buộc phải bảo mật vì người khác có thể dùng để giải mã mật khảu của bạn
B: Em không dùng key như trên, vậy cho em xin nói lại hasing
Hasing là thuật toán mã hóa one-way (1 chiều) và bạn không thể lấy lại mật khẩu mà bạn đã hash
Encryption thì ngược lại bạn có thể decrypt password của mình
A: Ok không vấn đề. Vậy bạn có thể giải thích tại sao bạn hash password mà không lưu thẳng nó vào db ?
B: Dạ để đảm bảo tính bảo mật khi hacker trà trộn và lấy thông tin người dùng, họ không thể biết được mật khẩu là gì
A: Nhưng mà hacker vẫn có thể sử dụng rainbow table để lấy dữ liệu thông qua hash collision mà nhỉ, bạn có biết về salt ?
B: Dạ em có sử dụng để append thêm chuỗi random hash vào ạ.
A: Vậy thì nó hoạt động ra sao ?
B: Ví dụ trường hợp hacker lấy được password trong db và sau đó anh ta sử dụng Rainbow table để tìm password và sui rủi thì hash collision xảy ra và anh ta nhận được mật khẩu gốc được trộn với một chuỗi ngẫu nhiên, vì vậy theo một cách nào đó, chúng ta có thể ngăn chặn việc mật khẩu gốc bị lộ.
Rainbow table là một precomputed table dùng để reverse các chuỗi mã hóa (cryptographic) về ngược lại giá trị ban đầu (plaintext). Các chuỗi trong bảng được tạo bằng cách lặp đi lặp lại việc áp dụng hashing cho các mật khẩu gốc, sau đó sử dụng reduction function và tiếp tục hash. Lặp lại đến khi chúng ta có cặp (password, hash) - hash ở đây là chuỗi cuối cùng vòng lặp.
A: Vậy thì bạn sử dụng thuật toán hashing nào?
B: Theo tôi được biết là md5 không an toàn, vì vậy tôi sử dụng bcrypt, SHA-256, sha3, ...
Md5 đã được proven là weak theo báo cáo vào 2004: https://eprint.iacr.org/2004/199.pdf, trường hơp tương tự cũng được á dụng với sha1 vào 2005. Vì vậy hãy thực sự kĩ càng trong việc áp dụng hash function nhé
Ví dụ cho việc triển khai trong java
import org.mindrot.jbcrypt.BCrypt; public class PasswordHashing { public static void main(String[] args) { String password = "minhDrake"; String salt = BCrypt.gensalt(); // Hash the password with the salt String hashedPassword = BCrypt.hashpw(password, salt);; boolean isValidPassword = BCrypt.checkpw("minhDrake", hashedPassword); System.out.println("Is Valid Password: " + isValidPassword); }
}
Conclusion
-Rainbow table attack sử dụng để kiến lại các mật khẩu đã được hash , chúng ta nên dùng salt để đảm bảo an toàn hơn cho mật khẩu. Tất nhiên không có gì là hoàn hảo, salt vẫn có thể bị hack tuy nhiên thay vì bạn kiếm trên 1 dictionary có 100 trang, thì giờ nó là 1000000 trang và từ 1 tuần, nó sẽ biến thành 1 năm. Hacker có vẻ sẽ cần tính kiên nhẫn ))
-Về các key security, bạn không nên lưu trữ strong source code vì có thể bị leak, cách tốt nhất là mã hóa nó và lưu trữ trên cloud, có thể là secret manager chẳng hạn.
-Sử dụng kdf ( key derivation function) : tạo ra một chuỗi mới thông qua một số lần iteration xác định.
Hết rồi. Cảm ơn mọi người đã xem !!!