Thứ sáu, 08/06/2018 | 00:00 GMT+7

Cách xác minh mã và mã hóa dữ liệu bằng Python-GnuPG và Python 3

Gói GnuPG cung cấp một giải pháp hoàn chỉnh để tạo và lưu trữ các khóa mật mã. Nó cũng cho phép bạn mã hóa và ký dữ liệu và giao tiếp.

Trong hướng dẫn này, bạn sẽ tạo một loạt các tập lệnh sử dụng Python 3 với module python-gnupg . Các tập lệnh này sẽ cho phép bạn ký và mã hóa nhiều file cũng như xác minh tính toàn vẹn của một tập lệnh trước khi chạy nó.

Yêu cầu

Trước khi tiếp tục với hướng dẫn này, hãy hoàn thành các yêu cầu sau:

Bước 1 - Lấy thông tin về cặp khóa

Sau khi hoàn thành hướng dẫn GnuPG trong yêu cầu , bạn sẽ có một cặp khóa được lưu trữ trong .gnupg trong folder chính của bạn. GnuPG lưu trữ các khóa bằng tên user và e-mail để giúp xác định các cặp khóa. Trong ví dụ này, tên user của ta là sammy và địa chỉ e-mail của ta là sammy@example.com .

Chạy lệnh dưới đây để nhận danh sách các khóa khả dụng của bạn:

  • gpg --list-keys
Output
/home/sammy/.gnupg/pubring.gpg ----------------------------- pub 2048R/4920B23F 2018-04-23 uid Sammy <sammy@example.com> sub 2048R/50C06279 2018-04-23

Ghi lại địa chỉ e-mail được hiển thị trong hàng uid của kết quả của bạn. Bạn cần nó sau này để xác định key của bạn .

Bước 2 - Cài đặt Python-GnuPG và các file ký

Với các khóa của bạn tại chỗ, bạn có thể cài đặt module python-gnupg , hoạt động như một shell bọc xung quanh GnuPG để cho phép tương tác giữa GnuPG và Python 3. Sử dụng module này, bạn có thể tạo các tập lệnh Python thực hiện những việc sau:

  • Tạo chữ ký riêng biệt cho file , thêm một lớp bảo mật cho quy trình chữ ký bằng cách tách chữ ký khỏi file .
  • Mã hóa file .
  • Giải mã các file .
  • Xác minh chữ ký và tập lệnh tách rời.

Bạn sẽ tạo các tập lệnh trước, cùng với một số file thử nghiệm, trước khi chuyển sang kiểm tra các tập lệnh trên các file này.

Để bắt đầu, hãy cài đặt module python-gnupg , cùng với gói fs , cho phép bạn mở, đọc và ghi các file thử nghiệm của bạn . Cập nhật index gói của bạn và cài đặt các gói này bằng pip :

  • sudo apt-get update
  • sudo pip3 install python-gnupg fs

Với các gói này, ta có thể chuyển sang tạo các tập lệnh và file thử nghiệm.

Để lưu trữ các tập lệnh và file thử nghiệm, hãy tạo một folder trong folder chính của bạn có tên là python-test :

  • cd ~/
  • mkdir python-test

Di chuyển đến folder này:

  • cd python-test/

Tiếp theo, hãy tạo ba file thử nghiệm:

  • echo "This is the first test file" > test1.txt
  • echo "print('This test file is a Python script')" > test2.py
  • echo "This is the last test file" > test3.txt

Để tạo chữ ký riêng biệt cho các file thử nghiệm của ta , hãy tạo một tập lệnh có tên signdetach.py , tập lệnh này sẽ nhắm đến tất cả các file trong folder nơi nó được thực thi. Chữ ký đóng role như một dấu thời gian và xác nhận tính xác thực của tài liệu.

Các chữ ký tách rời sẽ được lưu trữ trong một folder mới có tên là signatures/ , sẽ được tạo khi tập lệnh chạy.

Mở một file mới có tên signdetach.py bằng nano hoặc editor yêu thích của bạn:

  • nano signdetach.py

Đầu tiên, hãy nhập tất cả các module cần thiết cho tập lệnh. Chúng bao gồm các osfs gói, cho phép chuyển hướng file , và gnupg :

~ / python-test / signdetach.py
#!/usr/bin/env python3  import os import fs from fs import open_fs import gnupg 

Bây giờ hãy đặt folder nơi GnuPG sẽ tìm thấy các khóa mã hóa của nó. GnuPG lưu trữ các khóa của nó trong .gnupg theo mặc định, vì vậy hãy cấu hình điều này bằng tên user của ta . Đảm bảo thay sammy bằng tên của user không phải root của bạn:

~ / python-test / signdetach.py
... gpg = gnupg.GPG(gnupghome="/home/sammy/.gnupg") 

Tiếp theo, hãy tạo một biến home_fs để lưu trữ vị trí folder hiện tại dưới dạng một đối tượng file . Điều này sẽ giúp tập lệnh có thể hoạt động trong folder nơi nó được thực thi:

~ / python-test / signdetach.py
... home_fs = open_fs(".") 

Bây giờ tập lệnh của bạn sẽ giống như sau:

