EncryptGenerator

 


Estos días he estado rompiéndome la cabeza para encriptar en mis programas los datos sensibles, los passwords que se almacenan en la base de datos, o los datos de conexión a la base de datos que en muchas aplicaciones PowerBuilder que he visto los almacenan en archivos .ini sin ninguna protección.

En un principio pensé en usar una simplificación del CrypterObject de PowerBuilder, poniendo una Clave Fija y un Vector de Iniciación fijo para usar la función SymetricEncrypt. Luego caí en la cuenta de que mis programas se suben a GitHub en archivo de texto plano y ahí iban a quedar expuestas mis claves de desencriptado, así que pensé en trasladar estas al archivo .ini como se podría hacer en una Api .Net en la que almacenaríamos los datos de conexión en el archivo de configuración AppSetting.json.

Nota Muy Importante:

Si subimos el archivo .ini de un proyecto a GitHub, subirlo sin el token de encriptación, y yo tampoco subiría ningún password aunque esté encriptado.

Pero esta opción tampoco me convencía, ya que si ponía en el mismo archivo las claves de encriptado y valores de la cadena de conexión encriptados con esas claves, cualquiera podría desencriptar esos valores.

Así que pensé en encriptar la Clave y el Vector dentro de un Json al estilo de un Token, de manera que la aplicación sólo tiene en el código una clave maestra y un vector maestro que solo sirve para desencriptar ese token que a su vez nos proporciona la clave y el vector de iniciación para encriptar y desencriptar desde nuestra app.

Un poco el esquema aplicar en una aplicación sería:

Bien, para poder aplicar este esquema en mis aplicaciones, usando claves de Maestras y Claves de Encryptado distintas, he creado esta pequeña app de ejemplo en la que se puede generar el token y leer la información del token. Tambien se puede usar para encriptar y desencriptar una vez hemos decidido nuestras claves y así poder encriptar los valores de nuestros archivos .ini, por ejemplo.

Adicionalmente, he actualizado el ejemplo que usé en el evento PowerTalks 2023 para encriptar el LogId y el LogPass en el archivo .ini de los Proyectos Nativos y PowerClient. Además he encriptado el UserPass de la plantilla JWT del proyecto PowerServer.

Para incorporar esta funcionalidad a este proyecto, simplemente he exportado el objeto n_cst_security del el ejemplo EncriptGenerator y he creado una extensión con un método de desencriptado simplificado en el que pongo las Claves Maestras como un valor fijo.



Finalmente he actualizado el ejemplo VPbAutobuild encriptado los valores que antes codificaba en Base64URL en el archivo Setup.ini.

Me he encontrado una dificultad, y es que en el Proyecto PowerServer necesito desencriptar el UserPass para inyectarlo en la clase DefaultUserStore.cs y necesitaba las claves maestras del proyecto de ejemplo para poder obtener las claves de Desencriptación del Token de la aplicación. Esto me ha obligado a añadir un segundo token en esos proyectos con esas claves, cifrado esta vez con las claves de vPbAutobuild.

En fin, no me enrollo mas, es un tema un poco lioso de explicar, os dejo enlaces de descarga al ejemplo presentado en este artículo y a los ejemplos actualizados.

Proyecto EncryptGenerator:

github.com/rasanfe/EncryptGenerator

Actualización Proyecto Reports_PowerServer:

github.com/rasanfe/Reports_PowerServer

Actualización Proyecto Visual PbAutobuild:

github.com/rasanfe/VisualPbAutobuild220


Para quien necesite esta funcionalidad en versiones anteriores de PowerBuilder:

Proyecto Visual Studio Libreria NetCore 3.1 para PowerBuilder 11.5 y 12.6:

github.com/rasanfe/archivo/.../Security.comhost

Proyecto PowerBuilder 11.5:

github.com/rasanfe/archivo/.../EncryptGenerator115

Proyecto PowerBuilder 12.6:

github.com/rasanfe/archivo/.../EncryptGenerator126

Proyecto PowerBuilder 2019:

github.com/rasanfe/archivo/.../EncryptGenerator2019

Proyecto PowerBuilder 2021:

github.com/rasanfe/archivo/.../EncryptGenerator2021


Comentarios