(91) 350-9520 support@omarine.org M-F: 7 AM - 7 PM; Weekends: 9 AM - 5 PM

Thực hành mã hóa và ký kỹ thuật số

Mã hóa và ký kỹ thuật số thuộc về các hoạt động an toàn thông tin. Bạn cần có các cặp khóa công khai và khóa bí mật để sử dụng kỹ thuật mật mã khóa công khai. Bạn trao khóa công khai của mình cho bạn bè để họ mã hóa dữ liệu theo khóa công khai này rồi gửi cho bạn. Khi nhận được dữ liệu đã mã hóa, bạn dùng khóa bí mật của mình để giải mã và có được nội dung. Những người khác nếu nhận được dữ liệu đã mã hóa nhưng không có khóa bí mật tương ứng để giải mã, như thế không đọc được nội dung. Vấn đề thứ hai, dữ liệu gửi cần được “ký” bởi chủ nhân của dữ liệu. Chữ ký kỹ thuật số có hai tác dụng:

  • Xác thực chủ nhân dữ liệu.
  • Xác thực nội dung dữ liệu: bất cứ sự thay đổi dữ liệu trung gian nào nếu có đều phản ánh chữ ký không hợp lệ.

Người gửi/chủ nhân ký dữ liệu bằng khóa bí mật của mình và người nhận sử dụng khóa công khai của người gửi/chủ nhân để xác minh chữ ký. Trong thực hành dưới đây, cặp khóa dùng để mã hóa và cặp khóa dùng để ký là các cặp khóa khác nhau. Cặp khóa chính, yêu cầu phải có, dùng để ký, và cặp khóa phụ dùng để mã hóa. Để tạo các cặp khóa này, bạn thực hiện dòng lệnh sau


gpg2 --gen-key

Lệnh này đưa bạn qua các bước tương tác. Bước đầu tiên là chọn kiểu khóa với thuật toán mật mã khóa công khai được sử dụng. Thuật toán phải có khả năng để ký và mã hóa theo mục đích sử dụng. Nếu bạn muốn sử dụng đầy đủ mục đích thì lựa chọn mặc định là lựa chọn tốt, nhập vào ‘1’. Bước thứ hai là chọn chiều dài khóa theo bits, bạn lấy giá trị mặc định 2048, ấn Enter. Bước tiếp theo là chọn thời hạn của khóa, ví dụ chọn thời hạn 3 tháng thì bạn gõ vào 3m. Sau khi nhập tên người sử dụng, địa chỉ email và chú giải thì bạn có một chuỗi ký tự nhận dạng người sử dụng(uid) được ghép từ ba nội dung này. Ví dụ nếu tên người sử dụng là “Nguyen Van A”, địa chỉ email là “xyz@gmail.com”, chú giải là “My comment”, thì uidNguyen Van A (My comment) <xyz@gmail.com>”. Đó là chuỗi nhận dạng đầy đủ. Để chỉ ra một người sử dụng, nếu hệ thống của bạn có ít người sử dụng(khóa) thì đôi khi chỉ cần một chuỗi con của uid, chẳng hạn chỉ cần dùng tên, đó là “Nguyen Van A”, hoặc địa chỉ email- “xyz@gmail.com”. Bạn ấn ‘o’, Enter để chấp nhận nhập liệu và sang bước tiếp theo.

Bây giờ là bước quan trọng, bạn cung cấp cụm từ mật khẩu(passphrase) để bảo vệ khóa bí mật. Cụm từ mật khẩu phải thật khỏe. Hàm băm mật mã dù tốt và phương pháp mã hóa mật khẩu là an toàn nhưng mật khẩu vẫn có thể bị phá vỡ, không phải do tấn công tiền ảnh mà chỉ do bản thân mật khẩu quá yếu. Mật khẩu tài khoản người dùng(user account password) cũng cần mạnh thêm để bảo vệ thư mục cấu hình ~/.gnupg/”. Cuối cùng là bước tạo khóa, thời gian khoảng vài phút. Tại bước này bạn nên làm các động tác như gõ các phím, di chuyển chuột, thao tác đĩa để quá trình tạo các số ngẫu nhiên được tốt hơn. Kết quả tạo khóa có dạng như thế này


