Tệp văn bản tên người dùng và mật khẩu Python

def read_password(prompt):
    while True:
        try:
            data = getpass(prompt)
        except EOFError:
            # Ctrl-d was pressed?
            print()
            continue
        except KeyboardInterrupt:
            print()
            raise SystemExit(1)
        else:
            # The assumption is that, since Python 3 return a Unicode string
            # from input(), it has Done The Right Thing with respect to
            # character encoding.
            return data 

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 làm việc cần biết thông tin đăng nhập của tôi, 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, vì vậy tôi phải cẩn thận khi sử dụng chiến lược giảm thiểu rủi ro 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, 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
____3____4

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ó

username = "myUsername"
password = "S3CR3T_P455W0RD"
logIn(username, password)
0

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

username = "myUsername"
password = "S3CR3T_P455W0RD"
logIn(username, password)
1

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

username = "myUsername"
password = "S3CR3T_P455W0RD"
logIn(username, password)
3____14

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

username = "myUsername"
password = "S3CR3T_P455W0RD"
logIn(username, password)
5

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

Tệp văn bản tên người dùng và mật khẩu 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
3____24

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 với 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

Tệp văn bản tên người dùng và mật khẩu Python

Đả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 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 tên người dùng và mật khẩu trong tập lệnh Python?

Nhận tên người dùng và mật khẩu khi chạy bằng Python .
pip cài đặt getpass. con trăn. Sao chép
tên người dùng = getpass. getuser() Python. Sao chép
userName= input('Nhập tên người dùng. ') Con trăn. Sao chép
mật khẩu = getpass. getpass() Python. Sao chép

Tệp văn bản trong ví dụ Python là gì?

Có hai loại tệp có thể được xử lý trong python, tệp văn bản bình thường và tệp nhị phân (được viết bằng ngôn ngữ nhị phân, 0 và 1). tệp văn bản. Trong loại tệp này, Mỗi dòng văn bản được kết thúc bằng một ký tự đặc biệt gọi là EOL (Cuối dòng), là ký tự dòng mới ('\n') theo mặc định trong python< . .