Mã hóa dữ liệu tin nhắn trong ứng dụng chat như thế nào?

Bob đã có bồ, Anne muốn nói với Bob “I love you” nhưng lại sợ bồ Bob thuê hacker chặn bắt tin nhắn rồi đánh ghen, tạt axit, … Anne phải làm thế nào? Bài này sẽ chỉ cho bạn cách để mã hoá dữ liệu được truyền đi giữa hai client, thuật ngữ là end to end encryption.


Vấn đề

Anne muốn gửi thư tình bí mật cho Bob thì Anne phải có hộp bảo mật của Bob, Anne bỏ thư vô hộp, khoá lại, khoá xong thì khỏi mở ra lại để sửa lỗi chính tả nhé vì hộp này chỉ có một chìa khoá thôi. Anne gửi hộp này cho Bob, anh chàng đang ngồi hí hửng đọc thư thì bị bồ bắt quả tang. Anh bị bỏng 90%, huởng thọ 25 tuổi :))

Giải pháp

End to end encryption

Dùng cái gì để tạo ra cặp {public, private}?
RSA

RSA mã hoá được dữ liệu có độ dài tối đa bao nhiêu?
Tuỳ vào độ dài key, RSA-1024 mã hoá được 128 bytes, RSA-2048 mã hoá được 256 bytes.

Dùng RSA-1024, muốn mã hoá dữ liệu dài hơn 128 bytes thì làm thế nào?
Dùng AES mã hoá dữ liệu, dùng RSA mã hoá AES key.
AES mã hoá được dữ liệu có độ dài không giới hạn, chỉ cần random một AES key, dùng key này mã hoá dữ liệu rồi dùng RSA mã hoá AES key.

Coding

Ta sẽ mã hoá “I love you” vào một string có dạng:
@ENCODE@[phần key AES được mã hoá bởi RSA]@_@[phần dữ liệu được mã hoá bởi AES]

@ENCODE@ : Để xác định tin nhắn thuộc loại encrypt.
@_@ : Ngăn cách giữa phần dữ liệu với phần key thôi.

Dùng IntelliJ tạo Gradle Java project, tạo class MessageEncryptionTest.java để viết unit test.
Mục đích của test này là để kiểm tra keypair được generate thành công, mã hóa chuỗi “I love you” rồi giải mã kết quả, kiểm tra kết quả cuối cùng vẫn là “I love you” thì test passed, hoàn thành nhiệm vụ.

Full source code ở cuối bài

MessageEncryptionTest.java

Giờ chỉ cần code để pass 2 cái test trên là xong.

Code method tạo RSA keypair.

Code method encrypt string.

Tới đây xuất hiện thêm AESCipher và RSACipher.

Code AESCipher

Thêm test cho AESCipher

Thêm production code cho AESCipher

Run AESEncryptionTest -> 1 test passed -> Xong AESCipher

Code RSACipher

Thêm test cho RSACipher

Thêm production code cho RSACipher

Run RSAEncryptionTest -> 1 test passed -> Xong RSACipher

Code method decrypt string

Run All Tests -> 3 tests passed -> Mission completed!!!
mã hóa dữ liệu
Full source code

Kết

Hi vọng bài này sẽ giúp các bạn bảo mật dữ liệu cho ứng dụng mà cần trao đổi dữ liệu qua Internet. Bài này cũng giới thiệu về TDD(Test Driven Development). Cách mình cài đặt ví dụ trong bài là áp dụng TDD – Code test trước, code production code sau.

Hẹn gặp lại lần sau,
Happy codding!

Spread the love
  •  
  •  
  •  
  •  
  •  

Leave a Reply

Be the First to Comment!

Notify of
avatar