Guardar password sem hash (problema de segurança)

Kristian0

Power Member
Boa tarde.

Estou a fazer uma aplicação que vai utilizar um servidor de email e uma conta ja existente.
Para isso numa tabela da minha base de dados guardei:
SMTPaddress = smtp.gmail.com
SMTPusername = [email protected]
SMTPpassword = 1234 <------
SMTPportttls = 587
SMTPportssl = 465
SMTPtlsssl = yes
(dados do SMTP do gmail meramente exemplificativos)

Ora o problema está precisamente na password.
É que nao posso guardar isto pela hash porque se não na altura de fazer a autenticação o gmail não vai validar como é obvio.
Mas fico com um problema de segurança que pode corromper o email.

Alguma ideia de como posso resolver isto?
Estou a usar python (se for relevante).
 
Engraçado que no outro dia estava a pensar como é que esses serviços (que fazem a ponte de um serviço para o outro) fazem para proteger a informação sensível.
Uma das soluções que pensei na altura foi encriptar e desencriptar sempre que for usado, quem tiver acesso a db não consegue nada.. ainda assim quem tiver acesso ao código chega la..
Vou seguir o tópico para acompanhar as respostas :)
 
É como o @Nada disse, fazes tu a tua própria encriptação e guardas apenas o encriptado, convém é a encriptação ter mais dados que só a password mesmo, tipo xor da password + data de registo + a tua key, assim mesmo que BD seja comprometida o facto de meteres a data de registo ao barulho já complica imenso um bruteforce de comparação.
 
Pois esse é o método que eu tenho, faço lá uns rolling bits e xor com uma key... mas o serviço em questão vai estar a rodar na mesma máquina que a base de dados...
Logo não adianta de muito só dificulta.

Posto isto pensei em separar a aplicação web da base de dados.
Mas... lembrou me que a aplicação web que está a servir tem lá um bd_connection.php onde está user e a pass para o MySQL.
E mesmo que não estava na mesma máquina aquele file tem sempre de existir.

Portanto... estou um bocado à nora com isto.
 
mas tu nunca guardas a password em ficheiro, guardas apenas o encriptado, que quando queres usar desencriptas on the fly.

Desculpa se estou a dizer alguma coisa mal, aplicaçoes web e sql não são o meu forte.
 
mas tu nunca guardas a password em ficheiro, guardas apenas o encriptado, que quando queres usar desencriptas on the fly.

Desculpa se estou a dizer alguma coisa mal, aplicaçoes web e sql não são o meu forte.

Obrigado pela pela tua participação.

Na teoria será assim que funciona, como fazer é que já é outra historia e é isso que me está a dar a volta ao miolo.

encriptar sem ser com hash seja o que for e deixar o código “aberto” no servidos do método de encriptaçao e desencriptacao, é meio caminho para dar asneira.
 
ja percebi, estas com medo é de ter lá a formula para encriptar/desencritar, e não a password mesmo.

Mas isso não tens volta a dar, ou usas um sistema reversível ou só podes comparar a hash, não há uma terceira opção.
 
Tem de haver algumas regras e práticas de segurança que se tenham/possam implementar.
A meu ver isto assim é completamente vulnerável.

Até porque há tantos serviços a fazer isto :/

Alem disso agora até com a ligação a base de dados ficheiro preocupado, porque os dados estão lá também escarrapachados [emoji23]
 
O que eu faço é usar uma variável de ambiente.
Para além disso, se ativares 2FA no GMail, podes gerar uma App Password que só serve para aceder ao email e não dá para alterar as configurações de conta. Dessa forma, se for comprometido, consegues facilmente fazer reset ao acesso.
 
password da bd em codigo... hahaah bem vindo ao mundo web :P
Nunca perdi tempo a pensar noutra forma, foi sempre assim e ja la vao 5/6 anos.. nunca pensei nisso porque 'é o que todos fazem' mas é bom estares a pensar nisso, se chegares a alguma conclusão diz, seria engraçado ver como o pessoal contornou isso, ou não..
 
O que eu faço é usar uma variável de ambiente.
Para além disso, se ativares 2FA no GMail, podes gerar uma App Password que só serve para aceder ao email e não dá para alterar as configurações de conta. Dessa forma, se for comprometido, consegues facilmente fazer reset ao acesso.

Queres dar aqui uma ajuda pra configurar isto dessa forma?
[emoji4]


password da bd em codigo... hahaah bem vindo ao mundo web :P
Nunca perdi tempo a pensar noutra forma, foi sempre assim e ja la vao 5/6 anos.. nunca pensei nisso porque 'é o que todos fazem' mas é bom estares a pensar nisso, se chegares a alguma conclusão diz, seria engraçado ver como o pessoal contornou isso, ou não..

Pelo que me informei basicamente o meu medo é entrarem me no servidor e assim têm acesso a tudo:
- Primeira medida: separar o backend e a base de dados. [fica comprometida pois com acesso ao código do backend tem acesso ao bd_connecion.php/py]

- Segunda medida, usar um algoritmo de encriptação e desencriptação. [falha na mesma medida que o acesso ao código permite procurar o algoritmo]

-Terceira medida, ofuscar o código para produzir um “min”. [quem usa Python não pode usar este método, só change variable name]

A única forma que me lembro era se o servidor de e-mail autentica-se por SSH ou algo do género, mas disso já não percebo grande coisa, e normalmente ninguém tem servidores de email com esse nivel de configuração.
 
Não é assim tão facil.. por norma so o pc dev e o servidor é que conseguem aceder a db.. ainda assim se te entram no servidor ja tens um problema :P
 
Queres dar aqui uma ajuda pra configurar isto dessa forma?

Qual parte? A parte de usar app password em vez da password real do email é só seguir estas instruções: https://support.google.com/accounts/answer/185833?hl=en

A parte de ir buscar às variáveis de ambiente em vez de teres hardcoded no código ou na BD é de uma forma equivalente a esta:
Código:
import os
SMTP_password = os.environ['smtp_password']

Tens as vantagens que mesmo que o atacante consiga extrair ficheiros do servidor, não consegue extrair essa password. Ele precisaria de executar código. No entanto, se ele consegue executar código, também conseguiria fazer tudo de qualquer forma... Mesmo que tenhas uma encriptação xpto com a password num servidor diferente, hás-de a desencriptar. Nessa altura, bastava o atacante alterar o que estás a executar e meter lá um print(password) depois de teres usado a tua desencriptação xpto e ias ao ar.
 
Tipicamente costumo colocar a base de dados só acessível a máquina que tem a aplicação a correr. E ainda podemos acrescentar o conceito de bastion para melhorar a segurança do acesso à BD.

Isto tem a desvantagem de não conseguires usares IDEs para aceder à dita cuja.

E não resolve o teu problema da password às claras :shifteye::shifteye:
 
Back
Topo