Hướng dẫn masking password in python - che mật khẩu trong python

Tôi đang sử dụng thư viện Python-Sonarqube-Api, hiển thị mật khẩu trong nhật ký gỡ lỗi bằng cách sử dụng logger mà tôi coi là lỗi.

Cho đến khi nó có thể được sửa chữa, tôi cần ẩn mật khẩu trong nhật ký. Tôi đang xem xét sử dụng bộ lọc nhưng tôi không chắc chắn làm thế nào để sử dụng nó mà không phá vỡ cấu trúc hiện tại của tất cả các trình ghi nhật ký trong phần mềm.

Bạn có thể gợi ý cho tôi một số giải pháp xin vui lòng?

  • Python
  • Sonarquabe
  • python-logging
  • password-masking

hỏi ngày 24 tháng 3 lúc 11:40Mar 24 at 11:40

Přemysl Šťastnýpřemysl ŠťastnýPřemysl Šťastný

1.5852 huy hiệu vàng16 Huy hiệu bạc37 Huy hiệu đồng2 gold badges16 silver badges37 bronze badges

8

  • @Sembeinorimaki Tôi không thể chuyển chuỗi được mã hóa vào thư viện ... hoặc ít nhất tôi không biết làm thế nào.

    24 tháng 3 lúc 11:47

  • Trong liên kết tôi đã cung cấp, bạn có một số ví dụ về cách mã hóa một chuỗi. Nếu bạn có thể vượt qua một chuỗi thì bạn có thể vượt qua phiên bản được mã hóa của chuỗi (nó vẫn là một chuỗi). Điều duy nhất cần tính đến là sau đó bạn cũng cần cung cấp một phương thức giải mã để khôi phục dữ liệu gốc.

    24 tháng 3 lúc 11:51

  • @Sembeinorimaki Tôi hiểu điều đó ... nhưng nếu tôi không kiểm soát được thư viện hoạt động ở bên trong, tôi không thể cung cấp bất kỳ phương thức nào như vậy.

    24 tháng 3 lúc 11:53

  • Ngoài ra, bạn không thể tự mã hóa bản logfile sau khi nó xoay (nếu có điều đó) và sau đó có một số loại bảo mật (xin lỗi tôi không biết nó được thiết lập như thế nào). :)

    24 tháng 3 lúc 11:59

Người chưa sử dụng logger đôi khi với tư cách là nhà phát triển, đó là điều luôn đồng hành cùng chúng tôi vì chúng tôi học lập trình, nhưng hầu hết thời gian chúng tôi không đưa ra tầm quan trọng cần thiết đối với thông tin được hiển thị trong nhật ký, trong trường hợp cụ thể này Tôi sẽ nói về các đối tượng JSON, được sử dụng rất phổ biến và chứa thông tin thuộc nhiều loại khác nhau, ví dụ về một cuốn sách, người dùng hoặc thông tin ngân hàng. Trong trường hợp thông tin từ một cuốn sách, bạn không phải suy nghĩ nhiều về những gì được hiển thị trong nhật ký vì không có dữ liệu làm ảnh hưởng đến người dùng, nhưng trong trường hợp thông tin ngân hàng như thẻ tín dụng hoặc người dùng, bạn có Để rất cẩn thận, bởi vì bạn có thể thỏa hiệp bảo mật của công ty và người dùng.

Bây giờ, hôm nay tôi đã đưa ra một ví dụ về cách che dấu thông tin từ một đối tượng JSON trong Python, sử dụng hai thư viện, Pydash và JsonPath-NG. Logic rất đơn giản và có thể được chuyển sang ngôn ngữ khác mà bạn muốn làm việc.

Tôi sẽ bắt đầu bằng cách giải thích một chút về các thư viện, PYDASH đầu tiên, đó là một thư viện dựa trên Lodash, một thư viện JavaScript có các chức năng rất đa dạng như xác thực đối tượng, tạo ra các hàm ghép, thao tác các giá trị trong Cấu trúc dữ liệu, v.v ... Tôi không muốn đi sâu vào chủ đề này, bởi vì đó là một thư viện rất rộng rãi có rất nhiều tiện ích. Mặt khác, JsonPath-NG, sẽ chăm sóc công việc nặng nhất, vì nó sử dụng các biểu thức đường dẫn để điều hướng qua các phần tử trong một đối tượng JSON; Thông qua điều này, chúng ta có thể tìm thấy các tuyến đường mà dữ liệu mà chúng ta muốn che giấu được tìm thấy, và sau đó thay thế chúng.

Trong trường hợp này, chúng tôi đã giành được tùy chọn in Python, chúng tôi sẽ sử dụng ghi nhật ký vì nó có các tùy chọn để định cấu hình cách hiển thị thông tin chúng tôi muốn in.

logging.basicConfig(format=’[%(levelname)s] : %(message)s’, level=logging.INFO)

Chúng tôi tiến hành xác định các định danh của mình, để có thể che giấu từng thông tin theo một cách khác, ví dụ, nếu chúng tôi muốn che giấu mật khẩu hoặc khóa API với dấu hoa thị và thông tin thẻ tín dụng với xxx:

{
'password': 'p****d',
'api_key': 'AH**==',
'cvv': 'XXX'
}

Theo cách này, chúng tôi tạo ra các nhóm thông tin để đối xử với từng nhóm khác nhau; Trong trường hợp này, một người liệt kê đã được tạo để che dấu thông tin tín dụng, ngày tháng và thông tin người dùng.