~ / python-test / signdetach.py
#!/usr/bin/env python3  import os import fs from fs import open_fs import gnupg  gpg = gnupg.GPG(gnupghome="/home/sammy/.gnupg") home_fs = open_fs(".") 

đoạn cấu hình này là mẫu cơ bản mà bạn sẽ sử dụng trong các tập lệnh của bạn khi chuyển qua hướng dẫn này.

Tiếp theo, thêm mã để kiểm tra xem có một folder tên là signatures/ và tạo nó nếu nó không tồn tại:

~ / python-test / signdetach.py
... if os.path.exists("signatures/"):         print("Signatures directory already created") else:         home_fs.makedir(u"signatures")         print("Created signatures directory") 

Tạo một mảng trống để lưu trữ các tên file , sau đó quét folder hiện tại, nối tất cả các tên file vào mảng files_dir :

~ / python-test / signdetach.py
... files_dir = []  files = [f for f in os.listdir(".") if os.path.isfile(f)] for f in files:     files_dir.append(f) 

Điều tiếp theo mà tập lệnh sẽ làm là tạo các chữ ký riêng biệt cho các file . files_dir lặp qua mảng files_dir sẽ tạo chữ ký cho mỗi file bằng cách sử dụng private key đầu tiên trên chuỗi khóa của bạn. Để truy cập private key , bạn cần mở khóa bằng passphrase (password bảo vệ) bạn đã đặt. Thay thế "my passphrase" bằng passphrase (password bảo vệ) bạn đã sử dụng khi tạo cặp khóa trong yêu cầu :

~ / python-test / signdetach.py
... for x in files_dir:     with open(x, "rb") as f:         stream = gpg.sign_file(f,passphrase="my passphrase",detach = True, output=files_dir[files_dir.index(x)]+".sig")         os.rename(files_dir[files_dir.index(x)]+".sig", "signatures/"+files_dir[files_dir.index(x)]+".sig")         print(x+" ", stream.status) 

Khi hoàn tất, tất cả các chữ ký sẽ được chuyển vào folder signatures/ . Tập lệnh đã hoàn thành của bạn sẽ giống như sau:

~ / python-test / signdetach.py
 #!/usr/bin/env python3  import os import fs from fs import open_fs import gnupg  gpg = gnupg.GPG(gnupghome="/home/sammy/.gnupg") home_fs = open_fs(".")  if os.path.exists("signatures/"):     print("Signatures directory already created") else:     home_fs.makedir(u"signatures")     print("Created signatures directory")  files_dir = []  files = [f for f in os.listdir(".") if os.path.isfile(f)] for f in files:     files_dir.append(f)  for x in files_dir:     with open(x, "rb") as f:         stream = gpg.sign_file(f,passphrase="my passphrase",detach = True, output=files_dir[files_dir.index(x)]+".sig")         os.rename(files_dir[files_dir.index(x)]+".sig", "signatures/"+files_dir[files_dir.index(x)]+".sig")         print(x+" ", stream.status)  

Bây giờ ta có thể chuyển sang mã hóa file .

Bước 3 - Mã hóa file

Việc thực thi tập lệnh mã hóa trong một folder sẽ khiến tất cả các file trong folder đó được sao chép và mã hóa trong một folder mới được gọi là đã encrypted/ . Khóa công khai được sử dụng để mã hóa file là khóa tương ứng với e-mail bạn đã chỉ định trong cấu hình cặp khóa của bạn .

Mở một file mới được gọi là encryptfiles.py :

  • nano encryptfiles.py

Đầu tiên, nhập tất cả các module được yêu cầu, đặt folder chính của GnuPG và tạo biến folder làm việc hiện tại:

~ / python-test / Encryptfiles.py
#!/usr/bin/env python3  import os import fs from fs import open_fs import gnupg  gpg = gnupg.GPG(gnupghome="/home/sammy/.gnupg") home_fs = open_fs(".") 

Tiếp theo, hãy thêm mã để kiểm tra xem folder hiện tại đã có folder được gọi là encrypted/ hay chưa và để tạo nếu folder đó không tồn tại:

~ / python-test / Encryptfiles.py
... if os.path.exists("encrypted/"):         print("Encrypt directory exists") else:         home_fs.makedir(u"encrypted")         print("Created encrypted directory") 

Trước khi tìm kiếm file để mã hóa, hãy tạo một mảng trống để lưu tên file :

~ / python-test / Encryptfiles.py
... files_dir = [] 

Tiếp theo, tạo một vòng lặp để quét folder tìm file và nối chúng vào mảng:

~ / python-test / Encryptfiles.py
... files = [f for f in os.listdir(".") if os.path.isfile(f)] for f in files:     files_dir.append(f) 

Cuối cùng, hãy tạo một vòng lặp để mã hóa tất cả các file trong folder . Khi hoàn tất, tất cả các file được mã hóa sẽ được chuyển vào folder encrypted/ . Trong ví dụ này, sammy@example.com là ID e-mail cho khóa để sử dụng trong quá trình mã hóa. Đảm bảo thay thế địa chỉ này bằng địa chỉ e-mail bạn đã ghi ở bước 1:

