Pregunta

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

Aclaración: Fácil significa agregar la unidad al proyecto, agregando máx. 5 líneas de código donde se lee el archivo de configuración y se hace con él. 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. Por lo tanto, usar hashes no ayuda. El motor db comprueba si la contraseña es válida, no la aplicación.

¿Fue útil?

Solución

Secundo la recomendación para la biblioteca DCPCrypt de David Barton. Lo he usado con éxito en varios proyectos, y no tardará más de 15 minutos después de haber leído los ejemplos de uso. Utiliza la licencia MIT, por lo que puede usarla libremente en proyectos comerciales o de otra manera. DCPCrypt implementa una serie de algoritmos, incluyendo Rijndael, que es AES.

También hay muchas implementaciones independientes de Google (unidad única): la pregunta es en cuál confía, a menos que esté preparado para verificar la corrección de una biblioteca en particular.

Otros consejos

Para propósitos de autenticación típicos, no necesita almacenar las contraseñas, solo necesita verificar si la contraseña ingresada 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 introducida es correcta.

El almacenamiento de contraseñas cifradas puede ser peligroso porque si alguien obtiene su "maestro" contraseña pueden recuperar las 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 de Delphi entre las que puede elegir.

Creo que Turbopower LockBox es una excelente biblioteca para la criptografía:

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

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

TOndrej tiene el enfoque correcto. Nunca debe almacenar una contraseña con un cifrado reversible. Como se señaló correctamente, si su "maestro" alguna vez se comprometió la clave, todo el sistema se ve comprometido. El uso de un hash no reversible, como MD5, es mucho más seguro y puede almacenar el valor del hash como texto claro. Simplemente hash la contraseña ingresada y luego compárela con el hash almacenado.

Siempre he usado Turbopower Lockbox. Funciona bien, y 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/

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

Al contrario de un comentario anterior, la implementación de AES por parte de LB3 es totalmente compatible con el estándar.

He usado esta biblioteca , muy rápida de agregar. Pero wiki muestra algunas soluciones más.

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

Lo que quieres es un hash unidireccional.

Solo un recordatorio.

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

PERO

si necesita que sea totalmente compatible con las especificaciones de Rinjdael, olvide los componentes libres, son un poco `` pésimos '' la mayor parte del tiempo.

Como otros han señalado, para fines de autenticación, debe evitar almacenar las contraseñas utilizando cifrado reversible, es decir, solo debe almacenar el hash de la contraseña y verificar el hash de la contraseña proporcionada por el usuario contra el hash que ha almacenado. Sin embargo, ese enfoque tiene un inconveniente: es vulnerable a los mesa arcoiris , en caso de que un atacante se apodere de su base de datos de almacenamiento de contraseñas.

Lo que debe hacer es almacenar los hashes de un valor de sal preseleccionado (y secreto) + la contraseña. Es decir, concatene el salt y la contraseña, haga un hash del resultado y almacene 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 mesa del 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 sin cifrar, por lo que en lugar de almacenar hash (salt + contraseña) debe almacenar y verificar el hash (salt + hash (contraseña)), 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 lo hacen) reutilice la misma contraseña para múltiples propósitos.

Recomiendo usar algún tipo de sal. No almacene criptografía (contraseña) en el archivo de configuración, pero en lugar de esta tienda criptografía (salt + contraseña). Como 'sal' puede usar algo que se requiere para abrir la base de datos, por ejemplo. db_name + nombre_usuario. Para la función de cripta, puede usar algún algoritmo conocido como AES, Idea, DES o algo tan simple como exportar cada byte con byte de alguna otra cadena, esa cadena será su clave. Para hacerlo más diferente para resolver, puedes usar algunos bytes aleatorios y almacenarlos.

Así que para almacenar:

  1. init_str: = 5 bytes aleatorios
  2. new_password: = salt + password // salt: = db_name + user_name
  3. crypted_password = xor_bytes (init_str + new_password, 'my keyphrase')
  4. crypted_password: = init_str + crypted_password
  5. almacena crypted_password en la configuración, ya que serán bytes que puedes hexificar o basular64

Y para conectar: ??

  1. datos divididos leídos desde config en init_str y crypted_password
  2. new_password = xor_bytes (init_str + crypted_password, 'my keyphrase')
  3. contraseña: = eliminar (db_name + user_name) de new_password

Nick tiene razón, por supuesto. Supongo que sabes lo que estás haciendo cuando dices que quieres dedicar los 15 minutos a implementar una solución de seguridad. La biblioteca DCPCrypt también implementa una serie de algoritmos de hash si decides seguir esa (mejor) ruta.

Un par de soluciones:

  • No guarde la contraseña en absoluto. Si la base de datos soporta integrado autenticación, úsala. El proceso se puede configurar para ejecutarse con un específico identidad, y ser automáticamente autenticado por la base de datos
  • Usar almacenes de certificados de Windows y un certificado para encriptar su contraseña. Si almacena la clave utilizada para la cripta. su contraseña en su aplicación, tienes muy poca seguridad de todos modos, También tienes que proteger la clave.

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

Básicamente hay dos formas de hacer esto:

  1. Almacénelo en un archivo cifrado EFS .
  2. Almacénelo en el almacenamiento local seguro .

Internet Explorer usa 2. Pero si puede obtener acceso local, puede descifrar tanto 1. como 2. si tiene la clave maestra y el algoritmo correctos (por ejemplo, iepv puede obtener las contraseñas de Internet Explorer).

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

--jeroen

La demostración de este Embarcadero proporciona un sistema simple pero lo suficientemente fuerte para la mayoría de las aplicaciones: https://edn.embarcadero.com/article/28325

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top