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ì uid là “Nguyen 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.doc và message.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ử Tuan và Lan đã 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 ký
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