Tôi may mắn có dịp được làm vài dự án có liên quan đến mã hoá, lĩnh vực mà tôi chả biết gì, nhớ lại thời đi học cứ mỗi lúc thầy Khang Võ (khoa mạng máy tính dạy) thì nổ lùng bùng cái đầu (có lẽ thời đó quá gà, hoặc có thể thầy dạy khó hiểu quá xD :))). Rảnh rổi, ngồi gom góp tổng hợp lại, biết đâu ai đó lại cần, mà cũng có thể diễn giải theo cách của dân không chuyên lại dễ hiểu hơn cho các bạn cần tìm hiểu về mã hoá, và các ứng dụng thực tế của nó.

GnuPG là gì, và các thuật ngữ liên quan (theo RFC 4880)

Theo tôi hiểu, khi giao tiếp giữa 2 bên Lan và Điệp một cách bình thường thì chả có gì bàn ở đây, trường hợp 2 bên có bí mật gì đó thì sẽ áp dụng phương pháp sau:

  • Lan và Điệp cùng dùng phần mềm GnuPG để tạo cặp private & public keys (cặp khoá bí mật và công khai), và trao đổi 2 khoá public cho lẫn nhau.
  • Lan soạn tin nhắn, mã hoá bằng pub-key của Điệp, ký(sign) bằng khoá bí mật của chính Lan, gửi qua email cho Điệp.
  • Điệp nhận được email của Lan, chột miệng thốt lên “Oát đờ heo”, bụng thì nghĩ có lẽ nào máy Lan bị hách(hacked). Bình tâm lại, Điệp rít hơi thuốc lào, nhớ lại lần hẹn hò hôm trước trong CGV Lan có gửi cho Điệp cái pub-key trong cái hộp con đum. Điệp từ tốn, import pub-key của Lan, rồi decrypt (giải mã) email Lan gửi qua. Điệp hớn hở đọc tin nhắn.
  • Điệp đọc xong, lại dùng pub-key của Lan để encrypt (mã hoá) nội dung email, và ký bằng khoá bí mật của Điệp rồi gửi qua Lan.
  • Lan cũng follow trình tự các bước Điệp làm, rồi đọc tin nhắn Điệp gửi.

Tại sao nên dùng GPG

Tại sao là GPG, mà không dùng các phương pháp khác, câu hỏi này xin phép được để ngõ, vì tôi chưa có điều kiện tiếp các phương pháp mã hoá khác khi giao tiếp trên phía server.

Ví dụ:

Đầu tiên, hãy tạo ra 2 cặp khoá(pub, secret) ở máy của bạn trước:

gpg –gen-key, sau đó nhập tên kêy, email

Sau đó, list lại những key đã tạo, ở bước này bạn đã có 2 id cho 2 keys với id lần lượt: longka, và alien

longka@LongKa–MacBookPro:~/sandbox$ gpg —list–key | grep –e "2018-12-11" –n3
pub   rsa3072 2018–12–11 [SC] [expires: 2020–12–10]
      9D21D8393697A5C975DDE9EC639182E3C4D503BE
uid           [ultimate] longka <longka@longka.info>
sub   rsa3072 2018–12–11 [E] [expires: 2020–12–10]

pub   rsa3072 2018–12–11 [SC] [expires: 2020–12–10]
      9C7DBD195C5B060FEFCE4E275E204329C2F822DA
uid           [ultimate] alien <alien@mars.com>
sub   rsa3072 2018–12–11 [E] [expires: 2020–12–10]

Tiếp đến export pulic key dạng armor:

gpg —export –a nguyentienlong88@gmail.com

Sau khi đã có pub-key bạn có thể public nó, gửi cho những người mà bạn cần liên lạc.

Giờ tôi sẽ gửi thông điệp sau đến Lan, dùng gpg cmd như sau:

longka@longka.info send a mesage to alien@mar.com

echo "hello alien" | gpg -oeas –default-key longka@longka.info -r alien@mars.com > longka_sent_2_alien.msg

Thông điệp (do longka@longka.info gửi đến alien@mar.com) được mã hóa như sau:

