Chuyển đến nội dung chính

Tại sao cần mã hóa mật khẩu ? Và các kiểu mã hóa thường gặp.

Lotte, Vietnamwork lộ tài khoản và mật khẩu người dùng và thấy bảo rất nguy hiểm vậy nguy hiểm ở mức nào và liệu người dùng đổi mật khẩu ở Lotte, VNW thì còn có an toàn không?. 

Theo tôi thì CỰC KỲ NGUY HIỂM bởi lẽ thứ nhất là người dùng đã bị lộ thông tin cá nhân và có thể bị dùng thông tin đó cho mục đích ko hay nào đó như spam chẳng hạn. Nhưng nguy hiểm nhất vẫn là bị lộ mật khẩu vì thói quen người dùng thường dùng chung mật khẩu cho nhiều trang web do đó nếu lộ ở trang Lotte thì những đối tượng xấu có thể đơn giản chạy con crawler sang các trang khác với email/tài khoản + password trong đống dữ liệu đó và người dùng có thể mất nhiều thứ hơn.
Mật khẩu trong database đã được băm.
Ok! nói đến đây thì chắc hẳn ai cũng biết để đảm bảo an toàn chúng ta cần mã hóa mật khẩu. Nếu bạn nào hay code Rails mà để ý khi chúng ta dùng gem Devise để đăng nhập thì trong db sẽ không có trường mật khẩu mà thay vào đó là trường mật khẩu mã hóa (encrypted_password) với nội dung ví dụ “$2a$10$H3pCAbs2zO1lY5ZtOKe6a.cmBZ0f9axdaNakzvyjzyDpDwDtTdicO” và giả sử mật khẩu người dùng là "abc123". Thì đây chính là đoạn mã Hash của mật khẩu "abc123" đó. Khi người dùng đăng nhập lại thì mật khẩu họ nhập vào sẽ bị mã hóa thành chuỗi kí tự như trên và so sánh với encrypted_password đã lưu trong db để xác thực mật khẩu đúng hoặc sai. Điều này đạt được là dựa vào đặc tính cơ bản của mã hóa hash này đó là tính 1 chiều ( là khả năng không bị dịch ngược đoạn encrypted_password thành password) và tính duy nhất tức là từ 1 đoạn mã text đầu vào thì chỉ cho ra 1 đoạn mã output duy nhất. Ngoài ra còn có rất nhiều các đặc tính khác mà tôi sẽ nói ở sau đây, đồng thời tôi sẽ lý giải tại sao dùng hash mà không phải các thuật toán mã hóa khác.

Các Định nghĩa cơ bản của mã hóa cho anh em dev

Hỏi: Mã hóa là gì?
Đáp: Mã hóa là sử dụng các thuật toán để đảm bảo an toàn nội dung cho một đối tượng nào đó.

Hỏi: Chọn lựa phương pháp mã hóa như nào là hợp lý?
Đáp: Có thể đoan giản dựa vào 2 yếu tố :
         - Lượng thông tin cần mã hóa.
         - Mục đích việc mã hóa:
                     .Tính bảo mật – Confidentiality?
                     .Tính toàn vẹn – Integrity?
                     .Tính xác thực – Authenticity?
                     .Chống chối từ (đại khái là đảm bảo thông tin gửi đi từ nguồn nào xác thực mà ko thể chối cãi) Non-repudiation? Deniability? (These two are opposites.)


Note: đừng bao giờ tự sáng tạo kiểu mã hóa của riêng mình khi bạn chưa nắm rõ.
Như tôi đã nói ở trên các phương pháp mã hõa cần đảm bảo rất nhiều các yếu tố do đó chỉ nên viết phương pháp mã hóa khi bạn là chuyên gia và chứng minh là nó đủ tốt để dùng, còn không thì hãy cứ dùng những cái đã có sẵn vì nó đã đủ tốt và kiểm tra kĩ lưỡng để sử dụng rồi.

