Ruby: chiffrement/déchiffrement des fichiers avec des clés privées / publiques

je cherche un algorithme de chiffrement/déchiffrement de fichier qui satisfait aux exigences suivantes:

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

Ruby mise en œuvre des algorithmes suggérés?

18
demandé sur Wayne Conrad 2012-03-27 18:36:26

4 réponses

Remarque: comme le mentionne emboss dans les commentaires, cette réponse ne convient pas à un système réel. Tout d'abord, le cryptage des fichiers ne devrait pas être effectué en utilisant cette méthode (la lib fournit AES, par exemple).). Deuxièmement, cette réponse n'aborde aucune des questions plus générales qui influeront également sur la façon dont vous concevez votre solution.

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

Ruby peut utiliser openssl pour faire ceci:

#!/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écrypter:

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

ici

30
répondu brice 2012-03-28 11:47:28

je crains que vous ne mélangiez deux concepts ici, Authentification / autorisation et confidentialité, en essayant de couvrir les deux aspects en une seule étape, et ça ne marchera pas. Vous ne devriez jamais crypter des" données réelles " avec des algorithmes asymétriques. a) ils sont beaucoup trop lents pour cela, b) il y a des questions subtiles qui, si elles ne sont pas faites correctement, affaibliront gravement la sécurité de votre solution.

Une bonne règle de base est que la seule chose que vous devriez finir le chiffrement privée asymétrique touches symétrique touches utilisées par un algorithme symétrique beaucoup plus rapide. Mais dans presque tous les cas, vous ne devriez même pas faire cela, parce que dans 90% des cas ce que vous voulez réellement est TLS (SSL) dans ces cas - là-j'ai essayé d'expliquer pourquoi ici il y a un moment.

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

  • confidentialité des données qui seront stockées dans la base de données: le grand public ne devrait pas être en mesure de le lire (ou le même)

  • quelques personnes (probablement une seule personne) devraient pouvoir accéder à ces données et les lire

le premier objectif est généralement atteint en utilisant chiffrement symétrique. Le deuxième objectif est, mais liés, réalisé par des moyens différents. Vous voulez que l'utilisateur qui accède au fichier soit authentifié (c.-à-D. Établir l'identité) et en plus de cela vous voulez qu'ils soient autorisés (c.-à-d. vérifier si l'identité a le droit de faire ce qu'ils ont l'intention de le faire). C'est là que cryptographie asymétrique entrer en scène, mais pas nécessairement. Puisque votre question est marquée avec des Rails, je suppose que nous parlons D'une application de Rails. Vous avez généralement déjà certains moyens d'authentifier et d'autoriser les utilisateurs (très probablement impliquant les TLS mentionnés ci-dessus), vous pouvez simplement les réutiliser afin d'établir une clé symétrique pour le fichier réel chiffrement/déchiffrement. cryptage basé sur le mot de passe ajustement pour cela, si vous voulez éviter de cryptographie 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é dans le sens que ce qu'ils ont finalement accès n'a pas été modifié en aucune façon dans l'intervalle.

développer une solution pour cela ne sera pas une tâche insignifiante et dépendent dans une large mesure de vos besoins donnés, donc j'ai peur qu'il n'y ait pas de "voie d'or" qui convienne à tout le monde. Je suggérerais de faire quelques recherches, d'obtenir une image plus claire de ce que vous essayez d'atteindre et comment, puis essayer d'obtenir des conseils supplémentaires sur les sujets que vous vous sentez encore incertain/mal à l'aise.

10
répondu emboss 2017-05-23 11:54:59

j'ai fait une perle pour aider avec ça. Il est appelé cryptosystem. Il suffit de configurer le chemin et le mot de passe de votre clé privée ainsi que le chemin de votre clé publique, et il fait le reste.

Cryptage de est aussi simple que:

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

Et décryptage:

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

Vous pouvez le vérifier sur GitHub ou RubyGems.

0
répondu user6713635 2016-06-13 20:46:48

Cryptage Symétrique est certainement rapide et a un excellent support pour le streaming de très gros fichiers.

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

le cryptage symétrique est conçu pour le cryptage de données et de gros fichiers au sein d'une organisation.

lorsqu'il s'agit de partager des fichiers avec d'autres organisations, la meilleure option est PGP. Pour le streaming de très gros fichiers avec PGP considérer: IOStreams

IOStreams.writer('hello.pgp', recipient: 'receiver@example.org') do |writer|
  writer.write('Hello World')
  writer.write('and some more')
end

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

0
répondu Reid 2017-07-28 20:33:59