~ / python-test / Encryptfiles.py
... for x in files_dir:     with open(x, "rb") as f:         status = gpg.encrypt_file(f,recipients=["sammy@example.com"],output= files_dir[files_dir.index(x)]+".gpg")         print("ok: ", status.ok)         print("status: ", status.status)         print("stderr: ", status.stderr)         os.rename(files_dir[files_dir.index(x)] + ".gpg", 'encrypted/' +files_dir[files_dir.index(x)] + ".gpg") 

Nếu bạn có nhiều khóa được lưu trữ trong folder .gnupg và muốn sử dụng một public key cụ thể hoặc nhiều public key để mã hóa, bạn cần sửa đổi mảng recipients bằng cách thêm người nhận bổ sung hoặc thay thế người nhận hiện tại.

encryptfiles.py tập lệnh encryptfiles.py của bạn sẽ trông như thế này khi bạn hoàn tất:

~ / python-test / Encryptfiles.py
 #!/usr/bin/env python3  import os import fs from fs import open_fs import gnupg  gpg = gnupg.GPG(gnupghome="/home/sammy/.gnupg") home_fs = open_fs(".")  if os.path.exists("encrypted/"):     print("Encrypt directory exists") else:     home_fs.makedir(u"encrypted")     print("Created encrypted directory")  files_dir = []  files = [f for f in os.listdir(".") if os.path.isfile(f)] for f in files:     files_dir.append(f)  for x in files_dir:     with open(x, "rb") as f:         status = gpg.encrypt_file(f,recipients=["sammy@example.com"],output= files_dir[files_dir.index(x)]+".gpg")         print("ok: ", status.ok)         print("status: ", status.status)         print("stderr: ", status.stderr)         os.rename(files_dir[files_dir.index(x)] + ".gpg", "encrypted/" +files_dir[files_dir.index(x)] + ".gpg")  

Bây giờ ta hãy xem xét phần thứ hai của quá trình: giải mã và xác minh nhiều file cùng một lúc.

Bước 4 - Giải mã file

Tập lệnh giải mã hoạt động giống như tập lệnh mã hóa, ngoại trừ việc nó được thực thi trong một folder encrypted/ . Khi chạy , decryptfiles.py trước tiên sẽ xác định public key được sử dụng và sau đó tìm kiếm private key tương ứng trong folder .gnupg để giải mã file . Các file được decrypted/ sẽ được lưu trữ trong một folder mới có tên là decrypted/ .

Mở một file mới có tên decryptfiles.py bằng nano hoặc editor bạn quen dùng :

  • nano decryptfiles.py

Bắt đầu bằng cách chèn cài đặt cấu hình:

~ / python-test / decryptfiles.py
#!/usr/bin/env python3  import os import fs from fs import open_fs import gnupg  gpg = gnupg.GPG(gnupghome="/home/sammy/.gnupg") home_fs = open_fs(".") 

Tiếp theo, tạo hai mảng trống để lưu trữ dữ liệu trong quá trình thực thi tập lệnh:

~ / python-test / decryptfiles.py
... files_dir = [] files_dir_clean = [] 

Mục tiêu ở đây là để tập lệnh đặt các file được giải mã vào folder riêng của chúng; nếu không, các file được mã hóa và được giải mã sẽ bị trộn lẫn, gây khó khăn cho việc xác định một file được giải mã cụ thể. Để giải quyết vấn đề này, bạn có thể thêm mã sẽ quét folder hiện tại để xem liệu có tồn tại một folder decrypted/ không, tạo mã nếu không có:

~ / python-test / decryptfiles.py
... if os.path.exists("decrypted/"):     print("Decrypted directory already exists") else:     home_fs.makedir(u"decrypted/")     print("Created decrypted directory") 

Quét qua folder và nối tất cả các tên file vào mảng files_dir :

~ / python-test / decryptfiles.py
... files = [f for f in os.listdir(".") if os.path.isfile(f)] for f in files:     files_dir.append(f) 

Tất cả các file được mã hóa đều có phần mở rộng .gpg được thêm vào tên file của chúng để cho biết rằng chúng đã được mã hóa. Tuy nhiên, khi giải mã chúng, ta muốn lưu chúng mà không có tiện ích mở rộng này, vì chúng không được mã hóa nữa.

Để thực hiện việc này, hãy lặp qua mảng files_dir và xóa phần mở rộng .gpg khỏi mỗi tên file :

~ / python-test / decryptfiles.py
...     for x in files_dir:             length = len(x)             endLoc = length - 4             clean_file = x[0:endLoc]             files_dir_clean.append(clean_file) 

Các tên file mới được "làm sạch" được lưu trữ trong mảng file_dir_clean .

Tiếp theo, hãy lặp lại các file và giải mã chúng. Thay thế "my passphrase" bằng passphrase (password bảo vệ) của bạn để mở private key :

~ / python-test / decryptfiles.py
... for x in files_dir:     with open(x, "rb") as f:        status = gpg.decrypt_file(f, passphrase="my passphrase",output=files_dir_clean[files_dir.index(x)])        print("ok: ", status.ok)        print("status: ", status.status)        print("stderr: ", status.stderr)        os.rename(files_dir_clean[files_dir.index(x)], "decrypted/" + files_dir_clean[files_dir.index(x)]) 

