Página 1 de 1
Proteccion de Archivos
Publicado: Mié Dic 15, 2010 4:45 pm
por Moises Leon
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
Proteccion de Archivos
Publicado: Jue Dic 16, 2010 9:12 pm
por jfgimenez
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
Publicado: Vie Dic 17, 2010 6:00 pm
por Moises Leon
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
Proteccion de Archivos
Publicado: Sab Dic 18, 2010 1:05 pm
por jfgimenez
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
Proteccion de Archivos
Publicado: Sab Dic 18, 2010 4:15 pm
por Moises Leon
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
Proteccion de Archivos
Publicado: Jue Sep 15, 2011 8:41 pm
por ensoro
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
Proteccion de Archivos
Publicado: Vie Sep 16, 2011 4:49 pm
por jlalin
Enrique,
¿puedes poner un ejemplo que reproduzca el error?
Saludos,
José Lalín
Proteccion de Archivos
Publicado: Mar Sep 20, 2011 1:12 am
por ensoro
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
Proteccion de Archivos
Publicado: Mar Sep 20, 2011 10:57 am
por jlalin
Enrique,
en cuanto tenga un momento hago pruebas y te cuento.
Saludos,
José Lalín
Proteccion de Archivos
Publicado: Mar Sep 20, 2011 11:18 am
por jlalin
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
Proteccion de Archivos
Publicado: Mar Sep 20, 2011 11:46 am
por jfgimenez
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
Proteccion de Archivos
Publicado: Mar Sep 20, 2011 8:05 pm
por ensoro
Jose Lalín y José F. Giménez,
Muchas gracias por su ayuda. Voy a hacer pruebas y les comento resultados.
SALUDOS
Enrique Solano
Proteccion de Archivos
Publicado: Jue Sep 22, 2011 1:45 am
por ensoro
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