17

ich für einen Algorithmus bin auf der Suche nach Datei-Verschlüsselung/Entschlüsselung, die die folgenden Voraussetzungen erfüllt:Rubin: Datei-Verschlüsselung/Entschlüsselung mit privaten/öffentlichen Schlüsseln

  • Algorithmus müssen zuverlässig sein
  • Algorithmus für ziemlich schnell sein sollte, große Dateien
  • private Schlüssel können durch einige Parameter (zB Passwort)
  • generierten private Schlüssel erzeugt werden muss, mit einem öffentlichen Schlüssel kompatibel seine (öffentlicher Schlüssel wird nur einmal erzeugt und in der Datenbank gespeichert)

Gibt es eine Ruby-Implementierung von vorgeschlagenen Algorithmen?

Antwort

26

Hinweis Well: Wie Prägungs in den Kommentaren erwähnt, ist diese Antwort eine schlechte Passform für ein tatsächliches System. Erstens sollte die Dateiverschlüsselung nicht mit dieser Methode ausgeführt werden (die lib stellt beispielsweise AES zur Verfügung). Zweitens behandelt diese Antwort keine der größeren Probleme, die sich auch auf die Entwicklung Ihrer Lösung auswirken. Die ursprüngliche Quelle geht auch in more details.

Ruby-openssl, dies zu tun verwenden können:

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

und entschlüsseln:

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

von here

+2

Ich bin eigentlich kein Rubyist, aber das sind ziemlich gute Batterien. Ich frage mich, wie schwer wäre das Äquivalent in Python ... – brice

+3

Ich möchte nur hinzufügen, dass Dateien mit zum Beispiel AES-256, aber sein Schlüssel sollte mit RSA gesendet werden. – tiktak

+4

Es tut mir leid, aber das ist wirklich ein schlechter Rat. Das OP spricht über Dateiverschlüsselung/Entschlüsselung und Sie sollten RSA dafür nie verwenden. – emboss

10

Ich fürchte, Sie hier zwei Konzepte mischen, Authentifizierung/Genehmigung und Vertraulichkeit, versuchen, beide Aspekte in einem einzigen Schritt abzudecken, und das wird nicht funktionieren. Sie sollten niemals "echte Daten" mit asymmetrischen Algorithmen verschlüsseln. a) Sie sind viel zu langsam dafür, b) es gibt subtile Probleme, die, wenn sie nicht richtig gemacht werden, die Sicherheit Ihrer Lösung ernsthaft schwächen werden.

Eine gute Faustregel ist, dass das einzige, was man von einem viel schnelleren symmetrischen Algorithmus mit privaten asymmetrischen Schlüsseln ist symmetrische Schlüssel verwendet Verschlüsselung sollte am Ende. Aber in fast allen Fällen sollten Sie das nicht einmal tun, denn in 90% der Fälle, was Sie eigentlich wollen, ist TLS (SSL) in diesen Fällen - ich habe vor einer Weile versucht zu erklären, warum here.

In Ihrem Fall gehe ich davon die Anforderungen sind:

  • Vertraulichkeit der Daten, die in der Datenbank gespeichert werden soll: die breite Öffentlichkeit sollte es nicht in der Lage sein zu lesen (oder sogar auf sie zugreifen

    )
  • Auserwählte (wahrscheinlich sollte nur eine Person) in der Lage sein und lesen Sie den Zugriff auf diese Daten