Tệp script của bạn sẽ trông như thế này khi bạn hoàn thành:

~ / python-test / decryptfiles.py
 #!/usr/bin/env python3  import os import fs from fs import open_fs import gnupg  gpg = gnupg.GPG(gnupghome="/home/sammy/.gnupg") home_fs = open_fs(".")  files_dir = [] files_dir_clean = []  if os.path.exists("decrypted/"):     print("Decrypted directory already exists") else:     home_fs.makedir(u"decrypted/")     print("Created decrypted directory")  files = [f for f in os.listdir(".") if os.path.isfile(f)] for f in files:     files_dir.append(f)  for x in files_dir:     length = len(x)     endLoc = length - 4     clean_file = x[0:endLoc]     files_dir_clean.append(clean_file)  for x in files_dir:     with open(x, "rb") as f:        status = gpg.decrypt_file(f, passphrase="my passphrase",output=files_dir_clean[files_dir.index(x)])        print("ok: ", status.ok)        print("status: ", status.status)        print("stderr: ", status.stderr)        os.rename(files_dir_clean[files_dir.index(x)], "decrypted/" + files_dir_clean[files_dir.index(x)]) 

Với tập lệnh giải mã của ta tại chỗ, ta có thể chuyển sang xác minh các chữ ký riêng biệt cho nhiều file .

Bước 5 - Xác minh Chữ ký tách rời

Để xác minh các chữ ký điện tử tách rời của nhiều file , hãy viết một tập lệnh verifydetach.py . Tập lệnh này sẽ tìm kiếm signatures/ folder trong folder làm việc và xác minh từng file bằng chữ ký của nó.

Mở một file mới có tên verifydetach.py :

  • nano verifydetach.py

Nhập tất cả các thư viện cần thiết, đặt folder làm việc và folder chính và tạo mảng files_dir trống, như trong các ví dụ trước:

~ / python-test / verifydetach.py
#!/usr/bin/env python3  import os import fs from fs import open_fs import gnupg  gpg = gnupg.GPG(gnupghome="/home/sammy/.gnupg") home_fs = open_fs(".")  files_dir = []     

Tiếp theo, hãy quét folder chứa các file mà ta muốn xác minh. Tên file sẽ được nối vào mảng files_dir trống:

~ / python-test / verifydetach.py
... files = [f for f in os.listdir(".") if os.path.isfile(f)] for f in files: files_dir.append(f) 

Cuối cùng, hãy xác minh từng file bằng chữ ký riêng biệt của nó, sử dụng một vòng lặp di chuyển qua mảng files_dir để tìm kiếm chữ ký đã tách rời của mỗi file trong signatures/ folder . Khi nó tìm thấy chữ ký tách rời, nó sẽ xác minh file với nó. Dòng cuối cùng in ra trạng thái xác minh của từng file :

~ / python-test / verifydetach.py
... for i in files_dir:      with open("../../signatures/" + i + ".sig", "rb") as f:          verify = gpg.verify_file(f, i)          print(i + " ", verify.status) 

Khi bạn hoàn thành, tập lệnh của bạn sẽ giống như sau:

~ / python-test / verifydetach.py
 #!/usr/bin/env python3  import os import fs from fs import open_fs import gnupg  gpg = gnupg.GPG(gnupghome="/home/sammy/.gnupg") home_fs = open_fs(".")  files_dir = []     files = [f for f in os.listdir(".") if os.path.isfile(f)] for f in files:     files_dir.append(f)  for i in files_dir:     with open("../../signatures/" + i + ".sig", "rb") as f:         verify = gpg.verify_file(f, i)         print(i + " ", verify.status) 

Tiếp theo, hãy xem qua cách xác minh chữ ký của một file trước khi nó được thực thi trên server của bạn.

Bước 6 - Xác minh file

Tập lệnh cuối cùng sẽ xác minh các tập lệnh trước khi chúng được thực thi. Theo nghĩa này, nó tương tự như verifydetach , nhưng nó có thêm khả năng chạy các tập lệnh đã được xác minh. Nó hoạt động bằng cách lấy tên của một tập lệnh làm đối số và sau đó xác minh chữ ký của file đó. Nếu xác minh thành công, tập lệnh sẽ đăng thông báo lên console và chạy tập lệnh đã xác minh. Nếu quá trình xác minh không thành công, tập lệnh sẽ đăng lỗi lên console và hủy thực thi file .

Tạo một file mới có tên verifyfile.py :

  • nano verifyfile.py

Đầu tiên hãy nhập các thư viện cần thiết và đặt các folder hoạt động:

~ / python-test / verifyfile.py
#!/usr/bin/env python3  import os import fs from fs import open_fs import gnupg  gpg = gnupg.GPG(gnupghome="/home/sammy/.gnupg") home_fs = open_fs(".") 

Để tập lệnh hoạt động, cần phải lưu trữ tên của file để xác minh và thực thi. Để làm điều này, hãy tạo một biến mới có tên script_to_run :

~ / python-test / verifyfile.py
... script_to_run = str(sys.argv[1]) 