Sơ đồ chung của các phương pháp mã hóa. 

Các mã hóa thường dùng như sha256, MD5, BLAKE2 … Ưu điểm của phương pháp này đó là tốc độ nhanh, mã hóa theo 1 chiều và không thể giải mã ngược lại. Tuy nhiên ở mã hóa MD5 tính bảo mật lại khá yếu do size oupt sinh ra bé nên người ta có thể tính toán ra 1 đoạn mã tương tự có thể sinh ra ouput giống với input gốc (các bạn tự liên hệ risk khi dùng MD5 mã hóa password lưu trong db và để lộ db).

Tác dụng của phương pháp này chủ yếu là dùng để xác thực tính toàn vẹn của file / mesage (khi bạn down load các file lớn trên mạng về máy thì thường có thêm 1 đoạn mã MD5 cái này là để bạn check lại mã MD5 sinh ra với file bạn down về và với dữ liệu gốc, nếu đoạn mã MD5 là giống nhau tức là file bạn down về giống với file gốc còn nếu sai thì tức là trong lúc tải file về bạn đã bị mất mát dữ liệu).


Secret Key Cryptography / Mã hóa bằng khóa bí mật


Đây là kiểu mã hóa mà input vào ngoài dữ liệu còn có thêm 1 đoạn mã key bí mật mà không bị public ra bên ngoài

Keyed Hash Functions

Đây là kiểu mã hóa dùng hàm hash nhưng có thêm 1 giá trị key nhằm tạo ra 1 message_authentication
1 trong phương pháp hay dùng đó là HMAC:
Phương pháp này thì được đánh giá an toàn hơn hash thường vì có key bí mật và chỉ ai có key thì mới có thể tính toán được đoạn mã xác thực sau khi mã hóa ngược lại đoạn nội dung và so sánh với mã xác thực đi kèm nhằm đảm bảo tính toàn vẹn của dữ liệu nhận được.
Secret Key Encryption – mã hóa key bí mật
Đơn giản mà nói thì đây là kiểu mã hóa dùng một key bí mật mà đảm bảo dùng key này ta có thể mã hóa dữ liệu (plain text) thành 1 đoạn mật mã (ciphertext) và đồng thời có thể khôi phục được duy nhất toàn bộ dữ liệu từ đoạn mã hóa kia.
Tuy nhiên kiểu đơn giản (như kiểu ECB mode) như này thì sẽ không an toàn cho 1 số trường hợp ví dụ khi bạn mã hóa 1 đoạn (16bytes) các ký tự giống nhau thì đoạn mã hóa trả ra cũng sẽ bị lặp lại.
Do đó mã hõa dùng key bí mật hiện đại ngày nay ngoài 2 trường trên người ta đã thêm 1 trường mới là vecto khởi tạo IV (Initialization Vector) hoặc nonce (1 số ngẫu nhiên dùng 1 lần). Trong mã hóa này thì trường key sẽ cần bảo mật 2 trường IV, nonce thì sẽ lưu trong đoạn mã gửi đi.
Authenticated Secret-Key Encryption – Mã hóa key xác thực
Đây là phương pháp kết hợp 2 cách trên. Đó là luôn mã hóa bằng key kết hợp với việc dung 1 key khác để xác thực nội dung đoạn mã hõa thông qua tính toán ra giá trị MAC dựa vào giá trị đoạn mã hóa truyền vào
Việc mã hóa này đảm bảo tính an toàn đó là đoạn mã chỉ có thể được giải mã đúng khi dùng đúng key và tính toàn vẹn, xác thực của nội dung đoạn mã nhận được.

Public Key Cryptography / Mã hóa bằng public key