pub 2048R/951BB54E 2014-12-30 [expires: 2015-03-30]
Key fingerprint = F6B9 E4D1 FDB5 9A56 ADEE EBE0 A09F F799 951B B54E
uid [ultimate] Nguyen Van A (My comment) <xyz@gmail.com>
sub 2048R/31BF36DD 2014-12-30 [expires: 2015-03-30]

Chiều dài khóa là 2048 bits. Số nhận dạng khóa chính là 0x951BB54E, số nhận dạng khóa phụ là 0x31BF36DD. Các khóa chính và phụ khi mới được tạo ra có thời hạn như nhau, trong trường hợp này đều có hạn đến ngày 30-03-2015. Dấu vân tay của khóa chính là 0xF6B9E4D1FDB59A56ADEEEBE0A09FF799951BB54E. Các số nhận dạng khóa và dấu vân tay đều có thể chỉ ra người sử dụng như uid. Chúng ta đã biết rằng dấu vân tay là dấu hiệu tốt nhất để phân biệt người sử dụng. Kí hiệu [ultimate] bên cạnh uid cho biết mức tin tưởng cao nhất. Khóa được tạo ra bên trong hệ thống thì có mức tin tưởng cao nhất và dấu vân tay của nó được đặt trong tệp cơ sở dữ liệu tin tưởng trustdb.gpg trong thư mục cấu hình ~/.gnupg/”. Các khóa đến từ ngoài hệ thống mà chủ nhân của nó đáng tin cậy và được chứng nhận bởi hệ thống thì cũng có mặt trong cơ sở dữ liệu tin tưởng. Thông tin về kết quả tạo khóa bên trên không có dấu vân tay khóa phụ. Để hiển thị dấu vân tay khóa phụ, bạn dùng lệnh sau, ví dụ đối với “Nguyen Van A”


gpg2 --fingerprint --fingerprint “Nguyen Van A”

Lựa chọn --fingerprint nếu dùng một lần thì chỉ hiển thị dấu vân tay khóa chính. Thời hạn khóa chính được thay đổi bằng lệnh


gpg2 --edit-key “Nguyen Van A” expire

Để thay đổi thời hạn khóa phụ bạn phải chọn khóa phụ trước khi dùng lệnh con expire


gpg2 --edit-key “Nguyen Van A”
gpg> key 1
gpg> expire

Ký và mã hóa dữ liệu

Tuan muốn gửi cho Lan tệp tin message.doc. Tuan ký tệp tin này bằng khóa bí mật của mình và sử dụng khóa công khai của Lan để mã hóa tệp tin


gpg2 -se -u Tuan -r Lan message.doc

Dòng lệnh trên sẽ sinh ra một tệp tin đã ký và đã mã hóa là message.doc.gpg. Tuan gửi tệp tin này cho Lan. Khi nhận được tệp tin message.doc.gpg, Lan dùng khóa bí mật của mình để giải mã tệp tin và dùng khóa công khai của Tuan để xác minh chữ ký


gpg2 -d -o messaged.doc message.doc.gpg

Lệnh này sẽ sinh trở lại tệp tin message.doc cùng với thông báo chữ ký của Tuan được xác minh. Nếu chỉ cần ký mà không cần mã hóa tệp tin, Tuan có thể ký tệp tin message.doc dưới dạng tệp chữ ký tách rời, văn bản rõ


gpg2 -sba -u Tuan message.doc

Tệp tin chữ ký tách rời được sinh ra là message.doc.asc. Tuan phải gửi một cặp cả hai tệp tin message.docmessage.doc.asc. Ở đầu kia, khi nhận được cả hai tệp tin, Lan dùng khóa công khai của Tuan để xác minh chữ ký


gpg2 --verify message.doc.asc

Nếu bạn muốn ký một thông điệp và muốn công bố thông điệp đi cùng với chữ ký, bạn có thể ký dạng văn bản rõ mà gộp cả chữ ký vào thông điệp. Ví dụ Tuan ký xác nhận cho địa chỉ email user@example.com


echo user@example.com | gpg2 -u Tuan --clearsign