Biến này nhận đối số đầu tiên và lưu trữ nó trong biến mới tạo. Tiếp theo, tập lệnh sẽ mở file chữ ký tách rời, xác minh file trong script_to_run bằng chữ ký của nó và sau đó thực thi nó nếu nó vượt qua xác minh:

~ / python-test / verifyfile.py
... with open("../../signatures/" + script_to_run + ".sig", "rb") as f:      verify = gpg.verify_file(f, script_to_run)      print(script_to_run + " ", verify.status)      if verify.status == "signature valid":           print("Signature valid, launching script...")           exec(open(script_to_run).read())      else:            print("Signature invalid or missing, ")            print("aborting script execution") 

Tập lệnh đã hoàn thành sẽ giống như sau:

~ / python-test / verifyfile.py
 #!/usr/bin/env python3  import os import sys import fs from fs import open_fs import gnupg  gpg = gnupg.GPG(gnupghome="/home/sammy/.gnupg") home_fs = open_fs(".")  script_to_run = str(sys.argv[1])  with open("../../signatures/" + script_to_run + ".sig", "rb") as f:     verify = gpg.verify_file(f, script_to_run)     print(script_to_run + " ", verify.status)     if verify.status == "signature valid":         print("Signature valid, launching script...")         exec(open(script_to_run).read())     else:         print("Signature invalid or missing, ")         print("aborting script execution") 

Ta đã hoàn tất việc tạo các tập lệnh, nhưng hiện tại chúng chỉ có thể được chạy từ trong folder hiện tại. Trong bước tiếp theo, ta sẽ sửa đổi quyền của họ để làm cho họ có thể truy cập trên phạm vi global .

Bước 7 - Làm cho các tập lệnh có sẵn trên toàn hệ thống

Để dễ sử dụng, hãy làm cho các tập lệnh có thể thực thi được từ bất kỳ folder hoặc folder nào trên hệ thống và đặt chúng trong $PATH của ta . Sử dụng chmod để cấp quyền thực thi cho chủ sở hữu file , user không phải root của bạn:

  • chmod +x *.py

Bây giờ để tìm cài đặt $PATH của bạn, hãy chạy lệnh sau:

  • echo $PATH
Output
-bash: /home/sammy/bin:/home/sammy/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin

Các file được lưu trữ trong $PATH của bạn có thể truy cập được từ bất kỳ folder nào trong hệ thống của bạn, nếu quyền của folder cho phép. Bạn có thể đặt các tập lệnh của bạn ở bất kỳ đâu trong $PATH , nhưng bây giờ hãy di chuyển các tập lệnh từ folder python-test/ sang /usr/local/bin/ .

Lưu ý ta đang loại bỏ phần mở rộng .py khi sao chép các file . Nếu bạn nhìn vào dòng đầu tiên của các tập lệnh mà ta đã tạo, bạn sẽ thấy #!usr/bin/env python3 . Dòng này được gọi là shebang và nó giúp hệ điều hành xác định trình thông dịch bash hoặc môi trường để sử dụng khi thực thi mã. Khi ta thực thi tập lệnh, hệ điều hành sẽ lưu ý ta đã chỉ định Python làm môi trường của ta và sẽ chuyển mã cho Python để thực thi. Điều này nghĩa là ta không còn cần phần mở rộng file để giúp xác định môi trường mà ta muốn làm việc:

  • sudo mv encryptfiles.py /usr/local/bin/encryptfiles
  • sudo mv decryptfiles.py /usr/local/bin/decryptfiles
  • sudo mv signdetach.py /usr/local/bin/signdetach
  • sudo mv verifyfile.py /usr/local/bin/verifyfile
  • sudo mv verifydetach.py /usr/local/bin/verifydetach

Như vậy, các tập lệnh có thể được thực thi ở bất kỳ đâu trong hệ thống bằng cách chỉ cần chạy tên tập lệnh cùng với bất kỳ đối số nào mà tập lệnh có thể lấy từ dòng lệnh. Trong bước tiếp theo, ta sẽ xem xét một số ví dụ về cách sử dụng các tập lệnh này.

Bước 8 - Kiểm tra tập lệnh

Bây giờ ta đã chuyển các tập lệnh sang $PATH , ta có thể chạy chúng từ bất kỳ folder nào trên server .

Trước tiên, hãy kiểm tra xem bạn có còn đang làm việc trong folder python-test bằng lệnh pwd :

  • pwd

Đầu ra phải là:

Output
/home/sammy/python-test

Bạn đã tạo ba file thử nghiệm trước đó trong hướng dẫn. Chạy ls -l để liệt kê các file trong folder :

  • ls -l

Bạn sẽ thấy ba file được lưu trữ trong folder python-test của bạn :

Output
-rw-rw-r-- 1 sammy sammy 15 Apr 15 10:08 test1.txt -rwxrwxr-x 1 sammy sammy 15 Apr 15 10:08 test2.py -rw-rw-r-- 1 sammy sammy 15 Apr 15 10:08 test3.txt

Ta sẽ kiểm tra các tập lệnh trên ba file này. Bạn có thể nhanh chóng hiển thị nội dung của các file trước khi mã hóa bằng lệnh cat , như sau:

  • cat test1.txt
Output
This is the first test file

