Recent

Author Topic: Armazenamento de chave criptográfica  (Read 7355 times)

ezlage

  • Guest
Armazenamento de chave criptográfica
« on: May 28, 2012, 08:59:02 pm »
Prezados,

Tenho três dúvidas que gostaria de esclarecer.
Estou trabalhando em um sistema que utiliza o DCP Crypt para codificar strings, streams e arquivos.
Atualmente, a chave principal encontra-se no executável, declarada como uma constante.

Code: [Select]
const
  chvl: array[0..2] of string=('chave1','chave2','chave3');

1) Isso é seguro? é possível descobrir a chave decompilando ou de alguma outra forma? há alguma maneira mais segura para se armazenar essas chaves?

2) Se alguém tentar usar de força bruta para fazer login no sistema, como ele inseriria os dados nos campos do meu programa? Lendo o endereço de memória? Pelo nome do componente? ou como?

3) Vejam este programa: http://www.4shared.com/file/giEhDQjN/omatic.html
Ele é capaz de ler e alterar valores em memória de um programa aberto.
Você digita um valor a ser buscado, depois que este valor muda, você busca novamente com o OMatic e ele identifica o endereço de memória, permitindo a você alterar o valor da variável quando quiser.
Como proteger meu programa contra isso?

Até coloquei algumas proteções que em teoria dariam certo, mas não tenho certeza.
Acho que a única que daria certo até então, é a limitação de tentativas de login, mas gostaria de saber outros meios de proteger meu programa contra o que foi citado acima.
O sistema que estou desenvolvendo necessita de segurança aprimorada, eu ficaria muito satisfeito se pudessem me esclarecer tais dúvidas.

Muito obrigado.
« Last Edit: May 28, 2012, 09:24:01 pm by ezlage »

ezlage

  • Guest
Re: Armazenamento de chave criptográfica
« Reply #1 on: May 28, 2012, 10:02:51 pm »
Alguém poderia pelo menos me ajudar a traduzir tudo isso pro Inglês?

Obrigado.

hrayon

  • Full Member
  • ***
  • Posts: 118
Re: Armazenamento de chave criptográfica
« Reply #2 on: May 28, 2012, 10:08:51 pm »
Olá!
Não sou um expert no assunto, mas vou dar minha opinião.

1)Segurança é relativo. Há editores hexadecimais que podem ler/editar qualquer coisa no executável. Você pode apenas dificultar. Se houver como armazenar on-line... mas depende da sua aplicação;

2)Por força-bruta, alguém pode, por exemplo, usar programas gerados com o AutoIt(http://www.autoitscript.com/site/autoit/) . Vírus e variantes são feitos com ele, pelo menos, para Windows;

3)Impedir, acho que não dá. Apenas dificultar. O programa que informou no link procura por valores armazenados na memória. Caberia um estudo de viabilidade para implementação de alguns testes que validem o que está na memória, apenas para o que é sensível. A implementação da validação fica por sua conta.

Ficam algumas outras dicas:
1)Pode compensar não implementar segurança nenhuma, depende do seu caso;
2)Não use apenas um ponto na sua aplicação para garantir segurança. Espalhe testes distintos em locais distintos com códigos totalmente distintos de segurança. Por exemplo, não chame no código uma mesma função de segurança mais de uma vez. E ela for violada, todos os lugares que ela é usada estarão violados;
3)Não use nomes comuns relativos à segurança para variáveis, como "login", "senha", etc. a não ser que queira fazer "honeypots";
4)Não armazene senhas, mas apenas o "hash" gerado, e compare os "hashs";
5)Faça backups.

Ah, quase ia me esquecendo... ajuda em parte do problema:
http://wiki.freepascal.org/OnGuard

Boa sorte!
Helder



ezlage

  • Guest
Re: Armazenamento de chave criptográfica
« Reply #3 on: May 29, 2012, 02:04:13 am »
Obrigado Helder.
Qualquer conclusão que eu tiver, compartilho com você aqui.

Pessoal, mais alguém que possa responder as perguntas ou passar minha postagem para o inglês?

RaphaelZ

  • Jr. Member
  • **
  • Posts: 64
Re: Armazenamento de chave criptográfica
« Reply #4 on: July 25, 2012, 10:11:31 pm »
Obrigado Helder.
Qualquer conclusão que eu tiver, compartilho com você aqui.

Pessoal, mais alguém que possa responder as perguntas ou passar minha postagem para o inglês?

Já parei uma vez para pensar no assunto; O caso é que uma coisa simples, como abrir o executável no notepad (sim, isso é possível rs), já pode revelar strings que sejam justamente sua chave de criptografia. Por maior que ela seja, se ela estiver lá, já era. Uma solução seria criptografar sua chave de criptografia. Mas como? Não pelos métodos tradicionais, mas sim por algo parecido com o seguinte:
Imagine que alguém pode ver sua chave em algum editor, algo como por exemplo 'ABC'; Bem, ele vê essa chave pois ela é uma sequência; Mas ao tentar utilizá-la, ele não consegue - porque? Porque sua chave na realidade é 'ABXYC' - o pedaço que tem o 'XY' é inserido dentro de uma função que chama a criptografia; Com isso, as duas partes da chave ficariam em sequências diferentes, em partes diferente do executável; Faça isso com várias sequências que se tornaria muito mais difícil de descobrir a chave...

Isso é só uma idéia, que deve ser elaborada na prática....

ezlage

  • Guest
Re: Armazenamento de chave criptográfica
« Reply #5 on: July 26, 2012, 05:31:19 pm »
Eu descobri algo muito útil (com ajuda do pessoal do fórum em inglês).
Usando um disassembler, TODAS as strings do programa ficam expostas.
Mas dentro da pasta do Lazarus, Components, tem o componente RX.
Adicionem o LPK dele e depois de feito, na paleta MISC do Lazarus aparece o TStrHolder.
Pelos testes que fiz, ele realmente oculta a string, talvez tenha um jeito de encontrá-la mesmo assim, mas já ajuda.
Estou com algumas idéias e implementando eu vou lançar um desafio pra ver quem consegue quebrar a segurança do meu programa.

 

TinyPortal © 2005-2018