In order for this site to work correctly we need to store a small file (called a cookie) on your computer. Most every site in the world does this, however since the 25th of May 2011, by law we have to get your permission first. Please abandon the forum if you disagree.
Para que este foro funcione correctamente es necesario guardar un pequeño fichero (llamado cookie) en su ordenador. La mayoría de los sitios de Internet lo hacen, no obstante desde el 25 de Marzo de 2011 y por ley, necesitamos de su permiso con antelación. Abandone este foro si no está conforme.
Para que este foro funcione correctamente es necesario guardar un pequeño fichero (llamado cookie) en su ordenador. La mayoría de los sitios de Internet lo hacen, no obstante desde el 25 de Marzo de 2011 y por ley, necesitamos de su permiso con antelación. Abandone este foro si no está conforme.
Proteccion de Archivos
-
- Mensajes: 103
- Registrado: Mié Dic 15, 2010 4:45 pm
Proteccion de Archivos
Buenas tardes a todos
Tengo un programa en el que voy a almacenar archivos DOC, PDF y/o XLS pero
son confidenciales y necesito una rutina para hacerlos ilegibles.
Lo hago con funciones de bajo nivel (FRead, FOpen,..) y les agrego al
comienzo una cadena "XXXXXX". Con esto ya no se pueden leer pero no
encuentro como volverles a quitar esa cadena y regresarlos a su estado
original y poderlos leer.
Muchas gracias por su ayuda.
Moises Leon
Tengo un programa en el que voy a almacenar archivos DOC, PDF y/o XLS pero
son confidenciales y necesito una rutina para hacerlos ilegibles.
Lo hago con funciones de bajo nivel (FRead, FOpen,..) y les agrego al
comienzo una cadena "XXXXXX". Con esto ya no se pueden leer pero no
encuentro como volverles a quitar esa cadena y regresarlos a su estado
original y poderlos leer.
Muchas gracias por su ayuda.
Moises Leon
Proteccion de Archivos
Moises,
> Tengo un programa en el que voy a almacenar archivos DOC, PDF y/o XLS pero
> son confidenciales y necesito una rutina para hacerlos ilegibles.
Lo mejor es guardarlos en una base de datos SQLite encriptada. Yo lo hago
así en un sistema de gestión documental, y es completamente seguro.
--
Un saludo,
José F. Giménez
http://www.xailer.com
http://www.xailer.info
> Tengo un programa en el que voy a almacenar archivos DOC, PDF y/o XLS pero
> son confidenciales y necesito una rutina para hacerlos ilegibles.
Lo mejor es guardarlos en una base de datos SQLite encriptada. Yo lo hago
así en un sistema de gestión documental, y es completamente seguro.
--
Un saludo,
José F. Giménez
http://www.xailer.com
http://www.xailer.info
-
- Mensajes: 103
- Registrado: Mié Dic 15, 2010 4:45 pm
Proteccion de Archivos
Desgraciadamente estoy usando DBFs
y tengo que hacer algo asi como lo que
comenté.
Gracias de quialquier forma
"Jose F. Gimenez" <jfgimenez@wanadoo.es> escribió en el mensaje
news:4d0a72a1$[email=1@svctag-j7w3v3j....]1@svctag-j7w3v3j....[/email]
> Moises,
>
>> Tengo un programa en el que voy a almacenar archivos DOC, PDF y/o XLS
>> pero
>> son confidenciales y necesito una rutina para hacerlos ilegibles.
>
> Lo mejor es guardarlos en una base de datos SQLite encriptada. Yo lo hago
> así en un sistema de gestión documental, y es completamente seguro.
>
> --
> Un saludo,
>
> José F. Giménez
> http://www.xailer.com
> http://www.xailer.info