Hãy bắt đầu bằng cách tạo chữ ký riêng cho tất cả các file . Để thực hiện việc này, hãy thực thi tập lệnh signdetach từ trong folder hiện tại:

  • signdetach
Output
Created signatures directory test2.py signature created test1.txt signature created test3.txt signature created

Lưu ý trong kết quả rằng tập lệnh đã phát hiện thấy signatures/ folder không có mặt và tạo ra nó. Sau đó, nó tạo ra các chữ ký file .

Ta có thể xác nhận điều này bằng cách chạy lại ls -l :

  • ls -l
Output
total 16 drwxrwxr-x 2 sammy sammy 4096 Apr 21 14:11 signatures -rw-rw-r-- 1 sammy sammy 15 Apr 15 10:08 test1.txt -rwxrwxr-x 1 sammy sammy 15 Apr 15 10:08 test2.py -rw-rw-r-- 1 sammy sammy 15 Apr 15 10:08 test3.txt

Lưu ý folder signatures mới trong số các mục trong danh sách. Hãy liệt kê nội dung của folder này và xem xét kỹ hơn một trong các chữ ký.

Để liệt kê tất cả các chữ ký, hãy nhập:

  • ls -l signatures/
Output
total 12 -rw-rw-r-- 1 sammy sammy 473 Apr 21 14:11 test1.txt.sig -rw-rw-r-- 1 sammy sammy 473 Apr 21 14:11 test2.py.sig -rw-rw-r-- 1 sammy sammy 473 Apr 21 14:11 test3.txt.sig

Các file chữ ký tách rời có thể được xác định bằng phần mở rộng .sig . , lệnh cat có thể hiển thị nội dung của một trong những chữ ký này. Hãy cùng xem nội dung của signature test1.txt.sig :

  • cat signatures/test1.txt.sig
Output
-----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQEcBAABAgAGBQJa20aGAAoJENVtx+Y8cX3mMhMH+gOZsLJX3aEgUPZzDlKRWYec AyrXEGp5yIABj7eoLDKGUxftwGt+c4HZud1iEUy8AhtW/Ea6eRlMFPTso2hb9+cw /MyffTrWGpa0AGjNvf4wbxdq7TNpAlw4nmcwKpeYqkUu2fP3c18oZ3G3R3+P781w GWori9FK3eTyVPs9E0dVgdo7S8G1pF/ECo8Cl4Mrj80rERAitQAMbSaN/dF0wUKu okRZPJPVjd6GwqRRkXoqwh0vm4c+p3nAhFV+v7uK2BOUIJKPFbbn58vmmn+LVaBS MFWSb+X85KwwftIezqCV/hqsMKAuhkvfIi+YQFCDXElJMtjPBxxuvZFjQFjEHe8= =4NB5 -----END PGP SIGNATURE-----

Đầu ra này là chữ ký tách rời cho test1.txt .

Với các chữ ký tại chỗ, bạn có thể chuyển sang mã hóa các file của bạn . Để làm điều này, hãy thực thi tập lệnh mã encryptfiles :

  • encryptfiles
Output
Created encrypted directory ok: True status: encryption ok stderr: [GNUPG:] BEGIN_ENCRYPTION 2 9 [GNUPG:] END_ENCRYPTION ok: True status: encryption ok stderr: [GNUPG:] BEGIN_ENCRYPTION 2 9 [GNUPG:] END_ENCRYPTION ok: True status: encryption ok stderr: [GNUPG:] BEGIN_ENCRYPTION 2 9 [GNUPG:] END_ENCRYPTION

Từ kết quả , lưu ý tập lệnh đã tạo folder encrypted/ . Cũng lưu ý tất cả các file đã được mã hóa thành công. Chạy lại ls -l và nhận thấy folder mới trong folder :

  • ls -l
Output
total 20 drwxrwxr-x 2 sammy sammy 4096 Apr 21 14:42 encrypted drwxrwxr-x 2 sammy sammy 4096 Apr 21 14:11 signatures -rw-rw-r-- 1 sammy sammy 15 Apr 15 10:08 test1.txt -rw-rw-r-- 1 sammy sammy 15 Apr 15 10:08 test2.py -rw-rw-r-- 1 sammy sammy 15 Apr 15 10:08 test3.txt

Hãy xem thông báo trong test1.txt trông như thế nào khi nó đã được mã hóa:

  • cat encrypted/test1.txt.gpg
Output
-----BEGIN PGP MESSAGE----- Version: GnuPG v1 hQEMA9Vtx+Y8cX3mAQf9FijeaCOKFRUWOrwOkUw7efvr5uQbSnxxbE/Dkv0y0w8S Y2IxQPv4xS6VrjhZQC6K2R968ZQDvd+XkStKfy6NJLsfKZM+vMIWiZmqJmKxY2OT 8MG/b9bnNCORRI8Nm9etScSYcRu4eqN7AeUdWOXAFX+mo7K00IdEQH+0Ivyc+P1d 53WBgWstt8jHY2cn1sLdoHh4m70O7v1rnkHOvrQW3AAsBbKzvdzxOa0/5IKGCOYF yC8lEYfOihyEetsasx0aDDXqrMZVviH3KZ8vEiH2n7hDgC5imgJTx5kpC17xJZ4z LyEiNPu7foWgVZyPzD2jGPvjW8GVIeMgB+jXsAfvEdJJAQqX6qcHbf1SPSRPJ2jU GX5M/KhdQmBcO9Sih9IQthHDXpSbSVw/UejheVfaw4i1OX4aaOhNJlnPSUDtlcl4 AUoBjuBpQMp4RQ== =xJST -----END PGP MESSAGE-----

