- vừa được xem lúc

Phân biệt Encrypt và Hashing

0 0 9

Người đăng: Duy Võ

Theo Viblo Asia

Trong lĩnh vực bảo mật dữ liệu, hai khái niệm "Encrypt" (mã hóa) và "Hashing" (băm) thường được nhắc đến như những phương pháp bảo vệ thông tin quan trọng. Tuy nhiên, chúng có mục đích và cơ chế hoạt động hoàn toàn khác nhau. Để hiểu rõ hơn, chúng ta hãy cùng phân biệt giữa mã hóa và băm.

Encrypt (Mã hóa)

Mã hoá là quá trình chuyển đổi dữ liệu dạng gốc (plaintext) sang thành một dạng khác không thể đọc được (ciphertext) để bảo vệ dữ liệu khỏi sự truy cập trái phép. Cơ chế hoạt động: Sử dụng các thuật toán mã hoá và một khoá để chuyển dữ liệu plaintext thành ciphertext. Quá trình mã hoá có thể được đảo ngược (giải mã) để khôi phục lại dữ liệu gốc bằng cách sử dụng khoá giải mã. Mã hoá dữ liệu có hai loại chính là mã hoá đối xứng (Symmetric encryption) và mã hoá bất đối xứng (Asymmetric encryption).

1. Symmetric encryption:

Sử dụng một khóa (key) cho cả quá trình mã hóa (encoding) và giải mã (decoding).

Quản lý khoá:

Shared Key (Khóa chia sẻ): Tất cả các bên tham gia vào quá trình truyền thông phải sử dụng cùng một khóa. Khóa này phải được giữ bí mật và chia sẻ an toàn giữa các bên.

Ưu điểm:

Nhanh và hiệu quả hơn Tốt cho việc mã hoá dữ liệu số lượng lớn

Nhược điểm:

Quản lý khóa khó khăn, đặc biệt là có nhiều người dùng và thiết bị Nếu khoá bị lộ, thì hacker có thể giải mã toàn bộ dữ liệu

Ví dụ thuật toán:

AES (Advanced Encryption Standard) DES (Data Encryption Standard).

2. Asymmetric encryption:

Sử dụng cặp khóa công khai (Publish key) và khóa bí mật (Private key); Khóa công khai để mã hoá, khoá bí mật để giải mã.

Quản lý khoá:

One per user (Khóa riêng cho mỗi người dùng): Mỗi người dùng có một cặp khóa riêng của mình. Khóa công khai có thể được chia sẻ rộng rãi, nhưng khóa riêng tư phải được giữ bí mật.

Ưu điểm:

Bảo mật hơn đối với việc truyền khoá, vì khóa công khai có thể được chia sẻ công khai Giải quyết được vấn đề phân phối khoá

Nhược điểm:

Chậm hơn symmetric encryption Không phù hợp với mã hoá dữ liệu số lượng lớn do hiệu xuất thấp

Ví dụ thuật toán:

RSA (Rivest-Shamir-Adleman) ECC (Elliptic Curve Cryptography). Ứng dụng: Bảo vệ dữ liệu truyền tải và lưu trữ (Thông tin nhạy cảm như số thẻ thanh toán)

Hashing (Băm)

Hashing là quá trình chuyển đổi dữ liệu từ dạng gốc thành một giá trị băm cố định. Hashing là quá trình một chiều, nghĩa là không chuyển về dữ liệu gốc từ giá trị băm (Khác với Encrypt có thể đổi ngược). Với một dữ liệu gốc sẽ tạo ra một giá trị băm nhất định, chính vì vậy khi dùng hash mật khẩu lưu vào database thì hacker có thể dùng rainbow table để dò giá trị băm và tìm được dữ liệu gốc. Vì vậy khi thực hiện hash mật khẩu ta cần thêm Salt ngoài ra còn có Pepper, KDF (Key Derivation Function):.

1. Salt

Salt là một giá trị ngẫu nhiên, được thêm vào mật khẩu trước khi thực hiện băm. Salt đảm bảo rằng mỗi mật khẩu, ngay cả giống nhau cũng sẽ cho ra giá trị băm khác nhau. Điều này làm cho rainbow table gần như vô dụng vì hacker phải tạo rainbow table riêng cho mỗi giá trị salt với kích thước vô cùng lớn

async function hashPassword(password) { const salt = await bcrypt.genSalt(saltRounds); const hashedPassword = await bcrypt.hash(password, salt); return hashedPassword; }