Chương trình gpg2 mặc định sử dụng thuật toán băm SHA-1 để ký. Chúng ta đã biết rằng các thuật toán SHA-2 an toàn hơn. Lệnh dưới đây sử dụng SHA-256


echo user@example.com | gpg2 --personal-digest-preferences SHA256 -u Tuan --clearsign

Văn bản kết xuất chứa nội dung địa chỉ email kèm theo chữ ký xác nhận bên dưới, có dạng


-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA256

user@example.com
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2

iQEcBAEBCAAGBQJUo9IMAAoJEF5dUnwhiK4p78gIAJ9bpe1eSXbFDMZYguaXCd5A
nYZ2IT6aCfjhAg5QUUd+v7xVJzWjZjuLcug0lns1yXC2JTSel2un+bZDpBFtfrnC
rdUGJ4D9cn6gYQ4uB8WJg4hB5g+zbYJqLVnHnFL1W9CKIM1901bW6in164Guin+n
Rny9UeqDDu1oWPyLT/AuFABbmBNH/K7Yb66PC1NOMyUrtU++4Fz6Fo6QM+U95EBY
QJ/KDqdJBCQ/cxRAqOg394VKIr88EDkkKTLOUBxGchHwRt0KagIReQXckIEwT4u/
dit1xwPxKgx2W/Uwi2yzSCsXeIG0t1k8n6mDt/0HQr2feMU7/slrJrS3/vNGoWk=
=MWBS
-----END PGP SIGNATURE----- 

Bạn có thể chép thông điệp đã ký để công bố hoặc lưu nó vào một tệp văn bản, ví dụ tệp signedemail.txt. Xác minh thông điệp như sau


gpg2 --verify signedemail.txt

hoặc


cat signedemail.txt | gpg2 --verify

Ký khóa

Một khóa dùng để ký dữ liệu, nhưng bản thân khóa đó phải đáng tin cậy và phải được ký bởi một người có tín nhiệm. Giả sử TuanLan đã tin tưởng nhau. Một người khác là Hai được Tuan tin tưởng nhưng Lan chưa biết Hai. Tuan ký vào khóa của Hai và đó là bằng chứng để Lan tin tưởng vào các dữ liệu do Hai


gpg2 -u Tuan --sign-key Hai

Sau khi ký khóa, bạn cập nhật cơ sở dữ liệu tin tưởng


gpg2 --update-trustdb

Một khóa cũng có thể được tin tưởng bằng lệnh “trust”, ví dụ Tuan tin tưởng Lan theo cách này


gpg2 --edit-key Lan trust

Lệnh này thay đổi giá trị tin tưởng chủ nhân cho khóa Lan, nhưng không ký vào khóa này. Khóa tin tưởng như thế chỉ có tác dụng trong nội bộ hệ thống.

Cơ sở dữ liệu tin tưởng được lưu dự phòng bằng cách xuất ra một tệp văn bản, ví dụ tệp otrust.txt


gpg2 --export-ownertrust > otrust.txt

Nhập khẩu cơ sở dữ liệu tin tưởng từ tệp otrust.txt


rm ~/.gnupg/trustdb.gpg
gpg2 --import-ownertrust < otrust.txt

Một số lệnh thường dùng khác

Xem danh sách tất cả các khóa từ chùm khóa công khai(public keyrings)


gpg2 -k

Xem danh sách các khóa từ chùm khóa công khai chỉ riêng đối với khóa Lan


gpg2 -k Lan

Xem danh sách tất cả các khóa từ chùm khóa bí mật(secret keyrings)


gpg2 -K

Xem danh sách các khóa từ chùm khóa bí mật chỉ riêng đối với khóa Lan


gpg2 -K Lan

Xuất khẩu khóa công khai của Tuan ra tệp tuanpubkey


gpg2 --export --armor -o tuanpubkey Tuan

hoặc


gpg2 --export --armor Tuan > tuanpubkey

Nhập khẩu khóa công khai của Lan từ tệp lanpubkey


gpg2 --import lanpubkey

Xóa khóa bí mật của một người sử dụng xyz


gpg2 --delete-secret-key xyz

Xóa khóa công khai của một người sử dụng xyz


gpg2 --delete-key xyz

Thay đổi cụm từ mật khẩu cho Tuan


