ruby on rails - Ruby: cifrado/descifrado de archivos con claves privadas/públicas
ruby-on-rails encryption (4)
Estoy buscando un algoritmo para el cifrado / descifrado de archivos que cumpla los siguientes requisitos:
- El algoritmo debe ser confiable
- El algoritmo debe ser rápido para archivos bastante grandes
- La clave privada se puede generar por algún parámetro (por ejemplo, contraseña)
- La clave privada generada debe ser compatible con la clave pública (la clave pública se genera solo una vez y se almacena en la base de datos)
¿Hay alguna implementación de Ruby de algoritmos sugeridos?
Tenga en cuenta que: como el relieve lo menciona en los comentarios, esta respuesta no es adecuada para un sistema real. En primer lugar, el cifrado de archivos no debe realizarse utilizando este método (la biblioteca proporciona AES, por ejemplo). En segundo lugar, esta respuesta no aborda ninguno de los problemas más amplios que también afectarán la forma en que diseñe su solución.
La fuente original también entra en más detalles .
Ruby puede usar openssl para hacer esto:
#!/usr/bin/env ruby
# ENCRYPT
require ''openssl''
require ''base64''
public_key_file = ''public.pem'';
string = ''Hello World!'';
public_key = OpenSSL::PKey::RSA.new(File.read(public_key_file))
encrypted_string = Base64.encode64(public_key.public_encrypt(string))
Y descifrar:
#!/usr/bin/env ruby
# DECRYPT
require ''openssl''
require ''base64''
private_key_file = ''private.pem'';
password = ''boost facile''
encrypted_string = %Q{
...
}
private_key = OpenSSL::PKey::RSA.new(File.read(private_key_file),password)
string = private_key.private_decrypt(Base64.decode64(encrypted_string))
desde here
Hice una gema para ayudar con esto. Se llama cryptosystem
. Simplemente configure la ruta y la contraseña a su clave privada, así como la ruta a su clave pública, y se encargará del resto.
El cifrado es tan simple como:
rsa = Cryptosystem::RSA.new
rsa.encrypt(''secret'') # => "JxpuhTpEqRtMLmaSfaq/X6XONkBnMe..."
Y descifrando:
encrypted_value = rsa.encrypt(''secret'') # => "Y8DWJc2/+7TIxdLEolV99XI2sclHuK..."
rsa.decrypt(encrypted_value) # => "secret"
Me temo que está mezclando dos conceptos aquí, autenticación / autorización y confidencialidad, tratando de cubrir ambos aspectos en un solo paso, y eso no funcionará. Nunca debe cifrar "datos reales" con algoritmos asimétricos. a) son demasiado lentos para eso, b) hay problemas sutiles que, si no se hacen correctamente, debilitarán gravemente la seguridad de su solución.
Una buena regla general es que lo único que debe terminar de cifrar con claves asimétricas privadas son las claves simétricas utilizadas por un algoritmo simétrico mucho más rápido. Pero en casi todos los casos ni siquiera debería estar haciendo eso, porque en el 90% de los casos lo que realmente quiere es TLS (SSL) en esos casos. Traté de explicar por qué hace un tiempo.
En su caso, asumo que los requisitos son:
confidencialidad de los datos que se almacenarán en la base de datos: el público en general no debería poder leerlos (ni siquiera acceder a ellos)
Unos pocos seleccionados (probablemente solo una persona) deberían poder acceder y leer esos datos
El primer objetivo se logra generalmente mediante el uso de cifrado simétrico . El segundo objetivo es, aunque relacionado, realizado por medios muy diferentes. Desea que el usuario que accede al archivo esté autenticado (es decir, establezca la identidad) y, además, desea que esté autorizado (es decir, verifique si la identidad establecida tiene derecho a hacer lo que pretende). Aquí es donde la criptografía asimétrica puede entrar en la etapa, pero no necesariamente. Ya que su pregunta está etiquetada con Rails, asumo que estamos hablando de una aplicación de Rails. Por lo general, ya tiene algunos medios para autenticar y autorizar a los usuarios allí (lo más probable es que involucre el TLS mencionado anteriormente), simplemente puede reutilizarlos para establecer una clave simétrica para el cifrado / descifrado de archivos real. El cifrado basado en contraseña se ajustaría a este propósito, si desea evitar el cifrado asimétrico. Las cosas se complican aún más si también desea garantizar la integridad de los datos ya confidenciales, es decir, desea otorgar una especie de garantía al usuario autenticado y autorizado en el sentido de que lo que finalmente acceden no se ha alterado de ninguna manera. mientras tanto.
Desarrollar una solución para esto no será una tarea trivial y dependerá en gran medida de sus requisitos, por lo que me temo que no hay una "manera dorada" que se adapte a todos. Yo sugeriría investigar un poco, obtener una imagen más clara de lo que está tratando de lograr y cómo, y luego tratar de obtener consejos adicionales sobre temas con los que aún se siente incierto / incómodo.
Symmetric Encryption es definitivamente rápido y tiene un excelente soporte para la transmisión de archivos muy grandes.
SymmetricEncryption::Writer.open(''my_file.enc'') do |file|
file.write "Hello World/n"
file.write "Keep this secret"
end
Symmetric Encryption está diseñado para encriptar datos y archivos grandes dentro de una organización.
Cuando se trata de compartir archivos con otras organizaciones, la mejor opción es PGP. Para la transmisión de archivos muy grandes con PGP, considere: IOStreams
IOStreams.writer(''hello.pgp'', recipient: ''[email protected]'') do |writer|
writer.write(''Hello World'')
writer.write(''and some more'')
end
Mire el archivo iostreams / lib / io_streams / pgp.rb para ver más ejemplos de PGP. También es compatible con la gestión de claves PGP directamente desde Ruby.