Để mô tả 1 các đơn giản các bạn có thể xem ở hình sau:
như các bạn thấy ở đây nó khác so với dùng 1 key bí mật ở phần trên, ở đây ta dùng tới 4 key
Đầu tiên là 2 key bí mật của từng người mà ko được chia sẻ cho bất cứ ai (lưu ý ko được chia sẻ cho bất cứ ai)
và 2 key public tương ứng với 2 key bí mật, 2 key public này được thông báo tới bất cứ ai
Với điều kiện dựa vào private key ta có thể tính toán ra được public key tuy nhiên chiều ngược lại là ko được ta không thể dựa vào public key để tính ra giá trị của private key, điều này đảm bảo tính bảo mật của private key là chỉ duy nhất người tạo ra key biết.
Phương thức hoạt động của kiểu mã hóa này đó là 2 người sẽ trao đổi public key cho nhau.
Sau đó khi A muốn gửi dữ liệu sang bên B thì A sẽ gửi dữ liệu bị mã hóa bới public key của B (key đã được chia sẻ ở bước trước) sang B, sau đó B sẽ dùng private key của mình để giải mã dữ liệu.
Tính bảo mật dữ liệu ở đây được đảm bào là nhờ dữ liệu sau khi được mã hóa bằng public key của B thì chỉ có dùng private key của B mới giải mã được, mà khóa private B được giữ bởi duy nhất B nên không ai có thẻ giải mã được đoạn mã hóa bằng publib key B.
Khi B gửi dữ liệu sang A thì cũng dùng các tương ứng là mã hóa dữ liệu bằng public key của A.
Ngoài ra phương pháp này còn có chữ kí số dựa vào 1 phần nội dung dữ liệu được mã hóa bằng private key, người nhận dữ liệu sẽ dùng public key của người gửi đã chia sẻ trước đó để kiểm tra lại chữ kí và so sánh với dữ liệu nhận được.
OK đây là nhưng kiến thức cơ bản, giờ chúng ta quay lại 1 chút về câu hỏi mở đầu, là việc mã hóa mật khẩu
chúng ta sẽ tìm hiểu sâu hơn thông qua việc đặt vấn đề ngược cho phương pháp mã hóa mật khẩu mà hiện chúng ta đang sửa dụng
Hỏi: Mã hóa mật khẩu sử dụng hàm hash (thường dùng bcrypt), vậy tại sao lại dùng hàm hash để mã hóa mà không phải dùng cách khác như dùng mã hóa bằng secret key, publickey …
Đáp: chúng ta chỉ sử dụng hàm hash cho mật khẩu mà không phải các phương pháp khác vì lý do cơ bản nhất đó là tính không thể dịch ngược điều đó đảm bảo thông tin mật khẩu chính xác bạn lưu trên máy chủ là khổng thể bị tra lại trên dữ liệu, cho dù là admin quản lý hoặc các hacker chiếm được quyền điều khiển hệ thống hay khi xảy ra sự cố như lộ db ra ngoài (như vụ Lotte ở phần mở đầu) thì các đối tượng xấu vẫn không thể nào biết được mật khẩu thực sự bạn sử dụng, từ đó hạn chế được các tổn thất chỉ ở 1 vùng dữ liệu bị chiếm dụng mà thôi.
Tuy nhiên hash password khác Hash cơ bản vì nó cần đảm bảo thêm nhiều điều kiện để đảm bảo tính an toàn
Lời kết
Đây chỉ là những kiến thức cơ bản của mã hóa, hi vọng là các bạn đã có thêm những kiến thức mới về bảo vệ an toàn thông tin.
Theo: Techtalk via viblo

Nhận xét

Bài đăng phổ biến từ blog này

HttpOnly Flag và Secure Flag của chiếc Cookie để làm gì?

