Kho chứa đồ của full-stuck engineer

Nơi chứa đồ kiến thức, đồ hàng, mọi thứ linh tinh của tui

Category: Cryptography

  • Mã hóa là cái gì?

    Có bao giờ bạn nghe nói đến certificate SSH, HTTPS, … hay chưa? Hay có bao giờ bạn để ý khi bạn download mấy cái app lậu trên mấy trang mạng và rồi bạn để ý mấy dòng checksum các thứ và tự hỏi nó là gì không?

    Nghe mấy ví dụ mình đưa ra chẳng liên quan gì nhỉ? Nhưng thực ra đó chính là những ứng dụng của mật mã học (cryptography). Vậy mật mã học là gì? Cùng mình tìm hiểu nhe.

    “Cryptography is the art and science of keeping messages secure.”

    Bruce Schneier

    Mật mã học là cái gì và nó làm được gì cho đời mình?

    Như câu trích dẫn mình chôm từ một trang nào đó thì mật mã học là một môn khoa học nghiên cứu cách giữ cho thông tin nào đó an toàn không bị lấy cắp mất bằng cách mã hóa nó thành một chuỗi không thể hiểu được và chỉ có một số người có thể giải mã để lấy được thông tin.

    Mật mã học được ứng dụng rất nhiều trong mạng máy tính, nó giúp bảo vệ bạn không bị hacker tấn công cướp lấy dữ liệu của bạn (tất nhiên không phải là bảo vệ hoàn toàn rồi).

    source: Wikipedia

    Mã hóa mang đến lợi ích gì?

    Mã hóa mang đến rất nhiều lợi ích cho chúng ta có thể kể đến

    1. Tính bảo mật (Confidentiality): tất nhiên rồi, nó là mục đích của mã hóa mà =)))
    2. Tính toàn vẹn (Integrity): mã hóa giúp bạn xác định xem thông tin bạn nhận được sau khi giải mã có đúng như
    3. Tính xác thực (Authentication): mã hóa được ứng dụng trong việc xác thực danh tính của đối phương (dùng trong việc xác thực danh tính của máy chủ để thiết lập các kết nối bảo mật như HTTPS và SSH)
    4. Chống thoái thác (Non-repudiation): một cơ chế để xác minh rằng thật sự đối phương đã gửi nó và đôi phương không thể chối bỏ (một nguyên tắc khá quan trọng trong Cyber Security)

    Có bao nhiêu loại mã hóa?

    Có tất cả 3 loại:

    • Mã hóa đối xứng (Symmetric cryptography/Private key cryptography)
    • Mã hóa bất đối xứng (Asymmetric cryptography/Public key cryptography)
    • Hàm băm (Hash function)

    Đối nghịch với cryptography chúng ta có Thám mã (Cryptanalysis). Thám mã là một bộ môn cố gắng bẻ khóa các thuật toán mã hóa để hiểu được thông tin đã mã hóa mà không cần dùng đến key. Thường là hackers.

    Mã hóa đối xứng (Symmetric cryptography/Private key cryptography)

    Là một cơ chế dùng cùng secret key cho cả việc mã hóa và giải mã, do đó bạn cần phải giữ key đó một cách an toàn (nó cũng chính là lý do nó gọi là private).

    Mã hóa đối xứng có tốc độ mã hóa khá cao bởi nó có sử dụng những thuật toán đơn giản hơn (khi so sánh với mã hóa bất đối xứng) và chiều dài khóa ngắn hơn (thường là 128 hay 256 bits đối với AES).

    Tuy nhiên nhược điểm của nó lại nằm ở việc sử dụng cùng 1 secret key cho việc encrypt và decrypt nên bạn phải làm cách nào đó để chuyển key đó đến người nhận một cách an toàn.

    Với đặc điểm mã hóa nhanh chóng, chúng thường được sử dụng để trao đổi thông tin qua lại liên tục giữa 2 bên.

    Một số thuật toán mã hóa đối xứng hiện nay (source: the internet)

    • Data Encryption Standard (DES): DES là một mật mã khối sử dụng khóa 56 bit. Nó được phát hành lần đầu tiên vào năm 1977 và hiện không còn được coi là an toàn vì bị phá vỡ bởi thuật toán vét cạn (exhautive search), mà lý do khoá tương đối ngắn (56 bit). Hiện nay đã bị thay thế bằng AES.
    • Triple DES (3DES): 3DES là một biến thể của DES sử dụng ba khóa. 3DES có độ dài khóa 112 bit hoặc 168 bit, do đó, nó an toàn hơn DES. Nó an toàn hơn DES nhưng cũng chậm hơn. Nhìn chung, 3DES là một thuật toán mã hóa an toàn và hiệu quả, nhưng nó không còn được coi là lựa chọn tốt nhất cho các ứng dụng bảo mật hiện đại.
    • Advanced Encryption Standard (AES)AES là một mật mã khối sử dụng khóa 128 bit, 192 bit hoặc 256 bit, được coi là thuật toán mã hoá đối xứng an toàn nhất hiện có. Nó được phát triển bởi National Institute of Standards and Technology (NIST), và được sử dụng phổ biến trên toàn thế giới hiện nay.

    Mã hóa bất đối xứng (Asymmetric cryptography/Public key cryptography)

    Assymetric encryption hay còn được gọi là public key encypriton dùng hai key khác nhau để encrypt và decrypt.

    Key dùng để encrypt được gọi là public key và có thể đc công khai ra bên ngoài (đó là lý do loại này đc gọi là public key).

    Key dùng để decrypt được gọi là secret key và phải giữ bí mật. Tất cả mọi người đều có thể dùng public key để encrypt thông tin nhưng chỉ có người giữ secret key mới có thể decrypt để lấy thông tin ban đầu.

    Một số hàm trapdoor như RSA cho phép bạn làm ngược lại, encrypt với secret key và decrypt với public key. Thường được sử dụng chủ yếu trong digital signature.

    Việc tách ra làm 2 key khác nhau cho mỗi bước giải quyết được vấn đề lớn của private key encryption. Đó là bạn chỉ cần giữ cho mã mở khóa an toàn, không bị lộ ra ngoài còn mã khóa thì có thể công khai cho tất cả mọi người muốn trao đổi thông tin với mình.

    Nhưng tất nhiên nó cũng có một số nhược điểm:

    • Computation overhead: Asymmetric algorithm yêu cầu tài nguyên tính toán đáng kể hơn so với symmetric algorithm. Nó sẽ tốn thời gian và tính toán phức tạp hơn.

    Một số thuật toán mã hóa bất đối xứng hiện nay (source: the internet)

    • RSA: RSA là từ viết tắt của Rivest–Shamir–Adleman, tên của ba nhà khoa học máy tính đã phát triển nó vào năm 1978. RSA dựa trên độ khó của việc phân tích các số nguyên tố lớn. Mặc dù có tuổi đời rất lâu, RSA vẫn được coi là một trong những thuật toán mã hoá tốt nhất hiện nay.
    • ElGamal: ElGamal là một thuật toán mã hóa bất đối xứng được phát triển bởi Taher Elgamal vào năm 1985. Nó dựa trên bài toán logarit rời rạc, một bài toán toán học phức tạp vẫn chưa có giải pháp hiệu quả. ElGamal được coi là an toàn như RSA, nhưng có hiệu suất tốt hơn.
    • Diffie-Hellman: Diffie-Hellman là một thuật toán chia sẻ bí mật được phát triển bởi Whitfield Diffie và Martin Hellman vào năm 1976. Nó được sử dụng để tạo ra một khóa chung giữa hai bên mà không cần chia sẻ khóa đó trước đây. Giống với ElGamal, Diffie-Hellman là một thuật toán an toàn dựa trên bài toán logarit rời rạc.

    Hàm băm (Hash function)

    Hàm băm là một thuật toán cho phép bạn biến đổi một chuỗi ký tự bất kỳ thành một chuỗi ngẫu nhiên có độ dài cố định còn gọi là “Hashed value”.

    Hàm băm có 2 đặc điểm khá nổi bật. Điều đầu tiên, khi bạn dùng cùng một hàm băm để băm cùng một gái trị đầu vào bạn sẽ luôn luôn nhận được một hashed value xác định, đây được gọi là tính xác định (determination). Và thứ hai, hàm băm là hàm một chiều, nghĩa là bạn không thể đảo ngược hashed value để lấy lại giá trị ban đầu được (irreversible).

    Hai đặc trưng kể trên được ứng dụng theo rất nhiều cách khác nhau

    Bảo vệ mật khẩu

    Thông thường người ta sẽ khong khuyến khích bạn lưu mật khẩu xuống database dưới dạng raw text. Nếu như bị hacker tấn công, có thể mật khẩu của hàng trăm triệu người dùng sẽ bị lộ. Bạn nên đưa mật khẩu đó qua một hàm băm và chỉ lưu giá trị băm. Mỗi lần user đăng nhập thì chỉ cần đưa mật khẩu user nhập qua hàm băm đó một lần nữa và so sánh giá trị băm với giá trị lưu trong database của bạn. Nếu như máy chủ bị tấn công và bị đánh cắp dữ liệu thì chúng cũng không thể biết được mật khẩu của user.

    Kiểm tra toàn vẹn dữ liệu

    Do chỉ thay đổi một bit trong dữ liệu cũng sẽ thay đổi toàn bộ giá trị băm, nên hash function cũng được dùng để kiểm tra xem dữ liệu có còn nguyên vẹn hay đã bị thay đổi. Khi bạn tải game, nhà cung cấp cũng sẽ cung cấp thêm hash value (thường gọi là checksum và sử dụng thuật toán MD5) để biết được file bạn tải có đầy đủ không hay đã bị thay đổi hoặc trong quá trình tải game gây ra lỗi.

    Digital Signature

    Thường được kết hợp với asymmetric encryption để xác thực nội dung và người gửi.

    Ở phía gửi, người gửi dùng thuật toán RSA lấy hash value của thông tin (tui sẽ gọi là message) sau đó dùng private key để mã hóa. Hash value đc mã hóa gọi là signature. Signature được đính kèm với messag tạo thành signed message.

    Ở phía nhận, người nhận tách message và signature ra. Hash message (RSA) để lấy hash value, và dùng public key để decrypt signature lấy hash ký bởi bên gửi. So sánh hash đã tính toán và hash đã được ký, nếu giống nhau ta có thể xác định message đó valid và người gửi cũng valid.

    Đây cũng thể hiện đặc tính toàn vẹn và chống thoái thác mà mình đã đề cập bên trên. Người gửi không thể chối bỏ rằng mình đã gửi chúng bởi chúng ta chỉ có thể decrypt signature mà public key phải do bên gửi cung cấp.

    Tuy nhiên digital không thể xác nhận người gửi đó là ai (authentication). Nó chỉ có thể đảm bảo rằng người gửi không thể bị mạo danh. Nghĩa là hacker không thể giả mạo mình để gửi message cho bạn vì chỉ có mình mới có private để ký.

    Digital Certificate

    Trong khi digital signature liên quan tới việc kiểm tra message và người gửi thì digital certificate quan tâm nhiều hơn tới public key.

    Làm sao để bạn biết được public key đó có thật sự là của mình hay do hacker giả mạo mình để gửi public key của hắn và nói là của mình? Mình sẽ nói chi tiết hơn trong một post khác nhưng nó cũng sử dụng hash function để ký xác nhận public key đó với một domain và chứng nhận bởi Certificate Authority (CA).

    Đây chính là một trong những điều mà cryptorgaphy mang lại “Authentication”.

    — DONE —