Encriptar un campo de una tabla

1,165 views
Skip to first unread message

PETACA

unread,
Dec 24, 2011, 6:22:14 AM12/24/11
to Comunidad de Visual Foxpro en Español
Hola a todos. Necesito al entrar el sistema solicitar al usuario un
nombre y contraseña.
Esta contraseña tiene que estar encriptada o que la tabla no la pueda
abrir cualquiera desde fuera
del sistema usando algun programa externo que pueda hacer esto.
Si alguien tiene alguna funcion de encriptación o de como proteger una
tabla desde ya estoy muy agradecido.
Saludos y Feliz Navidad

Carlos Miguel FARIAS

unread,
Dec 24, 2011, 7:44:29 AM12/24/11
to publice...@googlegroups.com
Más que encriptar, lo que tienes que hacer es hashear tu contraseña y guardarla asi.
Fijate que (si mal no recuerdo) podes usar SYS(2007,...) o algo asi

Fabricio

unread,
Dec 24, 2011, 12:18:57 PM12/24/11
to Comunidad de Visual Foxpro en Español
Hola Petaca

Por lo general cuando uno comienza a gatear en el mundo de la
programación comete el error de crear la tabla de usuarios con los
campos separados, tales como ID, Nombre, Clave, Nivel, entre otros, lo
que facilita romper la seguridad de la aplicación, ya que el ataque se
centraría en el campo clave que es el que comúnmente se encripta,
dejando sin encriptar los otros, es cierto que hay muchos métodos de
encriptación que son difíciles de decodificar, pero si logro
identificar mi usuario, puedo copiar mi contraseña al registro de otro
usuario y de esta forma acceder al sistema con los provilegios de otro
usuario.

Lo que hace ya muchos años se me ocurrió a mi fue crear la tabla de
usuarios con un solo campo donde concateno toda la información, lego
desordeno el texto y por último lo encripto. también diseñé mi propio
método de encriptación, pasé muchas horas de varios días probandola,
viendo que caracteres aparecen ya encriptada la cadena y que tan fácil
podría ser desencriptarla, hasta que por fin di con las combinaciones
que satisfacían mi necesidad. En la web puedes encontrar algoritmos
muy buenos como el BlowFish, otra forma de encriptar es la combinación
de una palabra adicional que se combina con la cadena a encriptar,
dificultando aún más el proceso de desencriptado, ya que dos cadenas
encriptadas con el mismo algoritmo no tendrán el mismo caracter
encriptado para cierta letra del alfabeto. Espero no dejarte perdido
con tanto bla, bla.

Así que mi recomendación es que pongas en un solo campo la información
del usuario para complicarle la vida a cualquiera que intente violar
tu seguridad.

Recuerda que al concatenar todos los datos en un solo campo el ID del
usuario debes dejarlo siempre al inicio de la cadena, de lo contrario
no podrás localizar a los usuarios en la tabla.

Saludos

Fabricio

ZeRoberto

unread,
Dec 24, 2011, 12:21:49 PM12/24/11
to publice...@googlegroups.com
Jajajaja me hicite recordar a la aplicacion de un amigo se hacia exactamente lo que tu dices copiar la clave al usuario que uno deseaba entra con su nivel :D

Saludo

Walter R. Ojeda Valiente

unread,
Dec 24, 2011, 2:47:13 PM12/24/11
to publice...@googlegroups.com
Hola Petaca

Tienes tres posibilidades aquí:

1. Encriptar el nombre del usuario y su password. El proceso completo sería:
    a. Encriptas el nombre del usuario y el password del usuario
    b. Guardas esos datos encriptados en una tabla
    c. Cuando alguien quiere ingresar a tu sistema, le pides su nombre y password
    d. Encriptas el nombre y el password introducidos
    e. Los comparas con los que tienes guardados en la tabla
    f. Si son exactamente iguales, le permites el acceso

2. Guardar en una tabla el checksum (suma de control). El proceso completo sería:
    a. Usando la función SYS(2007) y una semilla de número primo obtienes un checksum
    b. Guardas ese checksum en una tabla
    c. Cuando alguien quiere ingresar a tu sistema, le pides su nombre y password
    d. Usas la función SYS(2007) y la misma semilla anterior para hallar el checksum del nombre y el password introducidos
    e. Los comparas con los que tienes guardados en la tabla
    e. Si son exactamente iguales, le permites el acceso

3. Una combinación de las dos anteriores

La ventaja de la opción 1. es que si tú estás usando una función propia de encriptación podrías eventualmente efectuar el proceso inverso y conocer cual es el nombre y el password del usuario. La desventaja es que si un hacker conoce el nombre del usuario aunque no conozca su password podría a fuerza de pruebas y errores alguna vez descubrir ese password.

La ventaja de la opción 2. es que es imposible para un hacker común viendo solamente un número saber cual es el nombre y el password del usuario, haga lo que haga no podrá descubrirlo. La desventaja es que si *tú* alguna vez necesitas conocerlo tampoco lo lograrás.

La opción 3. funcionaría de la siguiente manera: Hallas el checksum con la función SYS(2007) y luego guardas ese valor encriptado en una tabla. En ese caso puedes estar tranquilo, ni la CIA podrá descubrirlo (y tampoco tú si alguna vez necesitas verlo desencriptado).

Funciones propias de encriptación hay millones, la más sencilla se basa en simplemente reemplazar un caracter por otro. Los mejores algoritmos son aquellos en los cuales un caracter no es siempre reemplazado por el mismo caracter, ya que esos se descubren muy facilmente. Por ejemplo, si cada vez que aparece la letra "A" la reemplazas por la letra "K" en pocos minutos alguien con experiencia lo descifrará. Una función elemental de encriptación y desencriptación sería la siguiente:

FUNCTION Encriptar
LParameters tcTexto, tnOrden
Local lcTextoEncriptado, lnI, lcCaracter
 
lcTextoEncriptado = ""

For lnI = 1 to Len(tcTexto)
  lcCaracter = Chr(Asc(SubStr(tcTexto, lnI, 1)) + iif(tnOrden == 1, 1, -1) * lnI)
  lcTextoEncriptado = lcTextoEncriptado + lcCaracter
Next lnI

Return(lcTextoEncriptado)
*
*

Que la invocarías así:

lcNombreEncriptado = Encriptar("Petaca", 1)

para encriptar el texto, y para desencriptarlo:

lcNombreNormal = Encriptar(lcNombreEncriptado, 0)

Desde luego te aconsejo que utilices algún algoritmo más difícil de descubrir ya que el que usa esa función es demasiado elemental.

Si vas a usar la función SYS(2007) lo aconsejable es que uses de semilla un número muy grande y si es primo mucho mejor, algo como:

? SYS(2007, "Petaca", 29753)

Saludos.

Walter.






















> Date: Sat, 24 Dec 2011 03:22:14 -0800
> Subject: [vfp] Encriptar un campo de una tabla
> From: fabian...@arnet.com.ar
> To: publice...@googlegroups.com
Reply all
Reply to author
Forward
0 new messages