Pergunta

Eu preciso armazenar senhas de banco de dados em um arquivo de configuração. Por razões óbvias, eu quero criptografá-los (de preferência com AES). Alguém sabe uma implementação de Delphi que é fácil de introduzir em um projeto existente com> 10.000 linhas de historicamente crescido (URGH!) Código-fonte?

Esclarecimento: meio fácil adicionando a unidade para o projeto, acrescentando máx. 5 linhas de código em que o arquivo de configuração é lido e ser feito com ele. não deve demorar mais de 15 minutos.

Outro esclarecimento: A senha é necessária, a fim de criar uma conexão com o db, não apoiar um esquema de gerenciamento do usuário do aplicativo. Então, usando hashes não ajuda. As verificações motor db se a senha é válido, não o aplicativo.

Foi útil?

Solução

Eu segundo a recomendação para David Barton DCPCrypt biblioteca . Eu usei-o com sucesso em vários projectos, e não vai demorar mais de 15 minutos depois que você ler os exemplos de uso. Ele usa licença MIT, assim você pode usá-lo livremente em projetos comerciais e de outra forma. DCPCrypt implementa um número de algoritmos, incluindo Rijndael, que é AES.

Existem muitos (unitárias) implementações stand-alone googlable também - a questão é qual você confia, a menos que você esteja preparado para verificar o correctedness de uma determinada biblioteca de si mesmo

.

Outras dicas

Para fins de autenticação típicos, você não precisa armazenar as senhas, você só precisa verificar se a senha digitada pelo usuário está correto. Se esse é o seu caso, então você pode apenas armazenar uma assinatura de hash (por exemplo, MD5) em vez e compará-lo com a assinatura da senha digitada. Se as duas assinaturas coincidir com a senha digitada está correta.

Armazenar senhas criptografadas pode ser perigoso, porque se alguém obtém sua senha "master" que pode recuperar senhas de todos os usuários.

Se você decidir usar MD5 você pode usar MessageDigest_5.pas que vem com Delphi (pelo menos ele está incluído com a minha cópia do Delphi 2007). Há também outras implementações com código fonte Delphi você pode escolher.

Eu acho Turbopower LockBox é uma excelente biblioteca de criptografia:

http://sourceforge.net/projects/tplockbox/

Eu não sei se é grande demais para seus usos, mas é muito fácil de usar e você pode criptografar uma string com 5 linhas de código. É tudo nos exemplos.

TOndrej tem a abordagem correta. Você nunca deve armazenar uma senha usando uma cifra reversível. Como foi corretamente assinalou, se sua chave "mestre" já foram comprometidos, todo o sistema é comprometido. Usando um hash não reversível, como MD5, é muito mais seguro e você pode armazenar o valor hash como texto claro. Simplesmente hash a senha digitada e, em seguida, compará-lo com o hash armazenado.

Eu sempre usuário Turbopower Lockbox. Ele funciona bem, e muito fácil de usar. Na verdade, eu usá-lo para exatamente a mesma coisa, armazenar uma senha em um arquivo de texto de configuração.

http://sourceforge.net/projects/tplockbox/

