Хороший способ (в разработке точно, а в тестах, наверняка, тоже подойдёт) — использовать отдельный тип данных для секретов, который наследуется от строки, но хранит защищённое значение в отдельном свойстве, а возвращает его только специальным явным методом.
Таким образом, ты будешь уверен, что используешь свои чувствительные данные только там, где применяешь этот метод, а во всеъх остальных местах (которые ты можешь явно даже не контролировать) оно у тебя будет печататься в защищённом виде (в логи, в консоль, в отчёты, в интерфейс через XSS-уязвимость, куда угодно — тебе плевать, там оригинального значения никогда не будет).
Пример:
secret = SensitiveData('my secret')
print(secret) # *********
print(secret.entrust()) # my secret