2008-09-25 53 views
17

Necesito almacenar contraseñas de base de datos en un archivo de configuración. Por razones obvias, quiero cifrarlos (preferiblemente con AES). ¿Alguien sabe una implementación de Delphi que es fácil de introducir en un proyecto existente con> 10,000 líneas de código fuente históricamente crecido (URGH!)?Encriptación de contraseña en Delphi

Aclaración: Fácil significa agregar la unidad al proyecto, agregando un máx. 5 líneas de código donde se lee el archivo de configuración y listo. No debería tomar más de 15 minutos.

Otra aclaración: La contraseña es necesaria para crear una conexión a la base de datos, no para admitir un esquema de administración de usuarios para la aplicación. Entonces, usar hashes no ayuda. El motor de db comprueba si la contraseña es válida, no la aplicación.

+0

Qué base de datos? Hay mejores maneras de hoy en día para conectar que el uso normal, los pares de usuario/contraseña de más edad –

+0

Si está utilizando Windows, entonces se puede comprobar este artículo: [manera segura de almacenar la contraseña en Windows] [1] [ 1]: http://stackoverflow.com/questions/13145112/secure-way-to-store-password-in-windows – wittrup

Respuesta

16

En segundo lugar la recomendación para DCPCrypt library de David Barton. Lo he utilizado exitosamente en varios proyectos, y no tomará más de 15 minutos después de haber leído los ejemplos de uso. Utiliza la licencia de MIT, por lo que puede usarla libremente en proyectos comerciales y de otro modo. DCPCrypt implementa varios algoritmos, incluido Rijndael, que es AES.

También hay muchas implementaciones autónomas con googles (de una sola unidad): la pregunta es en cuál confía, a menos que esté preparado para verificar la corrección de una biblioteca en particular.

+3

DCPCrypt es genial. Lo estoy usando en muchos lugares. – gabr

+1

Por lo que vale (en un hilo tan viejo) Acabo de instalar DCPcrypt y funciona fantástico. – dpant

2

Incluso si cifras, me parece que tanto la clave de descifrado como la contraseña encriptada estarán en tu ejecutable, lo que significa que de ninguna manera es solo seguridad por oscuridad. Cualquiera puede tomar la clave de descifrado y las contraseñas encriptadas y generar las contraseñas sin procesar.

Lo que quiere es un hash de un solo sentido.

+0

El hash de una forma es ideal, pero no hay forma de descifrarlo para utilizarlo de nuevo. Parece que necesita leer la contraseña para que su aplicación pueda conectarse a la base de datos. Los hashes solo funcionan si desea verificar que obtuvo la misma contraseña que almacenó previamente. –

+0

Hashing no es una opción, necesito la contraseña para establecer una conexión con la base de datos. No tengo control sobre el DB en absoluto. – Treb

+0

Pero Nick tiene razón. Si almacena la clave en su aplicación, acaba de hacer solo (muy) más difícil descifrar la contraseña. Debes proteger la llave también. –

0

Nick tiene razón, supongo que sabe lo que hace cuando dice que quiere dedicar los 15 minutos a implementar una solución de seguridad. La biblioteca DCPCrypt también implementa una serie de algoritmos hashing si decide ir a esa (mejor) ruta.

8

creo Turbopower LockBox es una excelente biblioteca de criptografía:

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

No sé si es demasiado grande para sus usos, pero es muy fácil de usar y se puede cifrar una cadena con 5 líneas de código. Todo está en los ejemplos.

+0

Es viejo y no se mantiene. No es compatible con algunas mejoras necesarias (es decir, cifras de bloque, claves más grandes). Hay esfuerzos para actualizarlo, pero en este momento no es la biblioteca para usar. –

15

Para autenticación típica, no necesita almacenar las contraseñas, solo necesita comprobar si la contraseña introducida por el usuario es correcta. Si ese es su caso, puede almacenar una firma hash (por ejemplo, MD5) y compararla con la firma de la contraseña ingresada. Si las dos firmas coinciden, la contraseña ingresada es correcta.

Almacenar contraseñas encriptadas puede ser peligroso porque si alguien obtiene su contraseña "maestra" pueden recuperar contraseñas de todos sus usuarios.

Si decide usar MD5 puede usar MessageDigest_5.pas que viene con Delphi (al menos está incluido con mi copia de Delphi 2007). También hay otras implementaciones con código fuente Delphi que puede elegir.

+4

+1 por mencionar 'hashing' y los peligros de almacenar contraseñas. Nunca almacene contraseñas (¡ni siquiera piense en encriptarlas!). –

+2

Si está discutiendo el almacenamiento de la contraseña para las conexiones de la base de datos, ¿es necesario aplicar hash? Necesita la contraseña real para conectarse a la base de datos. ¿O está sugiriendo distribuir la contraseña de la base de datos maestra a todos sus usuarios para que ingresen? –

3

TOndrej tiene el enfoque correcto. Nunca debe almacenar una contraseña con un cifrado reversible.Como se señaló correctamente, si su clave "maestra" alguna vez se vio comprometida, todo el sistema está en peligro. Usar un hash no reversible, como MD5, es mucho más seguro y puede almacenar el valor hash como texto sin cifrar. Simplemente hash la contraseña ingresada y luego compárala con el hash almacenado.

+5

Hashing no es una opción, necesito la contraseña para establecer una conexión con la base de datos. No tengo control sobre el DB en absoluto. – Treb

1

Solo un recordatorio.

