En estos dos artículos ya habíamos visto las ventajas de que nuestras aplicaciones y nuestras bases de datos sean shareware, las trampas que pueden usar los usuarios para usarlas indefinidamente y las formas de protección.

https://firebird21.wordpress.com/2014/01/23/bases-de-datos-shareware/

https://firebird21.wordpress.com/2014/01/24/bases-de-datos-shareware-2/

Ahora veremos el código fuente que nos permitirá protegerlas. Bueno, al menos otorgarles un nivel razonable de protección porque es imposible una protección que sea 100% efectiva contra el 100% de las personas, siempre habrá alguien que tendrá los conocimientos y el tiempo libre suficientes como para romper cualquier protección.

Encriptando los datos

Evidentemente, para que cualquier método de protección funcione los datos deben encontrarse encriptados o de lo contrario será muy fácil romper la protección.

Se llama “encriptar” al hecho de someter un texto legible a un algoritmo que lo convierta en texto ilegible. Hay millones de métodos para encriptar texto y tú puedes crear el tuyo propio si quieres, solamente debes asegurarte de que funcione siempre.

Un método muy simple es convertir cada letra en la siguiente. Por ejemplo la palabra ‘FIREBIRD’ quedaría convertida en ‘GJSFCJSE’. Puede servir … pero solamente ante gente cuyos conocimientos de criptografía (o sea: el arte de encriptar texto) sean nulos. Porque cualquier criptógrafo en la primera lección ya aprendió como descifrar ese texto.

Un método un poco más complicado es pasar cada letra no a la siguiente, sino a la que está a “n” lugares de su posición. Es decir, para la primera letra, la siguiente. Para la segunda letra, la que está a dos lugares. Para la tercera letra, la que está a 3 lugares, etc. Usando este método la palabra ‘FIREBIRD’ quedaría convertida en ‘GKUIGOYL’. También podría funcionar … contra gente que tiene nulos conocimientos de criptografía.

Un método aún más complicado es usar un número arbitario que sea bastante largo como para que el trabajo de descubrirlo sea inmenso. Como en nuestro ejemplo el texto tiene solamente 8 letras entonces ese número es suficiente conque tenga 8 dígitos. Pero para un texto más largo, por ejemplo de 200 caracteres, el número debería tener como mínimo 25 dígitos para dificultarle mucho la tarea al curioso. Usaremos como número de encriptación al 25907814. Esto significa que a la primera letra le sumaremos 2, a la segunda 5, a la tercera 9, a la cuarta 0, etc.

Usando este algoritmo la palabra ‘FIREBIRD’ quedaría convertida en ‘HN[EIQSH’.

Como puedes ver nuestro número de encriptación tiene 8 dígitos. ¿Y si queremos usar ese mismo número de encriptación pero con un texto más largo? Pues simplemente cuando hayamos usado todos los dígitos volvemos al principio. Por ejemplo, al encriptar ‘FIREBIRD SQL’ obtendríamos: ‘HN[EIQSH”XZL’. O sea, a la primera letra le sumamos 2, a la segunda 5, a la tercera 9, etc. Cuando hayamos usado los 8 dígitos volvemos a sumar 2, luego 5, luego 9, etc.

¿Quiéres hacerlo más complicado?

Bueno, entonces la primera vez que usas tu número de encriptación multiplicas cada dígito por 1. La segunda vez multiplicas por 2, la tercera vez por 3, etc.

Entonces, la primera vez usarías: 2, 5, 9, 0, 7, 8, 1, 4

La segunda vez usarías: 4, 10, 18, 0, 14, 16, 2, 8

La tercera vez usarías: 6, 15, 27, 0, 21, 24, 3, 12

Y así sucesivamente.

¿Quieres mejorarlo aún más?

Pues entonces no multipliques la primera vez por 1, la segunda vez por 2, la tercera vez por 3, etc., sino usa un número de repetición que tenga muchos dígitos. Si por ejemplo usas el 87532149 la primera vez multiplicarás por 8, la segunda vez multiplicarás por 7, la tercera vez por 5, la cuarta vez por 3, etc.

La longitud del número de encriptación (en nuestro ejemplo: 25907814) y la del número de repetición (en nuestro ejemplo: 87532149) no tiene que ser necesariamente la misma, inclusive si sus longitudes son distintas le complicarás aún más la vida al curioso.

Si tu número de encriptación y tu número de repetición son muy largos, este es un algoritmo MUY EFECTIVO y es MUY DÍFICIL que lo puedan descubrir. El gran problema para los curiosos es que las secuencias solamente se repiten luego de miles de iteraciones y como el texto que se está encriptando en cada iteración es distinto entonces es dificilísimo desentrañar el algoritmo.

Usando una tabla de CONTROL o de CONFIGURACIÓN

Para que el algoritmo sea muy efectivo lo que debes hacer es tener en tu Base de Datos una tabla que tenga una sola fila. A esa tabla la puedes llamar CONTROL, CONFIGURACIÓN, PARÁMETROS, o como te guste. Su objetivo es tener guardados en ella valores que se requerirán conocer para usar la Base de Datos y sin dichos valores no se podrá usar. Por ejemplo:

  • Moneda en la cual están los importes (dólares, euros, etc.)
  • Si los códigos se generarán en forma automática
  • Si usan código de barras
  • El formato en el cual se muestran las cantidades
  • El formato en el cual se muestran los importes
  • etc.

Y además de todas esas columnas guardas también la fecha de inicio, la fecha de fin, la fecha última y la cantidad de ejecuciones.

Luego, encriptas todo según el algoritmo que hayas elegido emplear:

CON_CHECKS = HallarChecksum(CON_MONEDA || CON_CODAUT || CON_CODBAR || CON_FORCAN || CON_FORIMP || CON_FECINI || CON_FECFIN || CON_FECULT || CON_CANTID)

lcFila = Encriptar(CON_MONEDA || CON_CODAUT || CON_CODBAR || CON_FORCAN || CON_FORIMP || CON_FECINI || CON_FECFIN || CON_FECULT || CON_CANTID || CON_CHECKS)

y guardas la fila que como está encriptada solamente servirá si se la desencripta. Si el usuario tramposo borra esta fila no podrá usar la Base de Datos porque para usarla se requieren de los valores que se guardan en esta fila.

La última columna es un “checksum”, es decir un número que nos indica si el contenido de esa fila lo hemos guardado nosotros o lo guardó un tramposo. Puedes leer más en este artículo:

https://firebird21.wordpress.com/2013/07/11/detectando-modificaciones-no-autorizadas-a-nuestras-tablas/

Por lo tanto, si se borra la fila, no se puede usar la Base de Datos. Y si se modifica la fila desde afuera de nuestra aplicación, tampoco se puede usar la Base de Datos.

Artículos relacionados:

Bases de datos shareware

Bases de datos shareware (2)

Detectando modificaciones no autorizadas a nuestras tablas

El índice del blog Firebird21