Executando verificação de segurança...
1

Ajuda com criptografia

Precisava de ajuda com uma questão, estou desenvolvendo um projeto web e eu precisava armazenar senhas no meu banco que eu utilizarei futuramente na aplicação, portanto, não posso usar ferramentas como bcrypt, mas não queria deixar esses dados armazenados no banco sem segurança.

Como eu poderia salvar eles de uma maneira na qual eu consiga usar depois sem deixa-lo exposto no banco de dados?

Carregando publicação patrocinada...
2

Meus 2 cents:

Vamos colocar assim: voce tem uma informacao sensivel e gostaria de proteger.

Existem alguns caminhos:

  • Um cliente que tinha informacoes confidenciais, onde TUDO era sensivel (codigo e dados) optou pelo seguinte caminho: a particao era criptografada (LVM + LUKS) e liberada durante o boot atraves de chave no pendrive + chave digitada + chave online. Era chato mas garantia que em caso de sinistro ninguem teria acesso ao conteudo do HD (e com a parte online garantia uma forma de bloquear remotamente). Apos o boot um programa rodava em daemon garantindo que ninguem pudesse fazer login manual no console, tty e liberava ssh apenas em certas circunstancias. Mas veja que neste caso, uma vez o sistema no ar e a particao aberta os dados estao acessiveis 'limpos', sem criptografia - a protecao fica por conta da dificuldade de acesso ao banco local e nao ter conexao remota.

  • Nem tudo eh tao eh tao sensivel, apenas alguns campos - neste caso o mais interessante eh usar a criptografia "simetrica" (o mais comum), ou seja, aquele onde tem "ida e volta". Procure no google por "protect field symmetric encryption".

Um exemplo é o modulo pgcrypto do postgresql - a parte ruim eh que isto eh baseado em shared secret, entao voce vai ter de ser criativo na forma de guardar a chave.

Eh possivel criar metodos usando chaves assimetricas tambem - um pouco mais complexo.

Mas a ideia geral eh esta - ideias mais especificas podem surgir se compartilhar mais informacoes (linguagem, banco de dados e sistema operacional)

PS: Dependendo do que voce precisa, a forma LVM+LUKS eh a mais interessante (p.ex. roubo fisico de dados), pois ai voce nao precisa mexer nada na aplicacao. Se partir para a criptografia por dado (p.ex. campo ou tabela) voce ira precisar tratar manualmente isso na aplicacao, p.ex. na gravacao e recuperacao, na forma de pesquisa, nos indices, etc (p.ex. como pesquisar um campo criptografado ? tem formas como embendings, mas vale a pena ? etc).

2

não posso usar ferramentas como bcrypt, mas não queria deixar esses dados armazenados no banco sem segurança.

Qual o motivo de você não poder usar ferramentas que estão evoluindo há décadas para garantir a segurança de todos?

O problema é que eu preciso ter acesso a leitura dessa senha, não só de maneira comparativa

E qual o real motivo de você precisar ler isso depois?

Você precisa autenticar com um sistema externo com ela?

não consigo pois são informações dinâmicas que o usuário irá informar ao sistema

Que informações são dinâmicas?

e a aplicação pode ter N números de usuários e para cada usuário pode se ter N senhas registradas

A princípio isso não seria um problema, em vez de fazer uma única verificação faria um loop

Para te ajudarmos você precisa explicar melhor seu problema, sem o contexto completo não há como ajudar-te

1

Toma e vai pesquisar sobre: AES-256 (Criptografia Simétrica), esse assunto você esta no lugar errado,só parece que aqui tem muita gente que sabe.

1

Vendo os comentários acredito que o que você precisa é um apikey
Sempre que o usuário precisar de acessar um conteúdo restrito ele deve fornecer essa informação.

É muito utilizado pra api.
Geralmente é um token que possui prazo pra expirar.
Você pode gerar um token quando o usuário logar, armazenar essa informação numa sessão e liberar o acesso as informações sensíveis.