longka@LongKa–MacBookPro:~/sandbox$ cat longka_sent_2_alien.msg
——–BEGIN PGP MESSAGE——–
hQGMA44KlPD9rbrLAQv/bTYQBYg8fF2wlYsy6iAQeBRdkobEiG7Sg4P3EUk76G5F
1QoxOyozvxJApza4jCxTvpuigPfg3XgggjWXDupSH1s2aPMqvEZWQh3e9uyyhUoY
Qz+9f8YxKWatBEiPdTl9RNdiQzPv7HJLp4o+Hf1QXcMBRm5FDZh9Fgjxp3a5yJRn
TDn2hNbKQaP3EeD34ZeaLZIwKzzLZI1feRtmHUE+37O3ZkpjOGXr6WjzZAEOj33V
BUpYPhMsF4Hb7ta6xpzQ8SfOtBnB+dH2C3KWTYt5OQHDDFGeBkoUr6tLqKeD7/YD
jjgpZyOUIbG/6fQPot51QF/p6en0OYCktM5mzK03GsXluB8qG9/SKPZRdxVmnraK
bmKCtJFBY0fZpwLQhBjpgCCLl+PNX7tYb9UY21FIDVhFsdWPHkWQgNegLfr4tzvR
9ycDYjXJ37CrTMTq3fOhPG2fFZs7qElQSzZ3XH0UTDYddEt16UKkyoPD8N7IyYWQ
fwZJglFNOpzwtKthZVl70ukBbqvZ6OMezS1zh8smFoQqzMhc4/cELFqlGcao/ByL
t4kbfdOpum/urkhq/mb1x1V3EH5nBCUSe+hPQMvm8rDIVHAEPdCtM7vVmpSQuxCj
4tX25VqBfevfYPznohhxypzaIit+7L0FVfim3ejIr0iUh9HplisWFyjhi2/ecH3v
pYpn90xwamE79d1kuSBTY4MorizJ+PcAqOBc6FmeFtHeJmNh1+A/InCdtyIorQLJ
rQKyE50ULS3hyomecUP39yftkJ0MWy0ewg4myi1ZBIk8+H1NcrpCuLrQed34NXoA
Q5dAk+aY3H1temartm08eNAifJJirRrV78/XmKfMxYQuzu+2qDcva9lsDtJlFV1+
/aKLz04JDy2qQfUaLhtaWaLC3Vc9onvkeOSX1rI1KZP5JfasUDUP44KPiJ9/NO5H
f1i0g+/yxcHq1gmnwp/AIoI6B9NRBQa9PPkNSAgIBCRCuCFk6NGAdHujTjBbl0Sy
oYOXmdl0HaeEp2b+z7LTilRL3AiHONZ7LALJzOeH/hzVqz9/ZmhhLHB8wCQ8/4u5
Kr4ELU/EFRyCTsc2xO8HkW5nlw+d2JVLa/X1kDbdimeaqjRwsZdGPVHrA23BkM66
VUdzpRsoieMh02rb96lpJruyMlhliTw7cuUNB2ewBhJrF0Y1UOviI2BI07BzYvM1
WyP2nA8zwR3mpGYKq1c8xsUxfZqTFL0+2rT7YPBGXpuT6uFxNg==
=/2UC
——–END PGP MESSAGE——–

Sau đó, longka@longka.info in ra và nhờ bồ câu gửi đến cho alien@mars.com, nhận được, chạy lệnh sau để giải mã nội dung

longka@LongKa–MacBookPro:~/sandbox$ cat longka_sent_2_alien.msg | gpg –d
gpg: encrypted with 3072–bit RSA key, ID 8E0A94F0FDADBACB, created 2018–12–11
      "alien <alien@mars.com>"
hello alien
gpg: Signature made Tue 11 Dec 2018 01:10:14 PM WIB
gpg:                using RSA key 9D21D8393697A5C975DDE9EC639182E3C4D503BE
gpg:                issuer "longka@longka.info"
gpg: Good signature from "longka <longka@longka.info>" [ultimate]

Public GPG key của tôi 😉

——–BEGIN PGP PUBLIC KEY BLOCK——–
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
=WFA1
——–END PGP PUBLIC KEY BLOCK——–

Tài liệu tham khảo

Kết luận

Khi thiết kế API cho clients sử dụng, nhiều khi dữ liệu truyền dữ clients và API có thể bị chôm và sử dụng vào mục đích chơi không đẹp (ko fair). Thì việc mã hóa thông tin truyền, nhận là một điều cần thiết. GPG là một phương pháp hợp lý, giải quyết được vấn đề.

Bài viết viết vội khi chuẩn bị đi xem trận chung kết lượt đi tại KUL, mong được các bạn, anh, chị cao nhân góp ý và chỉ giáo nếu thấy còn điều nào chưa đúng, chưa chuẩn.

TSN, 11Dec2018 – Việt Nam Chiến Thắng!!! 🇻🇳🇻🇳🇻🇳🇻🇳🇻🇳