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

So sánh giấy phép mã nguồn mở Apache, MIT, GPL

Mã nguồn mở ngày nay đã và đang trở nên phổ biến hơn bao giờ hết, những dự án mã nguồn mở có thể được tìm thấy hầu như ở bất kì đâu trên không gian mạng rộng lớn này. Tuy nhiên dù có “mở” đi chăng nữa thì những phần mềm mã nguồn mở phải tuân theo những giấy phép nhất định. Điển hình là 3 loại giấy phép phổ biến nhất là Apache, MIT và GPL. Vậy, giữa chúng có gì khác nhau. Trước hết, giấy phép mã nguồn mở là một loại giấy phép được sử dụng cho các phần mềm mã nguồn mở. Giấy phép này cho phép bất kì cá nhân hay tổ chức nào cũng có thể nghiên cứu, thay đổi, chỉnh sửa và cải tiến phần mềm, và phân phối ở các dạng khác nhau như thay đổi hoặc chưa thay đổi. Giấy phép Apache Giấy phép Apache ra đời bởi Quỹ Phần mềm Apache (Apache Software Foundation - ASF). Đây là một giấy phép phần mềm tự do, không có copyleft, bắt buộc trong việc thông báo bản quyển và lời phủ nhận. Giấy phép này hoạt động như các giấy phép phần mềm mã nguồn mở khác, trao cho người sử dụng phần mềm quyền tự do trong b

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ử

Chuyện nghề Kiểm thử an toàn thông tin

Từ hồi đi làm đến giờ, tôi gặp nhiều tình huống không biết nên trả lời thế nào cho đúng, hôm nay ghi lại đây để mai mốt ai có gặp tham khảo. Khi được liên hệ, tôi thấy đa phần các đơn vị làm xong rồi mới nghĩ đến chuyện kiểm thử, thậm chí là bị hack rồi mới nghĩ tới. Việc pentest nên được triển khai ngay từ khi Phân tích thiết kế hệ thống . Các luồng đi của dữ liệu khi phác thảo ý tưởng ở trên giấy cũng cần kiểm tra tính an toàn, nếu để đến khi đã ra sản phẩm rồi thì đi sửa lại mất nhiều thời gian, công sức hơn nhiều, thậm trí sửa lại sinh ra lỗi mới. Nhiều người vẫn đánh giá các sản phẩm cầm nắm được giá trị hơn sản phẩm trí tuệ, hay sáng tạo. Giống thằng em tôi làm graphic designer hay "được nhờ" vẽ hộ logo hai cái này cái kia, có khi mất cả ngày hoặc nhiều hơn, trong khi không được đồng nào, có khi còn bị chê :)). Nếu làm tốt việc gì đó, đừng bao giờ làm miễn phí hoặc lấy giá quá rẻ . Nghe đồn Louis Vutton đốt trụi rũi hàng ế, chứ chưa bao giờ chịu giảm giá. Relax với chuy