Agora se precisar criptografar a informação é melhor utilizar chave dupla. Uma privada que fica com o usuário e uma pública que fica contigo. Quando o usuário precisar acessar a informação ele informar local a senha e consegue acessar o conteúdo criptografado sem que essa informação precise de trafegar no servidor. Quanto a quantidade de senhas e mudança de chave aí precisa de evoluir um pouco essa ideia.

Edit:
Lembrei de dois casos de uso que você pode pesquisar para ter ideias.
São elas armazenamento de cartão e cofre de senhas.
Armazenamento de cartão precisa de PCI Compliance, não sei dar muitos detalhes de como funciona. Mas é algo bem crítico. Se for esse o caso de uso recomendo verificar a possibilidade de armazenar criptografado com a adquirente tendo a chave privada ou armazenar o token para pagamento recorrente.

Neste último caso você salva um token que a própria adquirente fornece e a partir dele a adquirente recupera as informações no sistema deles para refazer a operação periodicamente. Não tenho informação de como a adquirente salva os dados de cartão, mas acredito que o cvv nunca é armazenado.

No caso do cofre de senhas o usuário tem a chave privada e utiliza a chave pública que você armazena para criptografar as senhas, assim somente com a chave pública ele consegue visualizar as senha armazenada. Observe que perdendo a chave privada perde-se o acesso as senhas.

Não sou especialista em nenhum dos dois casos então sugiro fortemente que pesquise mais a fundo caso a sua implementação utilize alguma informação nesse sentido.

1

Cara existem N algoritimos de criptografia, criptografia homomorfica, tabela hash, entre outros, não é comum que o próprio sistema tenha acesso as senhas de seus usuarios, até por questões de privacidade e afins, hoje todos os sistemas de senhas que eu já vi ou são feitos utilizando bcrypt ou outra tecnica que utiliza de comparações de padrões de geração do hash criado a partir dos caracteres da senha, para recuperação utiliza-se um email, mas mesmo assim não é recuperada a senha e sim é gerado uma nova senha. o que utilizam agora é o 2FA, por exemplo o itau utiliza seu sistema de token, a senha não é criptografada fica em um estado conhecido e com o sistema de tokens ela é exibida, mas o sistema propriamente dito não sabe quais caracteres a senha possui, pq somente é exibido a partir da interação 2FA do usuario. isso ao meu ver é o mais seguro no seu caso utilizar de um sistema 2FA como entrada do usuario. pq hoje os algoritimos de criptografia mais comuns fazem apenas a comparação de hash, eles não sabem como a senha é armazenada, já que armazenam o próprio hash. caso não sejam senhas pertinentes a dados sensiveis, você pode utilizar uma lógica de criptografia transposicional por exemplo onde dependa de uma chave gerada aleatóriamente, mas ai o usuario tem a responsabilidade de armazenar e cuidar desta chave. Não é o mais seguro pq muitos bruteforces já quebram uma criptografia transposicional.

1
1

não consigo pois são informações dinâmicas que o usuário irá informar ao sistema, e a aplicação pode ter N números de usuários e para cada usuário pode se ter N senhas registradas

2
1
-4
0
-4
1
0
1

talvez o termo tenha sido incorreto.

não é uma "senha", mas um dado sensível, onde, o usuário irá informar e eu terei que reutilizar essa senha para prover o serviço que a aplicação se propõe.

não quero deixar isso exposto no banco por questões de segurança, porém, eu preciso que a aplicação consiga descriptografa-lo sob demanda.

1

Pelo que voce está descrevendo, é um TOKEN.

Seu backend pode gerar um objeto JSON com todas as informações que precisa, e ae voce criptografa o JSON (com qualquer algoritmo que possa ser descriptografado). Entrega o dado criptografado pro frontend.

Pra toda vez que voce precisar usar, seu front passa o TOKEN pra aplicação, e só ela é capaz de descriptografar. Ae voce terá os dados ali.

Se preciso, implementa sua própria criptografia que só o backend é capaz de criptografar e descriptografar.