Autor |
Mensaje |
ljma
Programador
Registrado: Enero 2010
Mensajes: 106
Edad: 54 Ubicación:
|
Encriptación Asimétrica
Hola,
Dejo unas funciones que pueden ser útiles para encriptar comunicaciones, ficheros setting, ficheros ini, etc. Como todos sabéis la encriptación asimétrica permite que dos personas puedan enviarse información encriptada, sin necesidad de compartir la llave de encriptación. Se utiliza una llave pública para encriptar y una llave privada para desencritar.
Además del uso normal de las llaves (como ficheros) se me ha ocurrido, con la finalidad de usarlo para encriptar ficheros de configuración, generar una llave privada e incluirla dentro del código fuente de forma que en tiempo de ejecución esté compilada junto con su contraseña de acceso. La llave pública se puede quedar como un fichero en un directorio de la aplicación. De esta forma podemos encriptar con la llave pública y desencriptar con la privada.
Os dejo el código (es muy simple):
Lo que me gustaría es saltarme el paso de tener que crear los ficheros temporales en los procesos. ¿Alguna idea al respecto de cómo hacerlo?
Saludos
|
#1 Miercoles, 08 Febrero 2012, 09:53 |
|
|
clsource
Usuario
Registrado: Febrero 2012
Mensajes: 40
Edad: 34 Ubicación:
|
Re: Encriptación Asimétrica
Tendría que investigar mejor el tema
para dar una opinión.
Pero, ¿Esto serviría para encriptar sqlite?
Onda para darle mayor seguridad al asunto.
Saludos
|
#2 Miercoles, 08 Febrero 2012, 14:37 |
|
|
santijav
Aprendiz
Registrado: Febrero 2010
Mensajes: 77
Edad: 39
|
Re: Encriptación Asimétrica
Con esto que mencinoa nuestro compañero me parece que lo que puedes hacer es encriptar los datos que vas a guardar en la base de datos. No se sqlite pero mysql tiene funciones para encriptar hasta donde tengo entendido
|
#3 Miercoles, 08 Febrero 2012, 16:44 |
|
|
jguardon
Administrador
Registrado: Septiembre 2009
Mensajes: 2708
Edad: 57 Ubicación: Granada
|
Re: Encriptación Asimétrica
@ljma
Tendrás problemas con las rutas al directorio de la aplicación (Application.Path) cuando eventualmente distribuyas tu programa como un paquete instalable (deb, rpm, etc) porque entonces esa ruta será de solo lectura para un usuario normal.
Nunca es buena idea recurrir al directorio de la aplicación para guardar ficheros junto al ejecutable por estas razones, así que lo ideal es hacerlo en un directorio oculto con el nombre del programa en nuestra carpeta de usuario. De esa forma siempre tendrás un control total de los ficheros dentro de ese directorio y del propio directorio, por ejemplo borrando y creando durante el tiempo de ejecución.
Saludos
=================== Jesús Guardón
Por favor, usemos el corrector ortográfico antes de pulsar el botón "Enviar".
"uo ǝs ʇɐu pıɟıɔıן ɐdɹǝupǝɹ ɐ dɹoƃɹɐɯɐɹ, soןo ɥɐʎ bnǝ dɹodouǝɹsǝןo"
|
#4 Miercoles, 08 Febrero 2012, 17:49 |
|
|
ljma
Programador
Registrado: Enero 2010
Mensajes: 106
Edad: 54 Ubicación:
|
Re: Encriptación Asimétrica
Hola,
Lo del directorio es un ejemplo, por poner algo, ya que lo que realmente me gustaría es no tener que crear archivos y ejecutar los comandos de forma que el resultado se almacene en variables. Las funciones para crear las llaves las he puesto por motivos didácticos ya que yo genero las llaves y luego copio el contenido de los ficheros al código fuente y así me olvido de tener que distribuir llaves. Espero que se entienda la idea.
santijav y clsource:
Con estas funciones puedes encriptar y desencriptar los datos que queráis y luego los puedes almacenar en una base de datos o en un fichero. Para SQLite hay un módulo pero no es libre: SQLite.
Saludos
|
#5 Miercoles, 08 Febrero 2012, 23:26 |
|
|
clsource
Usuario
Registrado: Febrero 2012
Mensajes: 40
Edad: 34 Ubicación:
|
Re: Encriptación Asimétrica
Pero con éstas funciones solo podría encriptar el archivo sqlite completamente
o solo la información dentro de las tablas?
Saludos
|
#6 Jueves, 09 Febrero 2012, 00:53 |
|
|
ljma
Programador
Registrado: Enero 2010
Mensajes: 106
Edad: 54 Ubicación:
|
Re: Encriptación Asimétrica
Hola,
clsource:
Si encriptas la base de datos (el archivo o archivos) no la podras leer. Podrías encriptar los datos de los registros, la información.
Para esto yo lo que haría es crear una clase o una función (lo que más te guste) para manejar la base de datos sin tener que estar continuamente pendiente de la encriptación-desencriptación. Un ejemplo simple para desencriptar.
...
hResult = hConn.Exec("select * from nombre_de_la_tabla")
DO WHILE hResult.Available
campo_uno = desencripta("Ztyrtrtw", hResult["columa_uno_de_la_tabla"])
campo_dos = desencripta("Ztyrtrtw", hResult["columna_dos_del_la_tabla"])
hResult.MoveNext()
LOOP
...
Private Function desencripta(contra As String, sCadena_encriptada As String) As String
Dim sOut As String
Dim F As File 'declarar un manejador de fichero
F = Open "tmp/temp.txt" For Create 'abrir el archivo
Write #f, sCadena_encriptada
F.Close 'cerrar el fichero
Shell Subst("echo =| openssl rsautl -decrypt -in " & "tmp/temp.txt" & " -inkey " & Application.path & "/tpv.key -passin pass:" & contra) To sOut
Try Kill "tmp/temp.txt"
Return sOut
End
Coge la idea y adapta el código
Saludos
última edición por ljma el Jueves, 09 Febrero 2012, 08:28; editado 1 vez
|
#7 Jueves, 09 Febrero 2012, 08:26 |
|
|
ljma
Programador
Registrado: Enero 2010
Mensajes: 106
Edad: 54 Ubicación:
|
Re: Encriptación Asimétrica
Hola,
Otro ejemplo: Las llaves las he generado con las funciones y la password y luego he copiado el contenido en las variables.
Private sCadena_encriptada As String
Private sLlave_privada As String
Private sLlave_publica As String
Private sPassword As String
Private Function generar_claves(contra As String) As Boolean
Dim sEspera As String
'Cifrar la clave privada con DES para evitar su uso fraudulento:
Shell Subst("openssl genrsa -out " & "/tmp/tpv.key -passout pass:" & contra & " -des3 1024 ") To sEspera
' Generar claves públicas derivadas:
Shell Subst("openssl rsa -in " & "/tmp/tpv.key -pubout -out " & "/tmp/tpv_publica.key -passin pass:" & contra) To sEspera
End
Private Function encripta(texto As String) As String
Dim sEspera As String
Dim fTamano As Float
Dim F As File
F = Open "/tmp/tpv_publica.key" For Create 'abrir el archivo
Write #f, sLlave_publica
F.Close 'cerrar el fichero
Shell Subst("echo -n " & texto & "| openssl rsautl -pubin -encrypt -out " & "/tmp/temp.txt" & " -inkey " & "/tmp/tpv_publica.key") To sEspera
fTamano = Stat("/tmp/temp.txt").Size
F = Open "/tmp/temp.txt" For Input 'abrirlo para lectura
Read #f, sCadena_encriptada, fTamano 'leer el archivo y dejarlo en la variable string
F.Close
Try Kill "/tmp/temp.txt"
Try Kill "/tmp/tpv_publica.key"
End
Private Function desencripta(contra As String) As String
Dim sOut As String
Dim F As File 'declarar un manejador de fichero
F = Open "/tmp/tpv.key" For Create 'abrir el archivo
Write #f, sLlave_privada
F.Close 'cerrar el fichero
F = Open "/tmp/temp.txt" For Create 'abrir el archivo
Write #f, sCadena_encriptada
F.Close 'cerrar el fichero
Shell Subst("echo =| openssl rsautl -decrypt -in " & "/tmp/temp.txt" & " -inkey " & "/tmp/tpv.key -passin pass:" & contra) To sOut
Try Kill "/tmp/temp.txt"
Try Kill "/tmp/tpv.key"
Return sOut
End
Public Sub Button1_Click()
generar_claves(sPassword)
End
Public Sub encriptar_Click()
encripta(TextBox1.Text)
End
Public Sub desencriptar_Click()
TextBox2.Text = desencripta(sPassword)
End
Public Sub Form_Open()
sLlave_privada = "-----BEGIN RSA PRIVATE KEY-----" & "\n"
sLlave_privada &= "Proc-Type: 4,ENCRYPTED" & "\n"
sLlave_privada &= "DEK-Info: DES-EDE3-CBC,69378458BE71BDF2" & "\n"
sLlave_privada &= "\n"
sLlave_privada &= "e1o1hUUWeK1Ptql0VtxMSCboV2Rvy+BPVlG1GF3gEV050FBgv0fdMO+BVLNbFhm2" & "\n"
sLlave_privada &= "0SuNfo4MIPKvQaFY9lZEFyNYeoYPfOIu+pK0kO3pE2RoHmf/vvv0hHveDewpfQ50" & "\n"
sLlave_privada &= "eep3XgKbJ9dz+SceowlrtcgItjGvngBrWrjRyyAegsRFVLxJVR6BTgkTotarpQyQ" & "\n"
sLlave_privada &= "1KBoGQkYdJA36u/SrWOi7bQsMUhgmLRpIAhxfy+NQMNq515E6LUfAdSOPCVJDrIP" & "\n"
sLlave_privada &= "12eYxkyb/cZu2XKHz57wQncjHO+lirFIWVTaQQRdZ5LozO99rkEJTlMsTeghJHb3" & "\n"
sLlave_privada &= "sUFlHQdgTQfdVJsw7KxRK8t80GPsooyW1gDH3UiGUDW1cSsHp/ItnpmEm430EKGC" & "\n"
sLlave_privada &= "BDdzSW9eLHbjqoyw3n7uC3qM5fQRr8C+7IfhReDXkkfvTdG9HB3ZcvZIXDAktHYw" & "\n"
sLlave_privada &= "o8iC7XGGLnO2ajgJdJpPcexgypNqwXPCFumbHd9aPMlfU3sQXP/03kdSfti+wJ44" & "\n"
sLlave_privada &= "1wvPk7UblII88tY++IZy9D0AR2KRfpXB72TBe+CZCBXP+R69250aFVJ0ap5C11rq" & "\n"
sLlave_privada &= "8oFhcfCHs4eJAd0qax/XOs6ZIRPmwZC9dkE4ns8ziwLfVPtSd/0rP5juvSph9C8Q" & "\n"
sLlave_privada &= "+mGLIQtwHMOzcT+sK0Qlii6+ltd7HxQmyH+hw0qjGHRiw3F1VRJohAdBN1BmC8+d" & "\n"
sLlave_privada &= "lUrmKIDE7vI467LHorY+hQpdLxRyBH0aTcQRcV5be6lPIucWqhV0fGQ+s9CATW9y" & "\n"
sLlave_privada &= "c0V2nBG+tGm2iMuhyOc2i/U/27relDUglibr8Og5q7O66Qku8wrs4Q==" & "\n"
sLlave_privada &= "-----END RSA PRIVATE KEY-----"
sLlave_publica = "-----BEGIN PUBLIC KEY-----" & "\n"
sLlave_publica &= "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCfo9dizwZ3hiDPLYiAQsSrMpJt" & "\n"
sLlave_publica &= "RrQU8StGeTe08EfRkcjM5cd8lWoyRDQz35RWTDLJJQPnaFRq//6vN1R/pGyjd2b5" & "\n"
sLlave_publica &= "8IsRhqFs4W7DsW+3Nv9fjetzeJxiqjRomCvN0u7moeRv1mK0KVwbMu3cWrRpBSas" & "\n"
sLlave_publica &= "3jDkdzNXuyGxBqVCTwIDAQAB" & "\n"
sLlave_publica &= "-----END PUBLIC KEY-----"
sPassword = "ZzyU123K"
End
El resultado aplicado en un archivo setting a prueba de cotillas
[Configuracion]
BD_HOST="\u00x0\u00x0ãÏÝ\u00x0ãŒðÞœv߉ªÙ‡æŠð\u00x0î\u00x0Ší„zÚß·ÔE¯Ó<q¬‘¬à’ˆ¹\r\u00x0.²©\u00x1íßÈ«·rý\u00x1,NÿDŸgwáª9v'ÆÓßa˜9·\u00x0ŸÐ\u00x1Iš„«gMÑ·>©›Qæ<150>N¥Ø>à\"EüžÎÖfEiéKI·[*ÿ¶ÿö±ãª.îÇO„†c.©žô(”žþ]œs‡13@òÓÝ\u00x1dób<g>àì”r3ª‘Øf"
BD_HECHA="ŠS\\L\u00x0F\u00x1u®y,¢HR)r\u00x1ÛšeËf&¢D}N;\u00x1Åóqã\u00x1N\\åï‰Á‡bÙ#\u00x0]wëþtNßØŸý\nO2$N& mÅ™\u00x1\\&Ùü4œÂycŒÏrOUôx Ô<ôA \u00x0ÆÞñ\u00x0²Ï¥üb,êæWv² +È®ùt£-jÐÉ/^È\u00x1õã\u00x0pi"
BD_IDIOMA="ov—šK\u00x0JÂ’ÓœÏçØ26*#ÿ_$wŸÐ=ÙÖdK¯ôôì\u00x0\u00x1*š^Y]\u00x18ø\u00x0ÈUTuÌ·\u00x1ΰ\n\"\u00x0HVòm™–øÛB°ú+~Œ&nhZN\u00x0Ñû!S”…%LëûÛOx5˜\u00x0²vEàŠ‡H‚ÁÛ’\u00x1\u00x1VxŒ>”M€§$,@\u00x1Àd\u00x0"
Espero que se entienda
Saludos
última edición por ljma el Jueves, 09 Febrero 2012, 09:42; editado 2 veces
|
#8 Jueves, 09 Febrero 2012, 08:57 |
|
|
clsource
Usuario
Registrado: Febrero 2012
Mensajes: 40
Edad: 34 Ubicación:
|
Re: Encriptación Asimétrica
Gracias por los ejemplos.
Entonces ésto me serviría para encriptar los datos dentro de las tablas.
Pero no la base de datos en sí.
Encontré ésto por internet
http://sqlcipher.net/
Aunque no se cómo se podría utilizar con gambas :S
Saludos
|
#9 Jueves, 09 Febrero 2012, 14:19 |
|
|
GilGalad
Miguel Morera Belenguer
Usuario
Registrado: Febrero 2011
Mensajes: 26
Edad: 47 Ubicación: La Pobla de Vallbona (Valencia)
|
Re: Encriptación Asimétrica
La encriptación es un tema apasionate. clsource tienes muchos sistemas para encriptar los datos de tu base de datos, algunos estadars como los de Ijma o puedes crearte el tuyo propio. Crear un sistema de encritpación asimétrica puede ser desde lo mas sencillo hasta lo mas complicado depende de las ganas que tengas de 'complicarte' la vida. Puedes leer una cadena carácter a carácter y hacer una formula para que te otro código ascii pero así sería simétrica para conseguir la altimetría tienes que incluir una variable por ejemplo la posición del carácter dentro de la cadena así que si pones esta variable en tu fórmula consigues la altimetría.
Poco mas o menos es lo que hice yo en un programa escrito en C para encriptar ficheros de texto solo que yo lo hice con una contraseña también así que pasaba 3 valores a la formula de encriptación, el carácter original, la posición y la contraseña.
El programa lo puedes descargar desde sites.google.com/site/miprogramacionlinux que es una web que estoy creando para ir publicando mis programas.
Un saludo.
última edición por GilGalad el Sabado, 11 Febrero 2012, 00:21; editado 1 vez
|
#10 Sabado, 11 Febrero 2012, 00:19 |
|
|
|