Câu được lưu trữ trong file root đã được chuyển đổi thành một chuỗi ký tự và số phức tạp do kết quả của quá trình mã hóa.

Bây giờ các file đã được ký và mã hóa, bạn có thể xóa các file root và khôi phục các thư root từ các file được mã hóa.

Để xóa bản root , hãy nhập:

  • rm *.txt *.py

Chạy lại ls -l đảm bảo rằng tất cả các file root đã bị xóa:

  • ls -l
Output
total 8 drwxrwxr-x 2 sammy sammy 4096 Apr 21 14:42 encrypted drwxrwxr-x 2 sammy sammy 4096 Apr 21 14:11 signatures

Với các file root đã biến mất, hãy giải mã và xác minh các file được mã hóa. Thay đổi vào folder encrypted và liệt kê tất cả các file :

  • cd encrypted/ && ls -l
Output
total 12 -rw-rw-r-- 1 sammy sammy 551 Apr 21 14:42 test1.txt.gpg -rw-rw-r-- 1 sammy sammy 551 Apr 21 14:42 test2.py.gpg -rw-rw-r-- 1 sammy sammy 551 Apr 21 14:42 test3.txt.gpg

Để giải mã các file , hãy chạy tập lệnh decryptfiles từ trong folder hiện tại:

  • decryptfiles
Output
Created decrypted directory ok: True status: decryption ok stderr: [GNUPG:] ENC_TO D56DC7E63C717DE6 1 0 [GNUPG:] USERID_HINT D56DC7E63C717DE6 Autogenerated Key <sammy@example.com> [GNUPG:] NEED_PASSPHRASE D56DC7E63C717DE6 D56DC7E63C717DE6 1 0 [GNUPG:] GOOD_PASSPHRASE gpg: encrypted with 2048-bit RSA key, ID 3C717DE6, created 2018-04-15 "Autogenerated Key <sammy@example.com>" [GNUPG:] BEGIN_DECRYPTION [GNUPG:] DECRYPTION_INFO 2 9 [GNUPG:] PLAINTEXT 62 1524321773 [GNUPG:] PLAINTEXT_LENGTH 15 [GNUPG:] DECRYPTION_OKAY [GNUPG:] GOODMDC [GNUPG:] END_DECRYPTION ok: True status: decryption ok stderr: [GNUPG:] ENC_TO D56DC7E63C717DE6 1 0 [GNUPG:] USERID_HINT D56DC7E63C717DE6 Autogenerated Key <sammy@example.com> [GNUPG:] NEED_PASSPHRASE D56DC7E63C717DE6 D56DC7E63C717DE6 1 0 [GNUPG:] GOOD_PASSPHRASE gpg: encrypted with 2048-bit RSA key, ID 3C717DE6, created 2018-04-15 "Autogenerated Key <sammy@example.com>" [GNUPG:] BEGIN_DECRYPTION [GNUPG:] DECRYPTION_INFO 2 9 [GNUPG:] PLAINTEXT 62 1524321773 [GNUPG:] PLAINTEXT_LENGTH 15 [GNUPG:] DECRYPTION_OKAY [GNUPG:] GOODMDC [GNUPG:] END_DECRYPTION ok: True status: decryption ok stderr: [GNUPG:] ENC_TO D56DC7E63C717DE6 1 0 [GNUPG:] USERID_HINT D56DC7E63C717DE6 Autogenerated Key <sammy@example.com> [GNUPG:] NEED_PASSPHRASE D56DC7E63C717DE6 D56DC7E63C717DE6 1 0 [GNUPG:] GOOD_PASSPHRASE gpg: encrypted with 2048-bit RSA key, ID 3C717DE6, created 2018-04-15 "Autogenerated Key <sammy@example.com>" [GNUPG:] BEGIN_DECRYPTION [GNUPG:] DECRYPTION_INFO 2 9 [GNUPG:] PLAINTEXT 62 1524321773 [GNUPG:] PLAINTEXT_LENGTH 15 [GNUPG:] DECRYPTION_OKAY [GNUPG:] GOODMDC [GNUPG:] END_DECRYPTION

Tập lệnh trả về status: decryption ok cho mỗi file , nghĩa là mỗi file đã được giải mã thành công.

Thay đổi thành folder decrypted/ mới và hiển thị nội dung của test1.txt bằng lệnh cat :

  • cd decrypted/ && cat test1.txt
Output
This is the first test file

Ta đã khôi phục tin nhắn được lưu trữ trong file test1.txt mà ta đã xóa.

Tiếp theo, hãy xác nhận thư này thực sự là thư root bằng cách xác minh chữ ký của nó bằng tập lệnh verifydetach .

