Eu tenho um script python que está criando uma conexão ODBC. A conexão ODBC é gerada com uma cadeia de conexão. Nesta cadeia de conexão, tenho que incluir o nome de usuário e a senha para esta conexão.
Existe uma maneira fácil de ocultar essa senha no arquivo (apenas para que ninguém possa ler a senha quando estou editando o arquivo)?
Respostas:
A codificação Base64 está na biblioteca padrão e servirá para parar os surfistas:
fonte
base64
seja mais ofuscante do querot13
neste contexto. Pelo contrário,base64
tem suas características típicas (sinal de igual, ...) e, portanto, é mais fácil de detectar do que outras abordagens. Qualquer ofuscação não tem benefício prático, no entanto. Muito ruim que essa resposta seja altamente cotada. Ele apenas dá uma falsa sensação de segurança ...base64
é preferívelrot13
que seja na biblioteca padrão do Python.O Douglas F Shearer's é a solução geralmente aprovada no Unix quando você precisa especificar uma senha para um login remoto.
Você adiciona uma opção --password-from-file para especificar o caminho e ler texto sem formatação de um arquivo.
O arquivo pode estar na área do usuário protegida pelo sistema operacional. Ele também permite que diferentes usuários escolham automaticamente seu próprio arquivo.
Para senhas que o usuário do script não tem permissão de conhecer - você pode executar o script com permissão reduzida e ter o arquivo de senha de propriedade desse usuário root / admin.
fonte
Aqui está um método simples:
Isso deve ser um pouco mais seguro que a decodificação base64 - embora seja vulnerável a um descompilador py_to_pyc.
fonte
import peekabo
a senha está disponível comopeekaboo.password
(se contido peekaboo.pypassword='secret'
)cythonizing
seu script e compartilhando o binário gerado, você obterá o benefício desta resposta + adicionará outra camada de ofuscação, porque agora você tem o código C descompilado para obter a senha. Isso não é 100% seguro, mas será necessário muito trabalho para acessar os dados confidenciais que você deseja ocultar.Se você estiver trabalhando em um sistema Unix, aproveite o módulo netrc na biblioteca padrão do Python. Ele lê senhas de um arquivo de texto separado (.netrc), cujo formato é descrito aqui .
Aqui está um pequeno exemplo de uso:
fonte
A melhor solução, supondo que o nome de usuário e a senha não possam ser fornecidos em tempo de execução pelo usuário, é provavelmente um arquivo de origem separado contendo apenas a inicialização variável do nome de usuário e senha importados para o código principal. Esse arquivo precisaria ser editado apenas quando as credenciais forem alteradas. Caso contrário, se você estiver preocupado apenas com os surfistas com memória média, a codificação da base 64 é provavelmente a solução mais fácil. O ROT13 é muito fácil de decodificar manualmente, não diferencia maiúsculas de minúsculas e mantém muito significado em seu estado criptografado. Codifique sua senha e ID do usuário fora do script python. Ele decodificou o script em tempo de execução para uso.
Dar credenciais de scripts para tarefas automatizadas é sempre uma proposta arriscada. Seu script deve ter suas próprias credenciais e a conta que ele usa não deve ter acesso além do que é exatamente necessário. Pelo menos a senha deve ser longa e bastante aleatória.
fonte
Que tal importar o nome de usuário e a senha de um arquivo externo ao script? Dessa forma, mesmo que alguém se apossasse do script, não obteria a senha automaticamente.
fonte
base64 é o caminho a percorrer para suas necessidades simples. Não há necessidade de importar nada:
fonte
para ofuscação python3 usando
base64
é feito de maneira diferente:o que resulta em
e decodificando de volta para a string original
para usar este resultado onde objetos de string são necessários, o objeto de bytes pode ser convertido
para obter mais informações sobre como python3 lida com bytes (e seqüências de caracteres de acordo), consulte a documentação oficial .
fonte
Este é um problema bastante comum. Normalmente, o melhor que você pode fazer é
A) crie algum tipo de função de codificação ceasar para codificar / decodificar (apenas não rot13) ou
B) o método preferido é usar uma chave de criptografia, ao alcance do seu programa, codificar / decodificar a senha. Na qual você pode usar a proteção de arquivos para proteger o acesso à chave.
Nesse sentido, se o aplicativo for executado como um serviço / daemon (como um servidor da web), você poderá colocar sua chave em um keystore protegido por senha com a entrada de senha como parte da inicialização do serviço. Um administrador precisará reiniciar o aplicativo, mas você terá uma boa pretensão para as senhas de configuração.
fonte
Seu sistema operacional provavelmente fornece recursos para criptografar dados com segurança. Por exemplo, no Windows, há DPAPI (API de proteção de dados). Por que não pedir suas credenciais ao usuário na primeira vez em que você executa e depois esquivá-las criptografadas para execuções subsequentes?
fonte
Aproximação mais caseira do que converter autenticação / senhas / nome de usuário em detalhes criptografados. FTPLIB é apenas o exemplo. " pass.csv " é o nome do arquivo csv
Salve a senha no CSV como abaixo:
nome do usuário
senha do usuário
(Sem cabeçalho da coluna)
Lendo o CSV e salvando-o em uma lista.
Usando os elementos da lista como detalhes da autenticação.
Código completo.
fonte
Aqui está o meu trecho para tal coisa. Você basicamente importa ou copia a função para o seu código. O getCredentials criará o arquivo criptografado se ele não existir e retornará uma descrição, e o updateCredential será atualizado.
fonte
Coloque as informações de configuração em um arquivo de configuração criptografado. Consulte essas informações no seu código usando uma chave. Coloque essa chave em um arquivo separado por ambiente e não a armazene com seu código.
fonte
Você conhece pit?
https://pypi.python.org/pypi/pit (somente py2 (versão 0.3))
https://github.com/yoshiori/pit (funcionará no py3 (versão atual 0.4))
test.py
Corre:
~ / .pit / default.yml:
fonte
/usr/lib/python3.7/site-packages/pit.py:93: YAMLLoadWarning: calling yaml.load() without Loader=... is deprecated, as the default Loader is unsafe. Please read https://msg.pyyaml.org/load for full details. return yaml.load(open(Pit._config))
Se estiver executando no Windows, você pode considerar o uso da biblioteca win32crypt. Ele permite o armazenamento e a recuperação de dados protegidos (chaves, senhas) pelo usuário que está executando o script, portanto, as senhas nunca são armazenadas em texto não criptografado ou no formato ofuscado no seu código. Não tenho certeza se existe uma implementação equivalente para outras plataformas, portanto, com o uso estrito do win32crypt, seu código não é portátil.
Acredito que o módulo pode ser obtido aqui: http://timgolden.me.uk/pywin32-docs/win32crypt.html
fonte
Uma maneira de fazer isso é a seguinte:
No shell python:
Em seguida, crie um módulo com o seguinte código:
Depois de fazer isso, você pode importar minha senha diretamente ou importar o token e a cifra para descriptografar conforme necessário.
Obviamente, existem algumas falhas nessa abordagem. Se alguém tiver o token e a chave (como teriam se tivesse o script), poderá descriptografar facilmente. No entanto, ele ofusca e, se você compilar o código (com algo como Nuitka), pelo menos sua senha não aparecerá como texto sem formatação em um editor hexadecimal.
fonte
Isso não responde exatamente à sua pergunta, mas está relacionado. Eu adicionaria como comentário, mas não era permitido. Estou lidando com esse mesmo problema e decidimos expor o script para os usuários que usam Jenkins. Isso nos permite armazenar as credenciais do banco de dados em um arquivo separado, criptografado e protegido em um servidor e não acessível a não administradores. Também nos permite um atalho para criar uma interface do usuário e limitar a execução.
fonte
Você também pode considerar a possibilidade de armazenar a senha fora do script e fornecê-la em tempo de execução
por exemplo, fred.py
que pode ser executado como
Camadas extras de "segurança através da obscuridade" podem ser obtidas usando
base64
(como sugerido acima), usando nomes menos óbvios no código e distanciando ainda mais a senha real do código.Se o código estiver em um repositório, geralmente é útil armazenar segredos fora dele , para que você possa adicioná-lo a
~/.bashrc
(ou a um cofre ou a um script de inicialização, ...)e mude
fred.py
paradepois faça login novamente e
fonte
Por que não ter um xor simples?
Vantagens:
Chego ao ponto em que reconheço simples strings b64 para palavras comuns e rot13 também. Xor tornaria muito mais difícil.
fonte
fonte
Existem vários utilitários ROT13 escritos em Python na 'Net - apenas o google para eles. O ROT13 codifica a string offline, copia-a na fonte, decodifica no ponto de transmissão.
Mas isso é realmente uma proteção fraca ...
fonte