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

Encoding , Encryption và Hashing

Bài viết này mình sẽ đưa ra một số khái niệm cũng như nhưng điểm lưu ý giúp chúng ta có thể phân biệt được Encode, Encryption hay Hash. Bởi trong thực tế mình biết khá nhiều bạn sẽ biết về các khái niệm này, tuy nhiên sẽ không phân biệt cụ thể được chúng mà chỉ ở mức " Ừm, có lẽ chúng dùng để bảo mật 😄".

Cũng không hoàn toàn sai, nhưng chúng ta sẽ tìm hiểu cụ thể xem chúng khác nhau như nào nhé. Let's go !

Enconding

Đây là một phương pháp được sử dụng khá nhiều trong các hệ thống ngày nay.

Bạn đang nghĩ đây là cách chúng ta dùng để bảo mật? Các thông tin nhạy cảm như tên tuổi, địa chỉ hay tài khoản khách hàng có thể lưu an toàn với encoding ? Không phải như vậy nhé!

Khoan, hãy nhìn vào bảng trên. Các bạn có thấy quen thuộc không ? Đây chính là bảng mã ASCii mà chúng ta mài mông nghiên cứu trên ghế giảng đường 😄

Khoan hãy nói về encoding. Các bạn có nhơ chúng ta đã từng làm những bài tập vỡ lòng dạng chuyển đổi 1 đoạn text thành mã bit và ngược lại hay không.

Ví dụ:

  • A -> 01000001
  • B -> 01000010
Quá trình biến đổi từ A -> 01000001 có thể gọi là Encoding và ngược lại tất nhiên sẽ là Decode.

Từ 1 ví dụ đó chúng ta sẽ có nhận định sau về encode: Bản chất encode thực hiện việc biến đổi data thành 1 format khác dựa trên một quy chuẩn nào đó. Và quy chuẩn ở trên của chúng ta sẽ là ASCii.

Nhắc lại kiến thức một chút vậy thôi. Điều mình muốn nhấn mạnh chính là cái cơ chế của encode. Các bạn thấy mình có thể dễ dàng lên google tìm ra bảng mã ASCii và gắn vào bài viết này phải không.

Ứng dụng của các bạn đang encode dữ liệu rồi đưa cho mình và thách đố mình hiểu được. Vậy là xong. Mình ăn kèo. Bỏ ra mấy ngày ngồi so mã với bảng trên vậy 😄

Đùa thôi ai làm thủ công như vậy. Tuy nhiên điều mình muốn nói là:
  • Encoding chỉ là cách thức chuyển hóa dữ liệu của các bạn thành 1 dạng khác mà có thể tiêu thụ được trên các hệ thống khác nhau.
  • Encoding không hề bảo mật. Ta chỉ cần dùng đúng thuật toán encode là có thể giải mã ngược lại mà không cần một key nào.
Ở phần encode này các bạn có thể tham khảo thêm về Unicode, Base64, Url Encoding,... mà được sử dụng rất nhiều cho việc encode này.

Encryption 

Ok, nhắc đến encryption thì chắc chắn chúng ta biết ngay nó để bảo mật dữ liệu.
So sánh với encode thông thường ở trên, khi mà ta chỉ cần dùng đúng công cụ encode để decode ngược lại là xong. Nhưng với encryption, quá trình mã hóa sẽ kèm theo 1 secret-key hay là 1 mã bảo mật mà chỉ người tạo biết được.
Do đó, để có thể giải mã, chúng ta cẩn có đủ 3 thông tin :
  • Đầu tiên chắc chắn là đoạn dữ liệu đã bị mã hóa
  • Thuật toán dùng để mã hóa
  • Cuối cùng quan trọng nhất vẫn là key mật mà người tạo đã sử dụng cho thuật toán này.
Với encyption, chúng ta có thể làm 1 số task đặc biệt như gửi thông tin đến 1 người nhận cụ thể và chỉ họ mới có thể đọc được, hay truyền 1 số thông tin nhạy cảm trên internet,...
Một số thuật toán mã hóa các bạn có thể tham khảo tại link sau
https://www.toptenreviews.com/encryption-algorithms Chắc chắn các bạn đã dùng qua 1 vài trong số đó rồi đấy, tin mình đi 😃)

Hashing
Hashing chỉ quy trình biến đổi một chuỗi data đầu vào (input), xử lý bằng một thuật toán đặc biệt (hash function) và cho ra kết quả là dạng data khác.
Đặc điểm của hashing:
  • Với 1 đầu vào thì luôn chỉ cho ra 1 đầu ra duy nhất (Tất nhiên đấy là với 1 thuật toán tốt, trong thực tế vẫn có hash funtion cho ra cùng 1 output với 2 input khác nhau, gọi là đụng độ giá trị băm (collision))
  • Là quá trình 1 chiều, biến đổi từ input -> output chứ không làm ngược lại được.