Tệp chữ ký chứa danh tính của người ký cũng như giá trị băm được tính bằng dữ liệu từ tài liệu đã ký. Trong quá trình xác minh, gpg sẽ lấy public key của người gửi và sử dụng nó cùng với thuật toán băm để tính toán giá trị băm cho dữ liệu. Giá trị băm được tính toán và giá trị được lưu trữ trong chữ ký cần phải khớp để xác minh thành công.

Bất kỳ sự giả mạo nào đối với file root , file chữ ký hoặc public key của người gửi sẽ khiến giá trị băm thay đổi và quá trình xác minh không thành công.

Chạy tập lệnh từ trong folder decrypted :

  • verifydetach
Output
test2.py signature valid test1.txt signature valid test3.txt signature valid

Bạn có thể thấy từ kết quả rằng tất cả các file đều có chữ ký hợp lệ, nghĩa là các tài liệu đó không bị giả mạo trong quá trình này.

Bây giờ hãy xem điều gì sẽ xảy ra khi bạn áp dụng các thay đổi đối với tài liệu của bạn sau khi bạn đã ký. Mở file test1.txt bằng nano :

  • nano test1.txt

Bây giờ hãy thêm câu sau vào file :

~ / python-test / mã hóa / giải mã / test1.txt
This is the first test file Let's add a sentence after signing the file 

Lưu và đóng file .

Bây giờ, hãy chạy lại tập lệnh verifydetach và nhận thấy kết quả đã thay đổi như thế nào:

  • verifydetach
Output
test2.py signature valid test1.txt signature bad test3.txt signature valid

Lưu ý GnuPG trả về signature bad khi xác minh test1.txt . Điều này là do ta đã áp dụng các thay đổi đối với file sau khi nó đã được ký. Lưu ý trong quá trình xác minh, gpg so sánh giá trị băm được lưu trữ trong file chữ ký với giá trị băm mà nó tính toán từ tài liệu bạn đã ký. Những thay đổi ta thực hiện đối với tài liệu dẫn đến việc gpg tính toán một giá trị băm khác cho test1.txt . Bạn có thể tìm thấy một cuộc thảo luận chi tiết hơn về cách hoạt động của hashing algorithims tại đây .

Đối với thử nghiệm cuối cùng của ta , hãy sử dụng verifyfile để xác minh một tập lệnh trước khi nó được thực thi. Tập lệnh này có thể được coi là một phần mở rộng của tập lệnh verifydetach , mặc dù có sự khác biệt sau: nếu một tập lệnh vượt qua quá trình xác minh, verifyfile sẽ tiếp tục chạy nó.

Tập lệnh test2.py in một chuỗi vào console khi chạy . Hãy sử dụng nó để chứng minh cách thức hoạt động của script verifyfile .

Chạy test2.py kịch bản với verifyfile :

  • verifyfile test2.py
Output
test2.py signature valid Signature valid, launching script... The second test file is a Python script

Từ kết quả , bạn có thể thấy rằng tập lệnh đã xác minh chữ ký của file , in kết quả thích hợp dựa trên xác minh đó, rồi chạy tập lệnh.

Hãy kiểm tra quá trình xác minh bằng cách thêm một dòng mã bổ sung vào file . Mở test2.py và chèn dòng mã sau:

  • nano test2.py
~ / python-test / mã hóa / giải mã / test2.py
print "The second test file is a Python script" print "This line will cause the verification script to abort" 

Bây giờ chạy lại tập lệnh verifyfile :

  • verifyfile test2.py
Output
test2.py signature bad Signature invalid, aborting script execution

Việc xác minh tập lệnh không thành công, khiến quá trình chạy tập lệnh bị hủy bỏ.

Kết luận

python-gnupg đun python-gnupg cho phép tích hợp giữa một loạt các công cụ mật mã và Python. Khả năng nhanh chóng mã hóa hoặc xác minh tính toàn vẹn của các stream dữ liệu là rất quan trọng trong một số tình huống nhất định, như truy vấn hoặc lưu trữ dữ liệu vào server database từ xa. Các khóa GnuPG cũng được dùng cho những việc như tạo bản backup và xác thực SSH hoặc kết hợp với cài đặt VPN.

Để tìm hiểu thêm về module python-gnupg , bạn có thể truy cập trang dự án python-gnupg . Để biết thêm thông tin về băm file , hãy xem hướng dẫn này về Cách xác minh file đã download .


Tags:

Các tin liên quan

Kế thừa lớp trong Python 3
2018-03-09
Hiểu kế thừa lớp trong Python 3
2018-03-09
Cách viết lệnh Slash với Flask và Python 3 trên Ubuntu 16.04
2018-02-06
Cách cài đặt Phân phối Python Anaconda trên Ubuntu 16.04
2017-12-27
Cách cài đặt Python 3 và thiết lập môi trường lập trình cục bộ trên Ubuntu 16.04
2017-12-20
Cách cài đặt Python 3 và thiết lập môi trường lập trình cục bộ trên Ubuntu 16.04
2017-12-20
Hiểu từ điển bằng Python 3
2017-11-21
Cách sử dụng * args và ** kwargs trong Python 3
2017-11-20
Cách làm việc với control panel tương tác Python
2017-06-21
Cách viết câu lệnh có điều kiện trong Python 3
2017-06-16