Cookies rất hữu ích nhưng cũng tồn tại không ít rủi ro. Bài viết sau đây giúp tìm hiểu rõ thêm về 2 thuộc tính giúp bảo vệ Cookies là Httponly flag   và Secure flag.   Nếu anh em mò vào được bài này thì chắc cũng biết về Cookie rồi, nhưng còn hiểu lơ mơ    thì click vào đây trước nhé -  Cookie . Chuyện kể rằng, ngày xửa ngày xưa, có một "nghệ sĩ" nọ do không sao kê tiền từ thiện nên đã bị hacker tấn công chiếm rất nhiều tài khoản do bị mất cookie.  1. Tại sao lại mất?   Nguyên nhân "nghệ sĩ" bị mất thông tin cá nhân là do quá chủ quan khi click đọc email do rất nhiều "fan" gửi cho, trong những email đó có gắn đường link chứa mã độc đánh cắp cookie của 1 trang web nào đó.  Do cookies phản hồi từ server mà các đường link đó dẫn tới không được bảo vệ     nên đã bị đối tượng xấu lấy mất cookies chứa xác thực đăng nhập -> dẫn tới mất thông tin. Về mặt bản chất, cũng có thể hiểu đây như là một cuộc tấn công XSS , đối tượng gửi email sẽ execute một đoạn scri

Những câu hỏi phỏng vấn kỹ sư bảo mật thường gặp.

Dưới đây là một danh sách các câu hỏi thường được sử dụng trong việc phỏng vấn tuyển dụng chuyên gia bảo mật. Nhiều câu hỏi được thiết kế buộc người được phỏng vấn phải suy nghĩ, và không thể chuẩn bị trước cho dạng câu hỏi này. Ở đó, các phản ứng của ứng viên cũng quan trọng  như câu trả lời. Một số câu hỏi được pha trộn giữa kỹ thuật và lý thuyết, hoặc câu hỏi tìm hiểu quan điểm của ứng viên để tạo ra những câu hỏi khó khăn hơn. Các câu hỏi cũng thường được chia thành các thể loại khác nhau, một số câu hỏi mẹo sẽ được chèn vào giữa. Mục đích của những câu hỏi dạng đánh đố này là tìm kiếm những điểm yếu kỹ thuật thường chỉ xuất hiện khi ứng viên đi vào làm việc :| . Nhóm câu hỏi chung 1. Giữa các dự án mã mở và mã đóng, bên nào bảo mật hơn? Câu trả lời của ứng viên sẽ nói rất nhiều về họ. Nó cho thấy 1) họ biết những khái niệm gì trong phát triển phần mềm, 2) cho thấy mức độ chín chắn của ứng viên. Mục tiêu chính của câu hỏi là đưa ra được ưu/ nhược điểm của hệ mã đóng và mã m

10 nguyên tắc thiết kế bảo mật khi phát triển phần mềm theo OWASP

 TTổng quan về bảo mật phần mềm Bảo mật đóng vai trò vô cùng quan trọng trong việc phát triển cũng như khi vận hành ứng dụng. Nó như một lá chắn giúp bảo vệ hệ thống phần mềm của chúng ta tránh khỏi các cuộc tấn công của những kẻ xấu nhằm mục đích phá hoại hoặc đánh cắp thông tin. Bảo mật chính là một quá trình liên tục kiểm tra, xử lý các vấn đề bảo mật của hệ thống để duy trì 3 đặc tính trên của hệ thống (Tính toàn vẹn, tính bảo mật, tính sẵn sàng). Tính bí mật : Bí mật là thuật ngữ được sử dụng để tránh lộ thông tin đến những đối tượng không được xác thực hoặc để lọt vào các hệ thống khác. Ví dụ: một giao dịch tín dụng qua Internet, số thẻ tín dụng được gửi từ người mua hàng đến người bán, và từ người bán đến nhà cung cấp dịch vụ thẻ tín dụng. Hệ thống sẽ cố gắng thực hiện tính bí mật bằng cách mã hóa số thẻ trong suốt quá trình truyền tin, giới hạn nơi nó có thể xuất hiện (cơ sở dữ liệu, log file, sao lưu (backup), in hóa đơn…) và bằng việc giới hạn truy cập những nơi mà nó được l