2. Pepper

Pepper là một giá trị bí mật, giống như salt, được giữ bí mật và thêm vào mật khẩu trước khi băm. Pepper thường lưu vào các biến môi trường trên máy chủ.

async function hashPassword(password) { const salt = await bcrypt.genSalt(saltRounds); const hashedPassword = await bcrypt.hash(password + pepper, salt); return { salt, hashedPassword }; }

3. KDF (Key Derivation Function)

Các thuật toán như bcrypt, scrypt và Argon2 chính là các KDF mạnh mẽ và an toàn cho băm mật khẩu. Chúng dùng salt và thực hiện nhiều vòng băm để cho quá trình phá mã trở nên tốn kém hơn về thời gian và tài nguyên

Thuật toán băm phổ biến: MD5 (Message Digest Algorithm 5) SHA-256 (Secure Hash Algorithm 256) Bcrypt, Scrypt, Argon2 (các thuật toán băm mật khẩu an toàn). Ứng dụng : Lưu trữ mật khẩu an toàn, kiểm tra tính toàn vẹn của dữ liệu

Khi nào nên sử dụng Encrypt và Hashing?

  • Encrypt: Khi bạn cần bảo vệ dữ liệu trong quá trình truyền tải hoặc lưu trữ và cần khả năng giải mã để truy cập dữ liệu gốc. Ví dụ: bảo vệ dữ liệu cá nhân, thông tin tài chính, truyền tải dữ liệu qua mạng.
  • Hashing: Khi bạn cần đảm bảo tính toàn vẹn của dữ liệu hoặc lưu trữ mật khẩu an toàn. Ví dụ: lưu trữ mật khẩu người dùng trong cơ sở dữ liệu, kiểm tra dữ liệu tải về có bị thay đổi hay không.

Tổng kết

Cả mã hóa và băm đều là những công cụ quan trọng trong bảo mật thông tin, nhưng chúng phục vụ các mục đích khác nhau và có các cơ chế hoạt động khác nhau. Hiểu rõ sự khác biệt giữa chúng sẽ giúp bạn lựa chọn phương pháp phù hợp để bảo vệ dữ liệu của mình một cách hiệu quả. Hy vọng bài viết này đã giúp bạn hiểu rõ hơn về mã hóa và băm, cũng như cách chúng được sử dụng trong bảo mật thông tin. Nếu bạn có bất kỳ câu hỏi hay thắc mắc nào, đừng ngần ngại để lại bình luận bên dưới!

Bình luận

Bài viết tương tự

- vừa được xem lúc

Tìm hiểu mã hóa, giải mã, các thuật toán mã hóa - Phần 2 - Demo thuật toán mã hóa AES

Ở phần này thì mình sẽ demo về thuật toán mã hóa Advanced Encryption Standard. VD này sẽ sử dụng dựa trên ngôn ngữ Ruby.

0 0 262

- vừa được xem lúc

Những Giáo Trình Kỹ Thuật Lập Trình Hiệu Quả Dành Cho Người Mới Bắt Đầu

Một số giáo trình kỹ thuật lập trình dành cho người mới bắt đầu. Sự phát triển vượt trội của công nghệ thông tin đã ngấm sâu vào tất cả các lĩnh vực của đời sống chúng ta.

0 0 25

- vừa được xem lúc

Những Điều Cần Biết Về Công Việc Của Lập Trình Viên

Trong thời đại công nghệ thông tin ngày nay, lập trình là một ngành đóng vai trò cực kì quan trọng cho sự phát triển kinh tế. Do đó có rất nhiều cơ hội tốt mở ra đối với những bạn theo ngành nghề này.

0 0 30

- vừa được xem lúc

Kinh nghiệm học lập trình cho người mới bắt đầu

Lập trình viên là nghề mà rất nhiều người mong muốn được làm và khẳng định mình tại vị trí này. Bởi vậy, có rất nhiều bạn đang dành nhiều thời gian để học lập trình.

0 0 42

- vừa được xem lúc

Học lập trình có khó không? (Trả lời: Không!)

Không, học lập trình không khó như bạn nghĩ. Việc học lập trình cũng giống như việc học các kỹ năng khác, nó đòi hỏi bạn cần phải đầu tư thời gian và sự kiên nhẫn.

0 0 33

- vừa được xem lúc

Ngành lập trình trong thời buổi dịch corona

Ngành lập trình trong thời buổi dịch corona cơ hội và thách thức. .

0 0 23