comenté.
Gracias de quialquier forma
"Jose F. Gimenez" <jfgimenez@wanadoo.es> escribió en el mensaje
news:4d0a72a1$[email=1@svctag-j7w3v3j....]1@svctag-j7w3v3j....[/email]
> Moises,
>
>> Tengo un programa en el que voy a almacenar archivos DOC, PDF y/o XLS
>> pero
>> son confidenciales y necesito una rutina para hacerlos ilegibles.
>
> Lo mejor es guardarlos en una base de datos SQLite encriptada. Yo lo hago
> así en un sistema de gestión documental, y es completamente seguro.
>
> --
> Un saludo,
>
> José F. Giménez
> http://www.xailer.com
> http://www.xailer.info
Proteccion de Archivos
Moises,
> Desgraciadamente estoy usando DBFs
y tengo que hacer algo asi como lo
> que comenté.
Siempre puedes mezclar DBF con SQLite o con culaquier otra cosa en el mismo
programa. P.ej., yo tengo una aplicación con MySQL, que además utiliza una
BD SQLite en local como caché de documentos de un sistema de gestión
documental. Es decir, los documentos se guardan en el servidor de MySQL,
pero cuando se consultan, se guarda una copia en local, en una BD de SQLite
debidamente encriptada para evitar que puedan verlos personas no
autorizadas.
En cualquier caso, lo que dices lo puedes resolver encriptando los
documentos directamente, en vez de sustituir unos pocos bytes de los mismos.
Si haces lo que has comentado, no impides que cualquiera abra los documentos
con un editor hexadecimal y pueda ver su contenido. Por cierto, la versión
2.1 de Xailer trae funciones para encriptación de datos con AES256:
XA_AES256Encrypt() y XA_AES256_Decrypt()
--
Un saludo,
José F. Giménez
http://www.xailer.com
http://www.xailer.info
> Desgraciadamente estoy usando DBFs

> que comenté.
Siempre puedes mezclar DBF con SQLite o con culaquier otra cosa en el mismo
programa. P.ej., yo tengo una aplicación con MySQL, que además utiliza una
BD SQLite en local como caché de documentos de un sistema de gestión
documental. Es decir, los documentos se guardan en el servidor de MySQL,
pero cuando se consultan, se guarda una copia en local, en una BD de SQLite
debidamente encriptada para evitar que puedan verlos personas no
autorizadas.
En cualquier caso, lo que dices lo puedes resolver encriptando los
documentos directamente, en vez de sustituir unos pocos bytes de los mismos.
Si haces lo que has comentado, no impides que cualquiera abra los documentos
con un editor hexadecimal y pueda ver su contenido. Por cierto, la versión
2.1 de Xailer trae funciones para encriptación de datos con AES256:
XA_AES256Encrypt() y XA_AES256_Decrypt()
--
Un saludo,
José F. Giménez
http://www.xailer.com
http://www.xailer.info
-
- Mensajes: 103
- Registrado: Mié Dic 15, 2010 4:45 pm
Proteccion de Archivos
Muchas gracias Jose, creo que es algo que voy a tener que aprender
"Jose F. Gimenez" <jfgimenez@wanadoo.es> escribió en el mensaje
news:4d0ca398$[email=1@svctag-j7w3v3j....]1@svctag-j7w3v3j....[/email]
> Moises,
>
>> Desgraciadamente estoy usando DBFs
y tengo que hacer algo asi como lo
>> que comenté.
>
> Siempre puedes mezclar DBF con SQLite o con culaquier otra cosa en el
> mismo programa. P.ej., yo tengo una aplicación con MySQL, que además
> utiliza una BD SQLite en local como caché de documentos de un sistema de
> gestión documental. Es decir, los documentos se guardan en el servidor de
> MySQL, pero cuando se consultan, se guarda una copia en local, en una BD
> de SQLite debidamente encriptada para evitar que puedan verlos personas no
> autorizadas.
>
> En cualquier caso, lo que dices lo puedes resolver encriptando los
> documentos directamente, en vez de sustituir unos pocos bytes de los
> mismos. Si haces lo que has comentado, no impides que cualquiera abra los
> documentos con un editor hexadecimal y pueda ver su contenido. Por cierto,
> la versión 2.1 de Xailer trae funciones para encriptación de datos con
> AES256: XA_AES256Encrypt() y XA_AES256_Decrypt()
>
>
> --
> Un saludo,
>
> José F. Giménez
> http://www.xailer.com
> http://www.xailer.info
"Jose F. Gimenez" <jfgimenez@wanadoo.es> escribió en el mensaje
news:4d0ca398$[email=1@svctag-j7w3v3j....]1@svctag-j7w3v3j....[/email]
> Moises,
>
>> Desgraciadamente estoy usando DBFs