Si no necesita interoperar con otras bibliotecas de cifrado, entonces DCP o LockBox harían el trabajo.

PERO

si necesita que sea totalmente compatible con las especificaciones rinjdael, olvidar componentes libres, -son un poco "pésima" la mayor parte del tiempo.

3

Siempre he usado el Turbopower Lockbox. Funciona bien y es muy fácil de usar. De hecho, lo uso exactamente para lo mismo, almacenando una contraseña en un archivo de texto de configuración.

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

1

Como otros han señalado, con fines de autenticación que debe evitar almacenar las contraseñas usando cifrado reversible, es decir, sólo se debe almacenar el hash de la contraseña y comprobar el hash de la contraseña proporcionada por el usuario con el hash que haber almacenado Sin embargo, ese enfoque tiene un inconveniente: es vulnerable a los ataques rainbow table, en caso de que un atacante se apodere de su base de datos de la tienda de contraseñas.

Lo que debe hacer es almacenar los hash de un valor de sal pre-elegido (y secreto) + la contraseña. Es decir, concatena la sal y la contraseña, pica el resultado y almacena este hash. Al autenticarse, haga lo mismo: concatene su valor de sal y la contraseña proporcionada por el usuario, hash, luego verifique la igualdad. Esto hace que los ataques de tabla de arco iris sean inviables.

Por supuesto, si el usuario envía contraseñas a través de la red (por ejemplo, si está trabajando en una aplicación web o cliente-servidor), no debe enviar la contraseña en texto claro, así que en lugar de almacenar hash (salt + password) debe almacenar y verificar contra hash (salt + hash (password)), y hacer que su cliente haga un pre-hash de la contraseña proporcionada por el usuario y la envíe a través de la red. Esto también protege la contraseña de su usuario, en caso de que el usuario (como muchos) reutilice la misma contraseña para múltiples propósitos.

+1

Hashing no es una opción, necesito la contraseña para establecer una conexión con la base de datos. No tengo control sobre el DB en absoluto. ¡Pero gracias a la explicación detallada! – Treb

1

Lo recomiendo usando algún tipo de sal. No almacene cripta (contraseña) en el archivo de configuración, sino en la cripta de esta tienda (sal + contraseña). Como 'sal' puede usar algo que se requiere para abrir una base de datos, ej. db_name + user_name. Para la función cripta puedes usar algún algoritmo conocido como AES, Idea, DES o algo tan simple como anotar cada byte con byte de alguna otra cadena, esa cadena será tu clave. Para que sea más diferente resolver, puede usar algunos bytes aleatorios y almacenarlos.

Así que para la tienda:

  1. init_str: = 5 bytes aleatoria
  2. new_password: = sal + sal contraseña //: = + nombre_de_base_de_datos user_name
  3. crypted_password = xor_bytes (init_str + new_password, 'mi frase clave ')
  4. crypted_password: = + init_str crypted_password
  5. tienda crypted_password en config, ya que este será bytes puede hexify o base 64 tI

Y para conectar los datos

  1. divididas leídos de config en init_str y crypted_password
  2. new_password = xor_bytes (init_str + crypted_password, 'mi frase clave')
  3. contraseña: = eliminar (nombre_base_de_datos + user_name) from new_password
3

TurboPower LockBox 3 (http://lockbox.seanbdurkin.id.au/) utiliza la salazón automática. Recomiendo contra DCPCrypt de Barton porque los IV no están salados. En algunas situaciones, esta es una falla de seguridad muy grave.

Contrariamente a un comentario anterior, la implementación de AES de LB3 es totalmente compatible con el estándar.

+0

1) ¿Es estable la versión 3 ahora? 2) La licencia ha sido cambiada a GPL3 desde Mozilla, y me pregunto si tiene derecho a hacerlo. Muchos desarrolladores comerciales prefieren mantenerse alejados de las bibliotecas de GPL. –

+0

1) Para conocer el estado, visite el sitio web; 2) No, eso no es correcto. Ninguna licencia en ninguna de las dos bibliotecas LockBox ha cambiado alguna vez. LockBox 2 se lanza bajo MPL; LockBox 3 se lanza bajo LGPL3 (no GPL). LB2 y LB3 no comparten ningún código fuente común. Ningún desarrollador comercial evitaría LGPL, eso sería irracional. –

0

Un par de soluciones:

  • No guarde la contraseña en absoluto. Si la base de datos admite autenticación integrada , úselo. El proceso puede ser configurado para ejecutarse con una identidad específica, y será automáticamente autenticado por la base de datos
  • almacenes de certificados de uso de Windows y un certificado para cifrar la contraseña. Si almacena la clave utilizada para cifrar su contraseña en su aplicación, tiene muy poca seguridad de todos modos, también debe proteger la clave.
0

Debe almacenarlo en un lugar donde solo el usuario actual tenga acceso también.

Básicamente hay dos maneras de hacer esto:

  1. almacenarlo en un EFS encrypted file.
  2. Almacenarlo en el secure local storage.

Internet Explorer utiliza 2. Pero si usted puede conseguir el acceso local, puede descifrar ambos 1. y 2. si usted tiene la llave maestra correcta y el algoritmo (por ejemplo, iepv puede llegar a las contraseñas de Internet Explorer) .

Así:
Si puede, evite almacenar contraseñas.
Busque alternativas (como autenticación de Windows, servicios de directorio, etc.) primero.

--jeroen

Cuestiones relacionadas