Ý nghĩa:
  • Với tính nhất quán của input với output, nên hashing được đại diện cho sự toàn vẹn dữ liệu. Bởi với bất kì 1 thay đổi nhỏ nào của input là bạn đã có 1 output hoàn toàn khác.
  • Vì tính chất 1 chiều như vậy, hashing được dùng trong các tính năng của hệ thống mà không cần phải tương tác với dữ liệu dạng sơ khai để nhằm bảo mật .
Hơi trừu tượng phải không, mình sẽ lấy 1 ví dụ thường gặp nhất nhé. Hashing password Khi user tạo tài khoản, thay vì lưu trữ pass trong db dạng plaintext, thì chúng ta sẽ hash chúng và lưu vào db. Và khi hash như vậy, thì ngay cả hệ thống của chúng ta sau này cũng chẳng biết đoạn hash lưu trong db kia ứng với plaintext gì. Tuy nhiên chúng ta vẫn có thể thực hiện cơ chế xác thực user như sau:
  • User login với username và pass
  • Hệ thống tìm row tương ứng trong db với username và lấy ra hashed-pass
  • Sau đó, ta dùng thuật toán tương tự, hash pass mà user vừa nhập vào rồi so sánh với hased-pass trong db. Nếu khớp thì đó chính là pass hợp lệ.
Đến đây chúng ta chắc sẽ thấy rõ điểm khác biệt giữa encryption và hashing phải không ?
  • Encryption là 1 quy trình mã hóa 2 chiều. Sau khi mã hóa, ta hoàn toàn có thể dùng secret-key để giải mã và lấy ra plain-text ban đầu.
  • Hashing không có key như vậy. Và tất nhiên nó là quy trình chỉ có 1 chiều mã hóa chứ không giải mã được.
Trước khi kết thúc, mình xin phép chém gió nhanh một chút về bảo mật với hashing ( Không phải dân bảo mật nên có gì chém sai ae thông cảm 😄).

Hiện nay hashing được dùng rất nhiều. Tuy nhiên như thế nào sẽ là một thuật toán hash xịn.

Có thể thấy hash (hay bảng băm) là khái niệm chúng ta đã tiếp cận từ hội đại học. Tuy nhiên những hash-function đó chỉ phục vụ ở mức độ hình thành data struture. Bởi lẽ funtion biến đổi của nó khá đơn giản khiến cho việc bẻ khóa là hoàn toàn khả thi. Tuy nhiên hash-function cho việc hash-pass lại khác. Nó cần độ phức tạp cao hơn để tránh bị giải mã ngược. Hay nói cách khác trong case này, Hash chạy càng chậm càng tốt và Không phải cái gì nhanh ra cũng là có lợi 😄
Mọi người có thể tham khảo một số thuật toán hash rất ngon hiện tại như PBKDF2, BCrypt, và SCrypt. Hiện tại với java thì thì mình thấy cả 3 thuật toán này đều được support (jdk và với Spring)
Ngoài ra có 1 số khái niệm về hash như hash-salt, Dictionary, Brute Force Attacks hay Rainbow-Table,.... nói về các cách hash tối ưu cũng như các cách thức crack-hash. Mình sẽ để link tham khảo ở dưới cho mọi người nhé.
Lan man dài dòng thì đến đây cũng xong. Hy vọng bài viết hữu ích. Do không phải dân chuyên nên chém sai chỗ nào ae vào góp ý giúp mình nhé 😃
Link tham khảo: 
- https://auth0.com/blog/adding-salt-to-hashing-a-better-way-to-store-passwords/
- https://crackstation.net/hashing-security.htm 
- https://www.thesslstore.com/blog/difference-encryption-hashing-salting/ 
- https://searchsecurity.techtarget.com/definition/encryption
- https://viblo.asia/p/encoding-encryption-va-hashing-gDVK2pJmlLj

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

Mã hóa đối xứng và bất đối xứng

Hôm nay mình xin được nói về hai thuật toán cơ bản và quan trong nhất trong bảo mật đó là mã hóa đối xứng và mã hóa bất đối xứng . 1. Mã hóa đối xứng (mã hóa không công khai- symmetric-key algorithms ) - Là lớp thuật toán các mã hóa trong đó việc mã hóa và giải mã đều dùng chung cho 1 khóa (secret key) 1.1 Các loại thuật toán khóa đối xứng Thuật toán đối xứng có thể được chia ra làm hai thể loại, mật mã luồng ( stream ciphers ) và mật mã khối ( block ciphers ). Mật mã luồng mã hóa từng bit của thông điệp trong khi mật mã khối gộp một số bit lại và mật mã hóa chúng như một đơn vị. Cỡ khối được dùng thường là các khối 64 bit. Thuật toán tiêu chuẩn mã hóa tân tiến ( Advanced Encryption Standard ), được NIST công nhận tháng 12 năm 2001, sử dụng các khối gồm 128 bit. Các thuật toán đối xứng thường không được sử dụng độc lập. Trong thiết kế của các hệ thống mật mã hiện đại, cả hai thuật toán bất đối xứng ( asymmetric ) (dùng chìa khóa công khai) và thuật toán đối xứng được sử

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