>> que comenté.
>
> Siempre puedes mezclar DBF con SQLite o con culaquier otra cosa en el
> mismo programa. P.ej., yo tengo una aplicación con MySQL, que además
> utiliza una BD SQLite en local como caché de documentos de un sistema de
> gestión documental. Es decir, los documentos se guardan en el servidor de
> MySQL, pero cuando se consultan, se guarda una copia en local, en una BD
> de SQLite debidamente encriptada para evitar que puedan verlos personas no
> autorizadas.
>
> En cualquier caso, lo que dices lo puedes resolver encriptando los
> documentos directamente, en vez de sustituir unos pocos bytes de los
> mismos. Si haces lo que has comentado, no impides que cualquiera abra los
> documentos con un editor hexadecimal y pueda ver su contenido. Por cierto,
> la versión 2.1 de Xailer trae funciones para encriptación de datos con
> AES256: XA_AES256Encrypt() y XA_AES256_Decrypt()
>
>
> --
> Un saludo,
>
> José F. Giménez
> http://www.xailer.com
> http://www.xailer.info
Proteccion de Archivos
Hola,
Tengo Xailer 2.4.4 y necesito encriptar passwords con el método AES256.
Traté de usar las funciones que coneta jfgimenez: XA_AES256Encrypt() y XA_AES256_Decrypt() pero al encriptar un texto me regresa otro conformado por caracteres muy extraños, si trato de desencriptar el texto "encriptado", me regresa el mismo texto "encriptado". Estoy usando la misma llave para encriptar y desencripta.
¿Hay algo adicional que deba hacer?
GRACIAS Y SALUDOS
Tengo Xailer 2.4.4 y necesito encriptar passwords con el método AES256.
Traté de usar las funciones que coneta jfgimenez: XA_AES256Encrypt() y XA_AES256_Decrypt() pero al encriptar un texto me regresa otro conformado por caracteres muy extraños, si trato de desencriptar el texto "encriptado", me regresa el mismo texto "encriptado". Estoy usando la misma llave para encriptar y desencripta.
¿Hay algo adicional que deba hacer?
GRACIAS Y SALUDOS
Proteccion de Archivos
Enrique,
¿puedes poner un ejemplo que reproduzca el error?
Saludos,
José Lalín
¿puedes poner un ejemplo que reproduzca el error?
Saludos,
José Lalín
Proteccion de Archivos
Tengo el botón "btnEncriptar", que al oprimirlo encripta el valor del TEdit "txtNoEncriptado" y pone el resultado en el TEdit "txtEncriptado". El botón "btnDesencripta" desencripta el valor de "txtEncriptado" y pone el resultado en "txtNoEncriptado"
//---------------------------------------------------------- --------------------
METHOD btnEncriptarClick( oSender ) CLASS Form1
::txtEncriptado:Value = XA_AES256Encrypt(::txtNoEncriptado:Value, "Llave de prueba" )
RETURN Nil
//---------------------------------------------------------- --------------------
METHOD btnDesencriptarClick( oSender ) CLASS Form1
::txtNoEncriptado:Value = XA_AES256Decrypt(::txtEncriptado:Value, "Llave de prueba")
RETURN Nil
//---------------------------------------------------------- --------------------
- Caso #1 -> ::txtNoEncriptado:Value = "Texto para encriptar", y oprimo ::btnEncriptar, me dá como valor encriptado: "W",,, lo cual está mal
- Caso #2 -> ::txtNoEncriptado:Value = "Texto para encri", y oprimo ::btnEncriptar, me dá como valor encriptado: "í¯í¯Â°jX_...x-w?í“í‡Â",,, si lo desencripto, sí llego al texto original
- Caso #3 -> ::txtNoEncriptado:Value = "123456789h123456" y oprimo ::btnEncriptar, me dá como valor encriptado: "Â=s",,, si lo desencripto, NO llego a la cadena original (notar que la logitud del valor encriptado es 3 y el de la cadena original es 16)
Se podría pensar que funciona bien cuando la logitud del texto a encriptar es múltiplo de 16 pero no fue así en el Caso #3, en el que por cierto, si sustituyo un cero "0" por la "h" sí funciona correctamente
GRACIAS POR TU AYUDA Y SALUDOS
//---------------------------------------------------------- --------------------
METHOD btnEncriptarClick( oSender ) CLASS Form1
::txtEncriptado:Value = XA_AES256Encrypt(::txtNoEncriptado:Value, "Llave de prueba" )
RETURN Nil
//---------------------------------------------------------- --------------------
METHOD btnDesencriptarClick( oSender ) CLASS Form1
::txtNoEncriptado:Value = XA_AES256Decrypt(::txtEncriptado:Value, "Llave de prueba")
RETURN Nil
//---------------------------------------------------------- --------------------
- Caso #1 -> ::txtNoEncriptado:Value = "Texto para encriptar", y oprimo ::btnEncriptar, me dá como valor encriptado: "W",,, lo cual está mal
- Caso #2 -> ::txtNoEncriptado:Value = "Texto para encri", y oprimo ::btnEncriptar, me dá como valor encriptado: "í¯í¯Â°jX_...x-w?í“í‡Â",,, si lo desencripto, sí llego al texto original
- Caso #3 -> ::txtNoEncriptado:Value = "123456789h123456" y oprimo ::btnEncriptar, me dá como valor encriptado: "Â=s",,, si lo desencripto, NO llego a la cadena original (notar que la logitud del valor encriptado es 3 y el de la cadena original es 16)
Se podría pensar que funciona bien cuando la logitud del texto a encriptar es múltiplo de 16 pero no fue así en el Caso #3, en el que por cierto, si sustituyo un cero "0" por la "h" sí funciona correctamente
GRACIAS POR TU AYUDA Y SALUDOS
Proteccion de Archivos
Enrique,
en cuanto tenga un momento hago pruebas y te cuento.
Saludos,
José Lalín
en cuanto tenga un momento hago pruebas y te cuento.
Saludos,
José Lalín
Proteccion de Archivos
Enrique,
pues parece que sí, que la longitud de la cadena tiene que ser múltiplo de
16 para que funcione correctamente.
Puedes usar la función Pad16() para asegurarte que la longitud es correcta
antes de hacer la codificación.
METHOD Button1Click( oSender ) CLASS TForm1
LOCAL cText := Pad16( "Cadena de texto para probar AES256" )
LOCAL cEnc
LogDebug( "[" + cText + "]" )
cEnc := XA_AES256Encrypt( cText, "clave" )
LogDebug( "[" + cEnc + "]" )
LogDebug( "[" + XA_AES256Decrypt( cEnc, "clave" ) + "]" )
RETURN Nil
FUNCTION Pad16( cString, cChar )
LOCAL nLen := Len( cString )
LOCAL nPad := 16 - ( nLen % 16 )
DEFAULT cChar TO " "
RETURN PadR( cString, nLen + nPad, cChar )
Saludos,
José Lalín
pues parece que sí, que la longitud de la cadena tiene que ser múltiplo de
16 para que funcione correctamente.
Puedes usar la función Pad16() para asegurarte que la longitud es correcta
antes de hacer la codificación.
METHOD Button1Click( oSender ) CLASS TForm1
LOCAL cText := Pad16( "Cadena de texto para probar AES256" )
LOCAL cEnc
LogDebug( "[" + cText + "]" )
cEnc := XA_AES256Encrypt( cText, "clave" )
LogDebug( "[" + cEnc + "]" )
LogDebug( "[" + XA_AES256Decrypt( cEnc, "clave" ) + "]" )
RETURN Nil
FUNCTION Pad16( cString, cChar )
LOCAL nLen := Len( cString )
LOCAL nPad := 16 - ( nLen % 16 )
DEFAULT cChar TO " "
RETURN PadR( cString, nLen + nPad, cChar )
Saludos,
José Lalín
Proteccion de Archivos
Enrique,
> Me parece que funcionan bien cuando la longitud del texto a
> encriptar/desencriptar es múltiplo de 16. ¿Es correcto o
> estoy haciendo algo mal?
AES es un método de encriptación por bloques (concretamente bloques de 16
bytes), lo que significa que siempre se encriptan bloques completos. Por lo
tanto, sí, es absolutamente necesario que el texto a encriptar tenga un
tamaño múltiplo de 16 bytes.
Por otro lado, ten cuidado cuando asignes el resultado de encriptar la
cadena a un control TEdit, ya que si dentro de la cadena encriptada hay
algún chr(0), se va a truncar, y después no vas a poder desencriptarlo. Lo
mejor es convertir la cadena encriptada a hexadecimal, y así no tendrás
problemas. Puedes utilizar las funciones StringToHex() y HexToString().
P.ej.:
LOCAL cTexto := "Text_to_encrypt.", cEncrip
LOCAL cClave := "Clave_para_Encriptar"
cEncript := StringToHex( XA_AES256Encrypt( cTexto, cClave ) )
IF XA_AES256Decrypt( HexToString( cEncript ), cClave ) == cTexto
MsgInfo( "Ok. Todo bien!" )
ELSE
MsgStop( "Uff! Algo va mal." )
ENDIF
--
Un saludo,
José F. Giménez
http://www.xailer.com
http://www.xailer.info
> Me parece que funcionan bien cuando la longitud del texto a
> encriptar/desencriptar es múltiplo de 16. ¿Es correcto o
> estoy haciendo algo mal?
AES es un método de encriptación por bloques (concretamente bloques de 16
bytes), lo que significa que siempre se encriptan bloques completos. Por lo
tanto, sí, es absolutamente necesario que el texto a encriptar tenga un
tamaño múltiplo de 16 bytes.
Por otro lado, ten cuidado cuando asignes el resultado de encriptar la
cadena a un control TEdit, ya que si dentro de la cadena encriptada hay
algún chr(0), se va a truncar, y después no vas a poder desencriptarlo. Lo
mejor es convertir la cadena encriptada a hexadecimal, y así no tendrás
problemas. Puedes utilizar las funciones StringToHex() y HexToString().
P.ej.:
LOCAL cTexto := "Text_to_encrypt.", cEncrip
LOCAL cClave := "Clave_para_Encriptar"
cEncript := StringToHex( XA_AES256Encrypt( cTexto, cClave ) )
IF XA_AES256Decrypt( HexToString( cEncript ), cClave ) == cTexto
MsgInfo( "Ok. Todo bien!" )
ELSE
MsgStop( "Uff! Algo va mal." )
ENDIF
--
Un saludo,
José F. Giménez
http://www.xailer.com
http://www.xailer.info
Proteccion de Archivos
Jose Lalín y José F. Giménez,
Muchas gracias por su ayuda. Voy a hacer pruebas y les comento resultados.
SALUDOS
Enrique Solano
Muchas gracias por su ayuda. Voy a hacer pruebas y les comento resultados.
SALUDOS
Enrique Solano
Proteccion de Archivos
Hola,
Hice un pequeño cambio la la FUNCTION Pad16() ya que recalculaba el tamaño cuando la longitud de cString ya era múltiplo de 16 y las pruebas que he hecho han sido exitosas.
Comparto las funciones resultantes, incluyo rutina de desencripción aunque por seguridad no es recomendable desencriptar passwords
//---------------------------------------------------------- --------------------
FUNCTION Pad16( cString, cChar )
//Ajusta cString con espacios a la derecha para que su longitud sea múltiplo de 16
LOCAL nLen := Len( cString )
LOCAL nPad := iif( ( nLen % 16 ) = 0 , 0 , 16 - ( nLen % 16 ) )
DEFAULT cChar TO " "
RETURN PadR( cString, nLen + nPad, cChar )
//---------------------------------------------------------- --------------------
FUNCTION EncryAESR256(cTexto, nLong, cKey)
// cTexto - Texto a encriptar
// nLong - Longitud máxima del texto a encriptar.
// cKey - Llave de encripción
// Dependiendo de la longitud máxima del texto a encriptar, deberá ser el tamaño del
// campo dentro del DBF que almacenará el texto encriptado y hexadecimal. En la
// siguiente tabla se muestran algunos rangos.
// LONG.MAX.
// De Hasta TAMAí‘O MINIMO DEL CAMPO DONDE SE ALMACENARí EL TEXTO ENCRIPTADO
// == ===== ============================================================ ===
// 01_16_____032
// 17_32_____064
// 33_48_____096
// 49_64_____128
// 65_80_____160
// 81_96_____192
// .._.._____...
cTexto = PadR( cTexto, nLong , " ")
cTexto = Pad16( cTexto )
RETURN StringToHex( XA_AES256Encrypt( cTexto, cKey ) )
//---------------------------------------------------------- --------------------
FUNCTION DecryAESR256(cEncript, nLong, cKey)
RETURN SubStr(XA_AES256Decrypt( HexToString( cEncript ), cKey ), 1, nLong)
//---------------------------------------------------------- --------------------
Ejempo: Encriptar password con longitud >= 1 y <= 20.
Llamado: EncryAESR256("Pasword a encriptar", 20, "Clave_para_Encriptar_y_Desencriptar")
NOTA: El campo donde se almacenará el password encriptado hexadecimal deberá ser
character de longitud = 64 ( ver tabla que está en la función EncryAESR256() )
Un saludo
Enrique Solano
Hice un pequeño cambio la la FUNCTION Pad16() ya que recalculaba el tamaño cuando la longitud de cString ya era múltiplo de 16 y las pruebas que he hecho han sido exitosas.
Comparto las funciones resultantes, incluyo rutina de desencripción aunque por seguridad no es recomendable desencriptar passwords
//---------------------------------------------------------- --------------------
FUNCTION Pad16( cString, cChar )
//Ajusta cString con espacios a la derecha para que su longitud sea múltiplo de 16
LOCAL nLen := Len( cString )
LOCAL nPad := iif( ( nLen % 16 ) = 0 , 0 , 16 - ( nLen % 16 ) )
DEFAULT cChar TO " "
RETURN PadR( cString, nLen + nPad, cChar )
//---------------------------------------------------------- --------------------
FUNCTION EncryAESR256(cTexto, nLong, cKey)
// cTexto - Texto a encriptar
// nLong - Longitud máxima del texto a encriptar.
// cKey - Llave de encripción
// Dependiendo de la longitud máxima del texto a encriptar, deberá ser el tamaño del
// campo dentro del DBF que almacenará el texto encriptado y hexadecimal. En la
// siguiente tabla se muestran algunos rangos.
// LONG.MAX.
// De Hasta TAMAí‘O MINIMO DEL CAMPO DONDE SE ALMACENARí EL TEXTO ENCRIPTADO
// == ===== ============================================================ ===
// 01_16_____032
// 17_32_____064
// 33_48_____096
// 49_64_____128
// 65_80_____160
// 81_96_____192
// .._.._____...
cTexto = PadR( cTexto, nLong , " ")
cTexto = Pad16( cTexto )
RETURN StringToHex( XA_AES256Encrypt( cTexto, cKey ) )
//---------------------------------------------------------- --------------------
FUNCTION DecryAESR256(cEncript, nLong, cKey)
RETURN SubStr(XA_AES256Decrypt( HexToString( cEncript ), cKey ), 1, nLong)
//---------------------------------------------------------- --------------------
Ejempo: Encriptar password con longitud >= 1 y <= 20.
Llamado: EncryAESR256("Pasword a encriptar", 20, "Clave_para_Encriptar_y_Desencriptar")
NOTA: El campo donde se almacenará el password encriptado hexadecimal deberá ser
character de longitud = 64 ( ver tabla que está en la función EncryAESR256() )
Un saludo
Enrique Solano