Das erste Ziel im allgemeinen unter Verwendung 012.318 erreicht wird. Das zweite Ziel wird, wenn auch verwandt, auf ganz andere Weise realisiert. Sie möchten, dass der Benutzer, der auf die Datei zugreift, authentifiziert wird (d. H. Die Identität festlegt), und ob Sie außerdem möchten, dass sie autorisiert werden (d. H.prüfen, ob die festgestellte Identität das Recht hat zu tun, was sie beabsichtigen). Dies ist, wo asymmetrische Kryptographie kann betreten die Bühne, aber nicht unbedingt. Da Ihre Frage mit Rails getaggt ist, nehme ich an, dass wir über eine Rails-Anwendung sprechen. In der Regel verfügen Sie bereits über Möglichkeiten, Benutzer dort zu authentifizieren und zu autorisieren (höchstwahrscheinlich mit dem oben genannten TLS). Sie können sie einfach wiederverwenden, um einen symmetrischen Schlüssel für die tatsächliche Dateiverschlüsselung/-entschlüsselung zu erstellen. Password-based encryption würde für diesen Zweck passen, wenn Sie asymmetrische Verschlüsselung überhaupt vermeiden möchten. Die Dinge werden noch komplizierter, wenn Sie auch die Integrität der bereits vertraulichen Daten sicherstellen wollen, das heißt, Sie möchten dem authentifizierten und autorisierten Benutzer eine Art Garantie geben, in dem Sinne, dass das, worauf sie letztendlich zugreifen, in keiner Weise verändert wurde in der Zwischenzeit.

Die Entwicklung einer Lösung hierfür ist keine triviale Aufgabe und hängt in hohem Maße von Ihren Anforderungen ab. Daher gibt es leider keinen "goldenen Weg", der zu allen passt. Ich würde vorschlagen, etwas zu recherchieren, ein klareres Bild davon zu bekommen, was Sie erreichen wollen und wie, und dann versuchen, zusätzliche Ratschläge zu Themen zu bekommen, bei denen Sie sich immer noch unsicher/unwohl fühlen.

+1

Danke für die Antwort!Ich löste die Frage mit dem Übertragen und Speichern von Daten auf folgende Weise: 1) symmetrischen Verschlüsselungsschlüssel (sym-key) erzeugen 2) Dateien mit sym-key verschlüsseln 3) sym-key mit öffentlichen asym-key verschlüsseln 4) Dateien senden und verschlüsselt sym-key 5) Entschlüsseln des privaten verschlüsselten Asym-Schlüssels des Benutzers mit dem geheimen Token des Benutzers 6) Entschlüsseln des empfangenen sym-Schlüssels mit dem privaten Asym-Schlüssel 7) Entschlüsseln der Dateien mit dem entschlüsselten sym-Schlüssel. Denke, es ist ziemlich normal. – tiktak

+2

Das ist die richtige Richtung! Aber es ist immer noch anfällig für Replay-Angriffe. Anstatt einen Schlüssel mit einem asymmetrischen Schlüssel zu senden, können Sie stattdessen TLS verwenden? Ich habe festgestellt, dass Sie in fast allen Fällen, in denen Sie Daten von A nach B transportieren, TLS statt asymmetrischer Verschlüsselung verwenden sollten - TLS schützt Sie vor den Dingen, die höchstwahrscheinlich ein benutzerdefiniertes Protokoll beschädigen würden. – emboss

0

Ich machte ein Juwel, um dabei zu helfen. Es heißt cryptosystem. Konfigurieren Sie einfach den Pfad und das Kennwort für Ihren privaten Schlüssel sowie den Pfad zu Ihrem öffentlichen Schlüssel und den Rest.

Encrypting ist so einfach wie:

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

und Entschlüsseln:

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

Sie können es auf GitHub oder RubyGems überprüfen.

0

Symmetric Encryption ist definitiv schnell und hat eine ausgezeichnete Unterstützung für das Streaming von sehr großen Dateien.

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

Symmetrische Verschlüsselung dient zum Verschlüsseln von Daten und großen Dateien innerhalb einer Organisation.

Wenn es darum geht, Dateien mit anderen Organisationen zu teilen, dann ist PGP die beste Option. Für das Streaming von sehr großen Dateien mit PGP betrachten: IOStreams

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

Blick auf die Datei iostreams/lib/io_streams/pgp.rb für mehr PGP Beispiele. Es unterstützt auch PGP-Schlüsselverwaltung direkt von Ruby.