web-dev-qa-db-fra.com

Ruby: cryptage/décryptage de fichiers avec clés privées/publiques

Je recherche un algorithme de chiffrement/déchiffrement de fichier qui réponde aux exigences suivantes:

  • L'algorithme doit être fiable
  • L'algorithme devrait être rapide pour les gros fichiers
  • La clé privée peut être générée par certains paramètres (par exemple, mot de passe)
  • La clé privée générée doit être compatible avec la clé publique (la clé publique est générée une seule fois et stockée dans une base de données)

Existe-t-il une implémentation Ruby des algorithmes suggérés?

20
tiktak

Note Bien: Comme le soulignent les commentaires en relief, cette réponse est mal adaptée à un système réel. Premièrement, le cryptage de fichier ne doit pas être effectué à l'aide de cette méthode (la bibliothèque fournit AES, par exemple.). Deuxièmement, cette réponse ne résout aucun des problèmes plus généraux qui affecteront également la façon dont vous concevez votre solution.

La source originale va aussi dans plus de détails .

Ruby peut utiliser openssl pour cela:

#!/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))

Et décryptez:

#!/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))

de ici

31
brice

J'ai bien peur que vous mélangez ici deux concepts, authentification/autorisation et confidentialité, en essayant de couvrir les deux aspects en une seule étape, et cela ne fonctionnera pas. Vous ne devriez jamais chiffrer de "données réelles" avec des algorithmes asymétriques. a) ils sont beaucoup trop lents pour cela, b) il y a des problèmes subtils qui, s'ils ne sont pas réglés correctement, vont sérieusement affaiblir la sécurité de votre solution.

Une bonne règle est que la seule chose que vous devriez chiffrer avec des clés privées asymétriques est des clés symétriques utilisées par un algorithme symétrique beaucoup plus rapide. Mais dans presque tous les cas, vous ne devriez même pas le faire, car dans 90% des cas, ce que vous voulez réellement, c’est TLS (SSL) dans ces cas - j’ai essayé d’expliquer pourquoi (ici ) il y a quelque temps.

Dans votre cas, je suppose que les exigences sont les suivantes:

  • confidentialité des données qui doivent être stockées dans la base de données: le grand public ne devrait pas pouvoir les lire (ni même y accéder)

  • une sélection de personnes (probablement une seule personne) devrait pouvoir accéder à ces données et les lire

Le premier objectif est généralement atteint en utilisant cryptage symétrique . Le deuxième objectif est, quoique lié, réalisé par des moyens très différents. Vous voulez que l'utilisateur accédant au fichier soit authentifié (c'est-à-dire, établissez l'identité) et vous souhaitez également qu'il soit autorisé (c.-à-d. Vérifiez si l'identité établie a le droit de faire ce qu'elle a l'intention de faire). C’est là que la cryptographie asymétrique peut entrer dans l’étape, mais pas nécessairement. Étant donné que votre question porte la mention Rails, je suppose que nous parlons d’une application Rails. Généralement, vous disposez déjà de certains moyens pour authentifier et autoriser les utilisateurs (avec le TLS susmentionné), vous pouvez simplement les réutiliser afin d’établir une clé symétrique pour le chiffrement/déchiffrement de fichiers. Cryptage basé sur un mot de passe } conviendrait à cet effet, si vous voulez éviter le cryptage asymétrique. Les choses deviennent encore plus compliquées si vous voulez également assurer l'intégrité des données déjà confidentielles, c'est-à-dire que vous voulez donner une sorte de garantie à l'utilisateur authentifié et autorisé en ce sens que l'accès auquel ils ont finalement accès n'a pas été modifié. pendant ce temps.

Développer une solution à ce problème ne sera pas une tâche anodine et dépendra dans une large mesure de vos besoins. Je crains donc qu’il n’y ait pas de "solution miracle" qui convienne à tout le monde. Je suggérerais de faire des recherches, d’obtenir une image plus claire de ce que vous essayez d’atteindre et de la manière de le faire, puis d’essayer d’obtenir des conseils supplémentaires sur des sujets avec lesquels vous vous sentez encore incertain/inconfortable.

10
emboss

J'ai fait un joyau pour aider avec cela. Cela s'appelle cryptosystem. Configurez simplement le chemin d'accès et le mot de passe sur votre clé privée, ainsi que le chemin d'accès à votre clé publique, et le reste.

Le cryptage est aussi simple que:

rsa = Cryptosystem::RSA.new
rsa.encrypt('secret') # => "JxpuhTpEqRtMLmaSfaq/X6XONkBnMe..."

Et déchiffrer:

encrypted_value = rsa.encrypt('secret') # => "Y8DWJc2/+7TIxdLEolV99XI2sclHuK..."
rsa.decrypt(encrypted_value) # => "secret"

Vous pouvez le vérifier sur GitHub ou RubyGems .

0
user6713635

Symmetric Encryption est définitivement rapide et offre un excellent support pour la diffusion en continu de très gros fichiers.

SymmetricEncryption::Writer.open('my_file.enc') do |file|
  file.write "Hello World\n"
  file.write "Keep this secret"
end

Symmetric Encryption est conçu pour chiffrer des données et des fichiers volumineux au sein d’une organisation.

PGP est la meilleure option pour partager des fichiers avec d'autres organisations. Pour la diffusion en continu de très gros fichiers avec PGP, prenez en compte: IOStreams

IOStreams.writer('hello.pgp', recipient: '[email protected]') do |writer|
  writer.write('Hello World')
  writer.write('and some more')
end

Regardez le fichier iostreams/lib/io_streams/pgp.rb pour plus d'exemples de PGP. Il prend également en charge la gestion des clés PGP directement à partir de Ruby.

0
Reid