gpg2 --passwd Tuan

Xác minh tệp tin có khóa công khai đặt tại keyserver

Giả sử bạn đã tải về tệp mã nguồn llvm-3.5.0.src.tar.xz và tệp chữ ký tách rời dạng nhị phân của nó là llvm-3.5.0.src.tar.xz.sig. Bạn xác minh tệp tin này


gpg2 --verify llvm-3.5.0.src.tar.xz.sig
gpg: Signature made Wed 03 Sep 2014 07:32:32 AM ICT using RSA key ID BB5A0569
gpg: Can't check signature: No public key

Kết quả cho biết tệp được ký với khóa có số nhận dạng là 0xBB5A0569, và không kiểm tra được chữ ký do không có khóa công khai. Bây giờ bạn sử dụng một keyserver để nhập khẩu khóa. Trong tệp cấu hình ~/.gnupg/gpg.conf có một dòng như thế này

keyserver hkp://keys.gnupg.net

Cấu hình đã chỉ định keyserver mặc định nên bạn chỉ cần thực hiện lệnh sau đây để nhập khẩu khóa


gpg2 --recv-keys 0xBB5A0569 

Tuy nhiên chúng ta nên chỉ ra keyserver tường minh


gpg2 --keyserver hkp://keys.gnupg.net --recv-keys 0xBB5A0569
gpg: requesting key BB5A0569 from hkp server keys.gnupg.net
gpg: key BB5A0569: public key "Bill Wendling <void@llvm.org>" imported
gpg: Total number processed: 1
gpg: imported: 1 (RSA: 1)

Bây giờ đã có khóa bạn thực hiện xác minh lại


gpg2 --verify llvm-3.5.0.src.tar.xz.sig
gpg: Signature made Wed 03 Sep 2014 07:32:32 AM ICT using RSA key ID BB5A0569
gpg: Good signature from "Bill Wendling <void@llvm.org>" [unknown]
gpg: WARNING: This key is not certified with a trusted signature!
gpg: There is no indication that the signature belongs to the owner.
Primary key fingerprint: 54E3 BDE3 3185 D9F6 9664 D224 55F5 CD70 BB5A 0569

Thông báo cho biết kết quả xác minh chữ ký từ khóa là tốt nhưng hệ thống quản lý khóa của bạn chưa biết khóa, chưa có chữ ký tin tưởng để chứng thực cho khóa này. Nếu bạn mới thiết lập hệ thống khóa thì cảnh báo như trên sẽ xảy ra đối với tất cả các trường hợp như vậy, kể cả đối với khóa đã có tín nhiệm rộng rãi hoặc ngay như trong trường hợp này chúng ta đã nhập khóa từ một keyserver cụ thể. Nếu tin tưởng khóa này bạn có thể ký khóa và cập nhật cơ sở dữ liệu tin tưởng hoặc đặt giá trị tin tưởng chủ nhân cho nó. Nếu bạn đặt giá trị tin tưởng chủ nhân ở mức cao nhất cho khóa thì kết quả xác minh lại sẽ như thế này


gpg2 --verify llvm-3.5.0.src.tar.xz.sig
gpg: Signature made Wed 03 Sep 2014 07:32:32 AM ICT using RSA key ID BB5A0569
gpg: Good signature from "Bill Wendling <void@llvm.org>" [ultimate]

Xác minh chứng chỉ thẩm định CA-Certificates

Các chứng chỉ CA-Certificates có thể được xác minh sử dụng openssl như dưới đây


openssl verify /etc/ssl/certs/*.{pem,crt}

hoặc xác minh sâu hơn với các lựa chọn bổ sung


openssl verify -issuer_checks -explicit_policy /etc/ssl/certs/*.{pem,crt}

Lỗi phát hiện qua xác minh như thế thường không phải là hiếm, ví dụ


error 18 at 0 depth lookup:self signed certificate
error 20 at 0 depth lookup:unable to get local issuer certificate
error 10 at 0 depth lookup:certificate has expired
error 29 at 0 depth lookup:subject issuer mismatch
error 43 at 0 depth lookup:no explicit policy
Advertisements

Gửi phản hồi

%d bloggers like this: