Tệp cấu hình mật khẩu Python

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]
4

Mậ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
0

Khô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____13

Nhậ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
4

Python 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
0

Trí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
1

Chạ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
2

Yê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____14

Quả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
7

Mậ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
8

Có 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ồn

Ví 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
9

Gó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ạy

original = "S3CR3T_P455W0RD"
obfuscated = obfuscate[original]
deobfuscated = deobfuscate[obfuscated]

print["original: " + original]
print["obfuscated: " + obfuscated]
print["deobfuscated: " + deobfuscated]
0

Tà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?

Làm cách nào để chuyển mật khẩu trong Python?

getpass[] và getuser[] trong Python [Mật khẩu không có tiếng vang] getpass[] nhắc người dùng nhập mật khẩu mà không có tiếng vang. Mô-đun getpass cung cấp một cách an toàn để xử lý lời nhắc mật khẩu nơi các chương trình tương tác với người dùng thông qua thiết bị đầu cuối.

Làm cách nào để lưu trữ tên người dùng và mật khẩu trong Python?

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 khi bạn cần. 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. gitignore để đảm bảo nó không bị kiểm soát nguồn theo dõi.

Làm cách nào để lưu mật khẩu được mã hóa bằng Python?

Các bước. .
Nhập khẩu dương xỉ
Sau đó tạo khóa mã hóa, có thể được sử dụng để mã hóa và giải mã
Chuyển đổi chuỗi thành chuỗi byte để có thể mã hóa
Ví dụ lớp Fernet với khóa mã hóa
Sau đó mã hóa chuỗi bằng ví dụ Fernet

Chủ Đề