TurboPower LockBox 3 (http://lockbox.seanbdurkin.id.au/) usa salga automática. Eu recomendo contra DCPCrypt de Barton porque os IV de não estejam salgados. Em algumas situações esta é uma falha sercurity muito sério.

Ao contrário de um commment anteriormente, a implementação de AES de LB3 é totalmente compatível com o padrão.

Eu usei esse biblioteca , muito rápido a acrescentar. Mas wiki mostra um mais algumas soluções.

Mesmo se você criptografar, parece-me que a sua chave de decodificação, bem como a senha criptografada será tanto em seu executável, o que significa que de modo algum é apenas segurança por obscuridade. Qualquer um pode tomar a chave de decodificação e as senhas criptografadas e gerar as senhas matérias.

O que você quer é um hash unidirecional.

Apenas um lembrete.

Se você não necessidade de interoperar com outros libs cripta, então DCP ou LockBox iria fazer o trabalho.

MAS

Se você precisa que ele seja totalmente compatível com as especificações rinjdael, esqueça componentes livres, eles são meio "ruim" a maior parte do tempo.

Como outros apontaram, para fins de autenticação que você deve evitar armazenar as senhas usando criptografia reversível, ou seja, você só deve armazenar o hash de senha e verificar o hash da senha fornecida pelo usuário contra o hash que tenha armazenado. No entanto, essa abordagem tem uma desvantagem: é vulnerável a ataques, deve uma espera atacante get do seu banco de dados de armazenamento de senha.

O que você deve fazer é armazenar os hashes de um valor sal pré-escolhido (e secreto) + a senha. Ou seja, concatenar o sal e a senha, mistura o resultado, e guarde esse hash. Ao autenticar, fazer o mesmo - concatenar o valor sal e a senha fornecida pelo usuário, mistura, em seguida, verificar se há igualdade. Isso faz com que os ataques tabela arco-íris inviável.

Claro que, se as senhas do usuário enviar toda a rede (por exemplo, se você está trabalhando em uma aplicação web ou cliente-servidor), então você não deve enviar a senha em texto claro em toda, então ao invés de armazenar de hash (sal + senha) que você deve armazenar e verificar contra haxixe (sal + de hash (password)), e ter o seu cliente pré-hash de senha fornecida pelo usuário e envia que um em toda a rede. Isso protege sua senha de usuário, bem como, no caso do utilizador (como muitos fazem) re-utilizar a mesma senha para várias finalidades.

Eu recomendo usar algum tipo de sal. Não guarde crypt (password) no arquivo de configuração, mas insted desta cripta loja (sal + senha). 'Sal' Como você pode usar algo que é necessário para abrir banco de dados, por exemplo. db_name + nome_usuario. Para a função crypt você pode usar alguns algortithm conhecido como AES, Idea, DES, ou algo tão simples como XORing cada byte com byte de alguma outra corda, essa seqüência será a sua chave. Para torná-lo mais diferente para resolver você pode usar alguns bytes aleatórios, e armazená-los.

Assim, para armazenar:

  1. init_str: = 5 bytes aleatórios
  2. new_password: = sal + senha // sal: = db_name + user_name
  3. crypted_password = xor_bytes (init_str + new_password, 'minha frase chave')
  4. crypted_password: = init_str + crypted_password
  5. loja crypted_password em config, como isso vai ser bytes você pode hexify ou base64-lo

E se conectar: ??

  1. dados dividir lido a partir de configuração em init_str e crypted_password
  2. new_password = xor_bytes (init_str + crypted_password, 'minha frase chave')
  3. password = remove (db_name + user_name) de new_password

Nick é, naturalmente, direito - eu apenas supor que você sabe o que está fazendo quando você diz que quer gastar todo de 15 minutos sobre a implementação de uma solução de segurança. A biblioteca DCPCrypt também implementa uma série de algoritmos de hash se você decidir ir por esse (melhor) rota.

Um par de soluções:

  • Não guarde a senha em tudo. E se os suportes de banco de dados integrado autenticação, usá-lo. O processo pode ser configurado para funcionar com um específico identidade, e ser automaticamente autenticado pelo banco de dados
  • armazenamentos de certificados usar o Windows e uma certificado para criptografar a senha. Se você armazenar a chave usada para cripta sua senha em seu aplicativo, você tem muito pouco de qualquer maneira de segurança, você tem que proteger a chave também.

Você precisa armazená-lo em um lugar onde somente o usuário atual tem acccess também.

Basicamente, existem duas maneiras de fazer isso:

  1. armazená-lo em um EFS criptografado arquivo .
  2. Guarde-o na garantir o armazenamento local .

Internet Explorer usa 2. Mas se você pode ter acesso local, você pode descriptografar ambos 1. e 2., se você tem a chave mestra direita e algoritmo (por exemplo, iepv pode chegar às senhas do Internet Explorer).

Assim:
Se você puder, evite o armazenamento de senhas.
Procurar alternativas (como a autenticação do Windows, serviços de diretório, etc) em primeiro lugar.

- jeroen

Um simples, mas para a maioria das aplicações de sistema forte o suficiente é dada pela demonstração deste Embarcadero: https://edn.embarcadero.com/article/28325

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top