Библиотека для маскировки чувствительных данных (пароли, токены, и т.д.) в строках, словарях и списках
Project description
maskinfly
maskinfly – универсальная библиотека для Python, объединяющая:
- Рекурсивную маскировку чувствительных данных (пароли, токены, email, номера карт, SSN, IP и др.)
- Лёгкий autograd и базовые компоненты для создания нейронных сетей (тензоры с автоматическим дифференцированием, слои, оптимизаторы).
- CLI-утилиту для быстрой маскировки и проверки файлов JSON/YAML.
Возможности
Маскировка данных
- Рекурсивная обработка
dict,list,str,pydantic.SecretStr. - Встроенные регулярные выражения: пароли, JWT, email, кредитные карты, SSN, IP-адреса, токены.
- Маскировка по имени переменной (например,
password = "secret"→***). - Явное указание имени переменной через параметр
var_name(рекомендуется для production). - Аудит замен: логирование пути, причины, типа и хеша (SHA256) исходного значения.
- Безопасный режим аудита – в лог попадает только временная метка и хеш (без пути, причины, типа).
- Гибкий аудит: форматы
textилиjson, кастомный обработчик, имя приложения. - Простой интерфейс: функция
mask()или классMasker. - Поддержка
pydantic.SecretStr(опционально). - Кастомизация маскирующего символа и длины маски.
- Добавление собственных regex-паттернов через параметр
custom_patternsили методadd_pattern. - Загрузка конфигурации из JSON/YAML (классовый метод
Masker.from_config). - Корректная обработка циклических ссылок в изменяемых структурах.
- Маскировка по чувствительным путям (например, ключ
"password"в словаре). - Управление глубиной маскировки чувствительных ключей (
deep_mask).
Autograd и нейронные сети
Tensor– многомерный массив (обёртка надnumpy) с поддержкой autograd.- Автоматическое дифференцирование – градиенты скалярных функций через
.backward(). - Базовые операции: сложение, умножение, матричное умножение, возведение в степень, ReLU, экспонента, логарифм, изменение формы, суммирование по оси, среднее,
stack. - Базовые слои:
Linear,ReLU,Sequential. - Функции потерь:
mse_loss. - Оптимизатор:
SGD. - Контекстный менеджер
no_grad()для отключения вычисления градиентов. - Функция
is_grad_enabled()– проверка состояния вычисления градиентов.
CLI утилита
maskifly mask– маскировка данных в JSON/YAML файле.maskifly check– сканирование файла на наличие чувствительных данных без их изменения.
Установка
'''bash pip install maskinfly
Или из репозитария
git clone "https://github.com/MordantAcid/maskifly.git" cd maskinfly
Для работы с YAML и Pydantic установите дополнительные зависимости:
pip install maskinfly[yaml,pydantic]
Быстрый старт Маскировка данных
from maskinfly import mask
data = { "user": "alice", "password": "secret123", "token": "abc123xyz", "email": "alice@example.com" } masked = mask(data) print(masked)
{'user': 'alice', 'password': '', 'token': '', 'email': 'a***@example.com'}
По умолчанию длина маски – 3 символа, поэтому email маскируется как a***@example.com.
Строка с JWT
jwt = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIn0.dozjgNryP4J3jVmNHl0w5N_XgL0n3I9PlFUP0THsR8U" print(mask(f"Authorization: {jwt}"))
'Authorization: ***'
Включение аудита (логи в stderr)
mask(data, audit_enabled=True)
Autograd и нейронные сети
from maskinfly import Tensor, nn, optim
Данные (XOR)
X = Tensor([[0, 0], [0, 1], [1, 0], [1, 1]]) y = Tensor([[0], [1], [1], [0]])
Модель
model = nn.Sequential( nn.Linear(2, 4), nn.ReLU(), nn.Linear(4, 1) )
optimizer = optim.SGD(model.parameters(), lr=0.1)
Обучение
for epoch in range(1000): pred = model(X) loss = nn.mse_loss(pred, y) optimizer.zero_grad() loss.backward() optimizer.step()
print(model(X).data) # приблизительно [[0], [1], [1], [0]]
Расширенное использование Параметры функции mask() Функция mask() поддерживает все возможности класса Masker:
mask(data, audit_enabled=False, audit_logger=None, auto_varname=False, var_name=None, mask_char="*", mask_length=3, custom_patterns=None, audit_format='text', audit_custom_handler=None, audit_app_name=None, deep_mask=False, audit_safe_mode=False)
Пример с явным указанием имени переменной (рекомендуется):
result = mask("my_secret_pass", var_name="password") # '***'
Безопасный режим аудита Включается параметром audit_safe_mode=True. При этом в лог аудита не попадают путь, причина, тип и имя приложения – только временная метка и хеш (SHA256) исходного значения. Это полезно для соблюдения требований конфиденциальности (GDPR, PCI DSS и т.п.).
from maskinfly import mask
В лог попадёт только {"timestamp": "...", "hash": "abcd1234"}
mask({"password": "secret"}, audit_enabled=True, audit_safe_mode=True)
Глубокое маскирование (deep_mask) По умолчанию, если встречается чувствительный ключ (например, "password"), всё его значение заменяется на маску. При deep_mask=True маскировка продолжается рекурсивно внутри значения.
from maskinfly import Masker
data = {"password": {"user": "admin", "token": "secret123"}}
masker_shallow = Masker(deep_mask=False) print(masker_shallow.mask(data)) # {'password': '***'}
masker_deep = Masker(deep_mask=True) print(masker_deep.mask(data)) # {'password': {'user': 'admin', 'token': '***'}}
Добавление собственных паттернов Используйте метод add_pattern для динамического добавления новых правил маскировки. Вы можете указать свою функцию замены или использовать одну из встроенных:
full_mask_replacer – полная замена на маску.
email_mask_replacer – частичная маскировка email (первый символ + маска).
key_value_mask_replacer – замена только значения после ключа.
import re from maskinfly import Masker from maskinfly.patterns import full_mask_replacer, key_value_mask_replacer
masker = Masker()
Простая полная замена
masker.add_pattern("my_id", r"\d{4}-\d{4}", full_mask_replacer) print(masker.mask("ID: 1234-5678")) # 'ID: ***'
Замена только значения в паре ключ=значение
masker.add_pattern("api_key", r"(?i)(api_key)(\s*[:=]\s*)(\S+)", key_value_mask_replacer) print(masker.mask("api_key = abcd1234")) # 'api_key = ***'
Если replacer не указан, используется full_mask_replacer
masker.add_pattern("simple", r"\b\d{3}\b") print(masker.mask("code 123")) # 'code ***'
Загрузка конфигурации из JSON/YAML config.json:
{ "mask_char": "#", "mask_length": 4, "audit_enabled": false, "patterns": { "custom_key": { "regex": "(?i)(my_token)(\s*[:=]\s*)(\S+)", "replacer": "key_value" } } }
Использование:
from maskinfly import Masker
masker = Masker.from_config("config.json") print(masker.mask("my_token = abc123")) # 'my_token = ####'
Поддерживаются файлы .yaml / .yml (требуется установленный PyYAML). Допустимые значения replacer: "full_mask", "email_mask", "key_value".
Аудит с JSON и кастомным обработчиком
from maskinfly import AuditLogger, Masker
def custom_audit_handler(entry): # Отправить entry в Elasticsearch, Kafka, файл и т.д. print(f"[CUSTOM] {entry}")
audit = AuditLogger( format='json', custom_handler=custom_audit_handler, app_name="my_app", safe_mode=False # обычный режим ) masker = Masker(audit_enabled=True, audit_logger=audit) masker.mask({"api_key": "ABCD1234"})
В лог попадает JSON с полями: timestamp, path, reason, type, app_name, hash (SHA256 исходного значения).
from maskinfly import Masker
masker = Masker() d = {} d["self"] = d # цикл result = masker.mask(d) print(result) # {'self': '***'}
Работа с pydantic.SecretStr
from pydantic import SecretStr from maskinfly import mask
secret = SecretStr("very_secret") masked = mask(secret) print(masked) # '***'
CLI утилита После установки становится доступна команда maskifly.
Команда mask Маскирует данные в JSON/YAML файле и сохраняет результат.
maskifly mask input.json -o output.json --audit --mask-char '#' --mask-length 5 --deep-mask
Параметры:
input – путь к входному файлу (JSON или YAML).
-o, --output – путь к выходному файлу (если не указан, вывод в stdout).
--audit – включить аудит (логи в stderr).
--config – путь к JSON/YAML конфигурации для Masker.
--mask-char – символ маски (по умолчанию *).
--mask-length – длина маски (по умолчанию 3).
--deep-mask – рекурсивно маскировать внутри чувствительных ключей.
Пример:
maskifly mask secrets.yaml --deep-mask --audit -o masked.yaml
Команда check Сканирует файл на наличие чувствительных данных без их изменения.
maskifly check input.json --format json
Параметры:
input – путь к входному файлу.
--format – формат вывода: text (по умолчанию) или json.
Пример вывода (text):
Найдены потенциально чувствительные данные:
- Путь: password Тип: key, причина: sensitive_key (пример: secret123)
- Путь: token Тип: string, причина: pattern:token (пример: abc123)
Декоратор @mask_output Автоматически маскирует возвращаемое значение функции, используя все возможности mask().
from maskinfly import mask_output
@mask_output(audit_enabled=True, mask_char='#', mask_length=5, deep_mask=True) def get_user(): return {"name": "Bob", "token": "xyz789", "credentials": {"password": "pass"}}
result = get_user()
{'name': 'Bob', 'token': '#####', 'credentials': {'password': '#####'}}
Декоратор поддерживает синхронные и асинхронные функции.
Autograd и нейронные сети (подробно) Тензоры и операции
from maskinfly import Tensor
a = Tensor([[1.0, 2.0], [3.0, 4.0]], requires_grad=True) b = Tensor([[5.0, 6.0], [7.0, 8.0]], requires_grad=True)
c = a.matmul(b) # матричное умножение loss = c.sum() # скалярная потеря loss.backward() # вычисление градиентов
print(a.grad) # [[5., 7.], [5., 7.]] print(b.grad) # [[4., 4.], [6., 6.]]
Дополнительные операции:
x = Tensor([1.0, 2.0, 3.0], requires_grad=True) y = (x ** 2).relu().exp().log() y.mean().backward() print(x.grad)
Объединение тензоров
t1 = Tensor([1, 2], requires_grad=True) t2 = Tensor([3, 4], requires_grad=True) stacked = Tensor.stack([t1, t2], axis=0) # форма (2,2) stacked.sum().backward()
Управление градиентами
from maskinfly.autograd import no_grad, is_grad_enabled
with no_grad(): d = a + b # здесь градиенты не вычисляются
print(is_grad_enabled()) # True
Построение нейронных сетей
from maskinfly import nn, optim from maskinfly.tensor import Tensor import numpy as np
model = nn.Sequential( nn.Linear(10, 20), nn.ReLU(), nn.Linear(20, 1) )
optimizer = optim.SGD(model.parameters(), lr=0.01)
x = Tensor(np.random.randn(32, 10)) y = Tensor(np.random.randn(32, 1))
for epoch in range(100): pred = model(x) loss = nn.mse_loss(pred, y) optimizer.zero_grad() loss.backward() optimizer.step()
Лицензия MIT. Подробнее в файле LICENSE.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file maskinfly-0.2.2.tar.gz.
File metadata
- Download URL: maskinfly-0.2.2.tar.gz
- Upload date:
- Size: 32.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1f6997969b21fffa66114934e6b79f997d7fdaedce2243bfb7f942c2d77251af
|
|
| MD5 |
9d94457d8d346d147bd6337cb43feeaa
|
|
| BLAKE2b-256 |
593beb760cf1e5bd19027a6fd8cb8e867fcb1753cecfd15f79b431d5b3704302
|
File details
Details for the file maskinfly-0.2.2-py3-none-any.whl.
File metadata
- Download URL: maskinfly-0.2.2-py3-none-any.whl
- Upload date:
- Size: 22.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ced11a730d6adadecff7c69a9a2d94d82c106fdc67a928309e7d7ffe2399993d
|
|
| MD5 |
af7cfcd69e10c9eb672b19b28c8a3cd1
|
|
| BLAKE2b-256 |
fa5317a040aa49bb47417e763386f944121f5e92e3d7365dfdf23106f1f92fbd
|