В первую очередь надо задать себе вопрос: от кого защищать эти пароли? Какая модель угроз? Не бывает "правильно" в сферическом вакууме, любая "правильность" бывает только в предварительных условиях и сформулированных целях.
Чаще всего для собственного приложения на собственном сервере/компьютере нет никакого смысла прятать пароли. Те же CMS массово хранят пароли от базы в открытом виде в конфиге. Распространено такие данные выносить в отдельный файл, который не вносится в используемую систему контроля версий (git и пр.), рядом кладётся пример файла, который, наоборот в репозиторий добавляется. Например, config.py и рядом config_example.py с примером фейковых данных. Это позволяет сохранить пароли и ключи от утекания в удалённые репозитории (особенно если это Open Source), позволяет не попадаться в типичную ошибку местных новичков, которые регулярно светят куски своего кода с живыми токенами, ну и заодно можно прод/тест разворачивать на одной кодовой базе - все различия будут в этом самом файле конфига.
Если же задача сделать так, чтобы хакер, хакнувший супер-пупер приложение и получивший доступ к локальным файлам, не смог украсть эту критически важную информацию. надо сделать так, чтобы она в соседних файлах вообще не хранилась. Самый простой способ её защитить - спрашивать при запуске и хранить только в памяти приложения. Конечно, это неудобно (кто наизусть будет помнить или по частям копипастить пачку логинов-паролей-токенов?), вместо этого можно реальные данные в конфиге зашифровать неким мастер-паролем, который и спрашивать при запуске. Соответственно, злоумышленник в самом плохом случае получит зашифрованные данные, которые без мастер-пароля бесполезны. Для упрощения подобных задач существуют специальные инструменты типа уже упомянутого тут vault.