from enum import Enum

class MaskTargetsKeys(Enum):
CREDIT_CARD = "creditCard"
CVV = "cvv"
BIN = "bin"
EXP_DATE = "exp_date"
SECRET_KEY = "secret_key"

Sau đó, chúng tôi phải xác định các biểu thức mà chúng tôi sẽ tìm kiếm, để có thể che dấu thông tin, trong trường hợp này, chúng tôi tạo một lớp có định danh của loại thông tin và biểu thức mà chúng tôi muốn thực hiện tìm kiếm.

class MaskTargets:

def __init__(self, target: str, expression: str):
self.target = target
self.expression = expression
pass

Các biểu thức được xác định cho phép chúng tôi đánh giá đối tượng và có được tất cả các tuyến đường khớp với quy tắc mà chúng tôi thiết lập, trong trường hợp này, mỗi biểu thức được thiết kế để có thể tìm thấy bất kỳ khớp nào với CVV, hết hạn, hết hạn, thùng, mật khẩu, mật khẩu, Secret_Key, CardNumber và Card.Number. Thư viện JsonPath-NG có trách nhiệm tìm kiếm gốc của đối tượng và trong các nút sâu hơn và trả lại tất cả những nơi mà nó tìm thấy các trận đấu.

def __set_masked_keys(self) -> None:

self.__mask_targets = []
credit_card_key = MaskTargetsKeys.CREDIT_CARD.value
cvv_key = MaskTargetsKeys.CVV.value
exp_date_key = MaskTargetsKeys.EXP_DATE.value
bin_key = MaskTargetsKeys.BIN.value
secret_key = MaskTargetsKeys.SECRET_KEY.value
self.__mask_targets.append(MaskTargets(credit_card_key, "$..card.number"))
self.__mask_targets.append(MaskTargets(credit_card_key, "$..cardNumber"))
self.__mask_targets.append(MaskTargets(cvv_key, "$..cvv"))
self.__mask_targets.append(MaskTargets(exp_date_key, "$..expiryMonth"))
self.__mask_targets.append(MaskTargets(exp_date_key, "$..expiryYear"))
self.__mask_targets.append(MaskTargets(bin_key, "$..bin"))
self.__mask_targets.append(MaskTargets(secret_key, "$..password"))
self.__mask_targets.append(MaskTargets(secret_key, "$..secret_key"))

Như tôi đã đề cập, chúng tôi đã xác định một người liệt kê để có thể nhóm các loại thông tin và biểu thức tương ứng của chúng, trong trường hợp này, chúng tôi đánh giá từng mục và có được tất cả các tuyến trong đó biểu thức có kết quả dương tính.

def __clear_sensitive_data(self, metadata: dict) -> dict:

for item in self.__mask_targets:

json_path_expression = parse(item.expression)

json_path_expression.find(metadata)

matches = [str(match.full_path) for match

in json_path_expression.find(metadata)]

for match in matches:

target_value = pydash.get(metadata, match, default="")

if item.target == MaskTargetsKeys.CREDIT_CARD.value:

mask_data = CustomLogger.__mask_credit_data(self, target_value)

pydash.set_(metadata, match, mask_data)

if item.target == MaskTargetsKeys.BIN.value:

mask_data = CustomLogger.__mask_bin_data(self, target_value)

pydash.set_(metadata, match, mask_data)

if item.target == MaskTargetsKeys.EXP_DATE.value:

pydash.set_(metadata, match, "XX")

if item.target == MaskTargetsKeys.CVV.value:

pydash.set_(metadata, match, "XXX")

if item.target == MaskTargetsKeys.SECRET_KEY.value:

mask_data = CustomLogger.__mask_secret_data(self, target_value)

pydash.set_(metadata, match, mask_data)

return metadata

Khi chúng tôi có các tuyến đường mà chúng tôi phải che giấu thông tin, hãy tiến hành thay thế chúng bằng Pydash, ví dụ, để biết thông tin của ngày chúng tôi tiến hành thay thế chúng bằng hai x, nhưng đối với thông tin người dùng như mật khẩu, chúng tôi ẩn các đoạn thông tin bằng cách sử dụng Một phương thức riêng tư, thay thế một số thông tin bằng dấu hoa thị.

def __mask_secret_data(self, data: str) -> str:

return data[:2] + '*********' + (data[-1:])

Cuối cùng, thông tin được trả về với dữ liệu nhạy cảm được che dấu và in trên bảng điều khiển của chúng tôi.

[INFO] : Test Data {
"secret_key": "AS*********=",
"cardNumber": "131231XXXXXX4123",
"password": "pa*********4",
"bin": "453634XXX",
"card": {
"number": "424242XXXXXX4242",
"bin": "453634XXX",
"expiryYear": "XX",
"expiryMonth": "XX",
"cvv": "XXX"
}
}

Như tôi đã đề cập trước đây, chúng tôi có thể che giấu từng nhóm theo cách chúng tôi muốn, sử dụng các ký hiệu khác nhau hoặc thay thế tất cả thông tin bằng một văn bản được cá nhân hóa.

Bạn có thể thấy mã của dự án tại đây: https://github.com/ridouku/custom-rogger-pyhton

Bạn có thể đọc về Lodash ở đây (Pydash có cùng chức năng): https://lodash.com

Thông tin cú pháp JsonPath: https://github.com/json-path/jsonpath

Câu hỏi?Bình luận?Liên hệ với tôi tại

Thanks.