Tôi thích đóng góp cho nguồn mở, nhưng tôi muốn giữ mật khẩu của mình cho riêng mình. Python là một ngôn ngữ kết dính tuyệt vời để tự động hóa các tác vụ và gần đây tôi đã sử dụng nó để đăng nhập vào máy chủ web của mình bằng SFTP và tự động phân tích nhật ký, quản lý tệp và cập nhật phần mềm. Các tập lệnh Python mà tôi đang thực hiện cần biết thông tin đăng nhập của mình, nhưng tôi muốn giao chúng cho quyền kiểm soát nguồn và chia sẻ chúng trên GitHub nên tôi phải cẩn thận khi sử dụng chiến lược giảm thiểu rủi ro do vô tình làm rò rỉ những bí mật này lên internet
Bài đăng này khám phá các tùy chọn khác nhau để quản lý thông tin xác thực trong tập lệnh Python trong kho lưu trữ công cộng. Có nhiều cách khác nhau để quản lý thông tin đăng nhập bằng Python và tôi đã rất ngạc nhiên khi biết được một số cách mới khi tôi đang nghiên cứu chủ đề này. Bài đăng này xem xét các tùy chọn phổ biến nhất, bắt đầu với những tùy chọn không an toàn nhất và hướng tới các phương pháp được đánh giá cao nhất để quản lý bí mật
Mật khẩu văn bản thuần túy trong mã
⚠️☠️ NGUY HIỂM. không bao giờ làm điều này
Bạn có thể đặt mật khẩu hoặc khóa API trực tiếp vào tập lệnh python của mình, nhưng ngay cả khi bạn định xóa mật khẩu đó sau này thì luôn có khả năng bạn sẽ vô tình đưa nó vào kiểm soát nguồn mà không nhận ra, gây ra rủi ro bảo mật mãi mãi. Phương pháp này phải tránh bằng mọi giá
username = "myUsername"
password = "S3CR3T_P455W0RD"
logIn[username, password]
Mật khẩu bị xáo trộn trong mã
⚠️☠️ NGUY HIỂM. không bao giờ làm điều này
Một ý tưởng ít khủng khiếp hơn một chút là làm xáo trộn mật khẩu văn bản thuần túy bằng cách lưu trữ chúng dưới dạng chuỗi 64 cơ sở. Bạn sẽ không biết mật khẩu chỉ bằng cách nhìn thấy nó, nhưng bất kỳ ai có chuỗi đều có thể dễ dàng giải mã nó. Các trang web như https. //www. giải mã cơ sở64. org rất hữu ích cho việc này
"""Demonstrate conversion to/from base 64"""
import base64
def obfuscate[plainText]:
plainBytes = plainText.encode['ascii']
encodedBytes = base64.b64encode[plainBytes]
encodedText = encodedBytes.decode['ascii']
return encodedText
def deobfuscate[obfuscatedText]:
obfuscatedBytes = obfuscatedText.encode['ascii']
decodedBytes = base64.b64decode[obfuscatedBytes]
decodedText = decodedBytes.decode['ascii']
return decodedText
original = "S3CR3T_P455W0RD"
obfuscated = obfuscate[original]
deobfuscated = deobfuscate[obfuscated]
print["original: " + original]
print["obfuscated: " + obfuscated]
print["deobfuscated: " + deobfuscated]
original: S3CR3T_P455W0RD
obfuscated: UzNDUjNUX1A0NTVXMFJE
deobfuscated: S3CR3T_P455W0RD
Mật khẩu trong tệp văn bản thuần túy
⚠️ CẢNH BÁO. Phương pháp này dễ mắc sai lầm. Đảm bảo tệp văn bản không bao giờ được cam kết kiểm soát nguồn
Bạn có thể lưu trữ tên người dùng/mật khẩu trên hai dòng đầu tiên của tệp văn bản thuần túy, sau đó sử dụng python để đọc nó khi bạn cần
with open["secrets.txt"] as f:
lines = f.readlines[]
username = lines[0].strip[]
password = lines[1].strip[]
print[f"USERNAME={username}, PASSWORD={password}"]
Nếu tệp văn bản nằm trong thư mục kho lưu trữ, bạn nên sửa đổi
original = "S3CR3T_P455W0RD"
obfuscated = obfuscate[original]
deobfuscated = deobfuscate[obfuscated]
print["original: " + original]
print["obfuscated: " + obfuscated]
print["deobfuscated: " + deobfuscated]
2 để đảm bảo nó không bị kiểm soát nguồn theo dõi. Có một rủi ro là bạn có thể quên làm điều này, làm lộ thông tin đăng nhập của bạn trực tuyến. Một ý tưởng tốt hơn có thể là đặt hoàn toàn tệp bí mật bên ngoài thư mục kho lưu trữ của bạn💡 Có những thư viện giúp việc này trở nên dễ dàng hơn. Một ví dụ là Python Decouple thực hiện rất nhiều logic này một cách duyên dáng và thậm chí có thể kết hợp các cài đặt từ nhiều tệp [e. g. , tệp
original = "S3CR3T_P455W0RD"
obfuscated = obfuscate[original]
deobfuscated = deobfuscate[obfuscated]
print["original: " + original]
print["obfuscated: " + obfuscated]
print["deobfuscated: " + deobfuscated]
3 so với tệp original = "S3CR3T_P455W0RD"
obfuscated = obfuscate[original]
deobfuscated = deobfuscate[obfuscated]
print["original: " + original]
print["obfuscated: " + obfuscated]
print["deobfuscated: " + deobfuscated]
4] cho các môi trường có thể hưởng lợi từ các tùy chọn cấu hình nâng cao hơn. Xem ghi chú bên dưới về các thư viện trợ giúp có các biến môi trường và tệp original = "S3CR3T_P455W0RD"
obfuscated = obfuscate[original]
deobfuscated = deobfuscate[obfuscated]
print["original: " + original]
print["obfuscated: " + obfuscated]
print["deobfuscated: " + deobfuscated]
4Mật khẩu trong Mô-đun Python
⚠️ CẢNH BÁO. Phương pháp này dễ mắc sai lầm. Đảm bảo mô-đun bí mật không bao giờ được cam kết kiểm soát nguồn
Tương tự như một tệp văn bản thuần túy không được kiểm soát nguồn theo dõi [lý tưởng nhất là nằm hoàn toàn bên ngoài thư mục kho lưu trữ], bạn có thể lưu trữ mật khẩu dưới dạng biến trong mô-đun Python, sau đó nhập nó
from mySecrets import username, password
print[f"USERNAME={username}, PASSWORD={password}"]
Nếu tệp bí mật của bạn nằm trong một thư mục tối nghĩa, bạn sẽ phải thêm nó vào đường dẫn của mình để có thể tìm thấy mô-đun khi nhập
"""Demonstrate conversion to/from base 64"""
import base64
def obfuscate[plainText]:
plainBytes = plainText.encode['ascii']
encodedBytes = base64.b64encode[plainBytes]
encodedText = encodedBytes.decode['ascii']
return encodedText
def deobfuscate[obfuscatedText]:
obfuscatedBytes = obfuscatedText.encode['ascii']
decodedBytes = base64.b64decode[obfuscatedBytes]
decodedText = decodedBytes.decode['ascii']
return decodedText
0Không đặt tên cho mô-đun của bạn là
original = "S3CR3T_P455W0RD"
obfuscated = obfuscate[original]
deobfuscated = deobfuscate[obfuscated]
print["original: " + original]
print["obfuscated: " + obfuscated]
print["deobfuscated: " + deobfuscated]
6 vì mô-đun bí mật là một phần của thư viện chuẩn và có thể sẽ được nhập thay thếMật khẩu làm đối số chương trình
⚠️ CẢNH BÁO. Phương pháp này có thể lưu trữ mật khẩu văn bản thuần túy trong lịch sử lệnh của bạn
Đây không phải là một ý tưởng hay vì mật khẩu được nhìn thấy ở dạng văn bản thuần túy trong bảng điều khiển và cũng có thể được lưu trữ trong lịch sử lệnh. Tuy nhiên, bạn không có khả năng vô tình đưa mật khẩu vào kiểm soát nguồn
"""Demonstrate conversion to/from base 64"""
import base64
def obfuscate[plainText]:
plainBytes = plainText.encode['ascii']
encodedBytes = base64.b64encode[plainBytes]
encodedText = encodedBytes.decode['ascii']
return encodedText
def deobfuscate[obfuscatedText]:
obfuscatedBytes = obfuscatedText.encode['ascii']
decodedBytes = base64.b64decode[obfuscatedBytes]
decodedText = decodedBytes.decode['ascii']
return decodedText
2____13Nhập mật khẩu trong Bảng điều khiển
Bạn có thể yêu cầu người dùng nhập mật khẩu của họ vào bảng điều khiển nhưng các ký tự sẽ hiển thị khi họ nhập
"""Demonstrate conversion to/from base 64"""
import base64
def obfuscate[plainText]:
plainBytes = plainText.encode['ascii']
encodedBytes = base64.b64encode[plainBytes]
encodedText = encodedBytes.decode['ascii']
return encodedText
def deobfuscate[obfuscatedText]:
obfuscatedBytes = obfuscatedText.encode['ascii']
decodedBytes = base64.b64decode[obfuscatedBytes]
decodedText = decodedBytes.decode['ascii']
return decodedText
4Python có một mô-đun getpass trong thư viện chuẩn của nó được tạo để nhắc người dùng nhập mật khẩu làm đầu vào bảng điều khiển. Không giống như
original = "S3CR3T_P455W0RD"
obfuscated = obfuscate[original]
deobfuscated = deobfuscate[obfuscated]
print["original: " + original]
print["obfuscated: " + obfuscated]
print["deobfuscated: " + deobfuscated]
7, các ký tự không hiển thị khi nhập mật khẩu"""Demonstrate conversion to/from base 64"""
import base64
def obfuscate[plainText]:
plainBytes = plainText.encode['ascii']
encodedBytes = base64.b64encode[plainBytes]
encodedText = encodedBytes.decode['ascii']
return encodedText
def deobfuscate[obfuscatedText]:
obfuscatedBytes = obfuscatedText.encode['ascii']
decodedBytes = base64.b64decode[obfuscatedBytes]
decodedText = decodedBytes.decode['ascii']
return decodedText
0Trích xuất mật khẩu từ Clipboard
Đây là một phương pháp thú vị. Nó nhanh và đơn giản, nhưng hơi kỳ quặc. Nhược điểm là [1] nó yêu cầu mật khẩu phải nằm trong khay nhớ tạm, điều này có thể làm lộ mật khẩu đối với các chương trình khác, [2] nó yêu cầu cài đặt thư viện không chuẩn và [3] nó sẽ không hoạt động dễ dàng trong môi trường máy chủ
Lưu ý rằng tôi tin tưởng pyperclip hơn clipboard [chỉ là một nhà phát triển khác gói pyperclip]
"""Demonstrate conversion to/from base 64"""
import base64
def obfuscate[plainText]:
plainBytes = plainText.encode['ascii']
encodedBytes = base64.b64encode[plainBytes]
encodedText = encodedBytes.decode['ascii']
return encodedText
def deobfuscate[obfuscatedText]:
obfuscatedBytes = obfuscatedText.encode['ascii']
decodedBytes = base64.b64decode[obfuscatedBytes]
decodedText = decodedBytes.decode['ascii']
return decodedText
1Chạy sau khi sao chép mật khẩu vào khay nhớ tạm
"""Demonstrate conversion to/from base 64"""
import base64
def obfuscate[plainText]:
plainBytes = plainText.encode['ascii']
encodedBytes = base64.b64encode[plainBytes]
encodedText = encodedBytes.decode['ascii']
return encodedText
def deobfuscate[obfuscatedText]:
obfuscatedBytes = obfuscatedText.encode['ascii']
decodedBytes = base64.b64decode[obfuscatedBytes]
decodedText = decodedBytes.decode['ascii']
return decodedText
2Yêu cầu thông tin xác thực với Tk
Thư viện đồ họa Tk là bộ công cụ tiện ích đồ họa đa nền tảng đi kèm với Python. Một cửa sổ đăng nhập thu thập tên người dùng và mật khẩu có thể được tạo theo chương trình và được gói trong một chức năng để dễ dàng đưa vào các tập lệnh không có GUI
Tôi thấy kỹ thuật này đặc biệt hữu ích khi tên người dùng và mật khẩu được lưu trữ trong trình quản lý mật khẩu
"""Demonstrate conversion to/from base 64"""
import base64
def obfuscate[plainText]:
plainBytes = plainText.encode['ascii']
encodedBytes = base64.b64encode[plainBytes]
encodedText = encodedBytes.decode['ascii']
return encodedText
def deobfuscate[obfuscatedText]:
obfuscatedBytes = obfuscatedText.encode['ascii']
decodedBytes = base64.b64decode[obfuscatedBytes]
decodedText = decodedBytes.decode['ascii']
return decodedText
3____14Quản lý mật khẩu bằng Keyring
Gói khóa cung cấp một cách dễ dàng để truy cập dịch vụ tạo khóa của hệ thống từ python. Trên MacOS, nó sử dụng Keychain, trên Windows, nó sử dụng Windows Credential Locker và trên Linux, nó có thể sử dụng KWallet của KDE hoặc Secret Service của GNOME
Nhược điểm của dây móc khóa là [1] nó yêu cầu một thư viện không chuẩn, [2] việc triển khai có thể dành riêng cho hệ điều hành, [3] nó có thể không hoạt động dễ dàng trong môi trường đám mây
"""Demonstrate conversion to/from base 64"""
import base64
def obfuscate[plainText]:
plainBytes = plainText.encode['ascii']
encodedBytes = base64.b64encode[plainBytes]
encodedText = encodedBytes.decode['ascii']
return encodedText
def deobfuscate[obfuscatedText]:
obfuscatedBytes = obfuscatedText.encode['ascii']
decodedBytes = base64.b64decode[obfuscatedBytes]
decodedText = decodedBytes.decode['ascii']
return decodedText
5"""Demonstrate conversion to/from base 64"""
import base64
def obfuscate[plainText]:
plainBytes = plainText.encode['ascii']
encodedBytes = base64.b64encode[plainBytes]
encodedText = encodedBytes.decode['ascii']
return encodedText
def deobfuscate[obfuscatedText]:
obfuscatedBytes = obfuscatedText.encode['ascii']
decodedBytes = base64.b64decode[obfuscatedBytes]
decodedText = decodedBytes.decode['ascii']
return decodedText
6"""Demonstrate conversion to/from base 64"""
import base64
def obfuscate[plainText]:
plainBytes = plainText.encode['ascii']
encodedBytes = base64.b64encode[plainBytes]
encodedText = encodedBytes.decode['ascii']
return encodedText
def deobfuscate[obfuscatedText]:
obfuscatedBytes = obfuscatedText.encode['ascii']
decodedBytes = base64.b64decode[obfuscatedBytes]
decodedText = decodedBytes.decode['ascii']
return decodedText
7Mật khẩu trong Biến môi trường
Biến môi trường là một trong những cách tốt hơn để quản lý thông tin xác thực bằng Python. Có nhiều bài viết về chủ đề này, bao gồm Cách đặt biến môi trường và Làm việc với biến môi trường trong Python của Twilio. Biến môi trường là một trong những phương pháp quản lý thông tin xác thực ưa thích khi làm việc với các nhà cung cấp đám mây
Đảm bảo khởi động lại phiên giao diện điều khiển của bạn sau khi chỉnh sửa các biến môi trường trước khi thử đọc chúng từ bên trong python
"""Demonstrate conversion to/from base 64"""
import base64
def obfuscate[plainText]:
plainBytes = plainText.encode['ascii']
encodedBytes = base64.b64encode[plainBytes]
encodedText = encodedBytes.decode['ascii']
return encodedText
def deobfuscate[obfuscatedText]:
obfuscatedBytes = obfuscatedText.encode['ascii']
decodedBytes = base64.b64decode[obfuscatedBytes]
decodedText = decodedBytes.decode['ascii']
return decodedText
8Có nhiều thư viện trợ giúp như python-dotenv và Python Decouple có thể sử dụng các tệp
original = "S3CR3T_P455W0RD"
obfuscated = obfuscate[original]
deobfuscated = deobfuscate[obfuscated]
print["original: " + original]
print["obfuscated: " + obfuscated]
print["deobfuscated: " + deobfuscated]
4 cục bộ để tự động đặt các biến môi trường khi chương trình của bạn chạy. Như đã lưu ý trong các phần trước, khi lưu trữ mật khẩu ở dạng văn bản thuần túy trong cấu trúc tệp của kho lưu trữ của bạn, hãy cực kỳ cẩn thận để không chuyển giao các tệp này cho kiểm soát nguồnVí dụ tệp
original = "S3CR3T_P455W0RD"
obfuscated = obfuscate[original]
deobfuscated = deobfuscate[obfuscated]
print["original: " + original]
print["obfuscated: " + obfuscated]
print["deobfuscated: " + deobfuscated]
4"""Demonstrate conversion to/from base 64"""
import base64
def obfuscate[plainText]:
plainBytes = plainText.encode['ascii']
encodedBytes = base64.b64encode[plainBytes]
encodedText = encodedBytes.decode['ascii']
return encodedText
def deobfuscate[obfuscatedText]:
obfuscatedBytes = obfuscatedText.encode['ascii']
decodedBytes = base64.b64decode[obfuscatedBytes]
decodedText = decodedBytes.decode['ascii']
return decodedText
9Gói
original: S3CR3T_P455W0RD
obfuscated: UzNDUjNUX1A0NTVXMFJE
deobfuscated: S3CR3T_P455W0RD
0 có thể tải các biến original = "S3CR3T_P455W0RD"
obfuscated = obfuscate[original]
deobfuscated = deobfuscate[obfuscated]
print["original: " + original]
print["obfuscated: " + obfuscated]
print["deobfuscated: " + deobfuscated]
4 dưới dạng biến môi trường khi tập lệnh Python chạyoriginal = "S3CR3T_P455W0RD"
obfuscated = obfuscate[original]
deobfuscated = deobfuscate[obfuscated]
print["original: " + original]
print["obfuscated: " + obfuscated]
print["deobfuscated: " + deobfuscated]
0Tài nguyên bổ sung
- sử dụng. tệp env cho biến môi trường trong ứng dụng Python
- Biến môi trường vs. Bí mật trong Python
- Cách đặt biến môi trường
- Làm việc với Biến môi trường trong Python
- Cách đặt và nhận các biến môi trường trong Python
- python-dotenv đọc các cặp khóa-giá trị từ một. env và có thể đặt chúng làm biến môi trường. Nó giúp phát triển các ứng dụng theo nguyên tắc 12 yếu tố
- Python Decouple giúp bạn sắp xếp các cài đặt của mình để bạn có thể thay đổi các tham số mà không phải triển khai lại ứng dụng của mình
Làm cách nào để bạn quản lý thông tin đăng nhập trong Python?