17

私は、次の要件を満たすファイルの暗号化/復号化のためのアルゴリズムを探しています:ルビー:パブリック/プライベートキーを持つファイルの暗号化/復号化

  • アルゴリズム
  • 信頼できるものでなければならないアルゴリズムは、かなりのために高速である必要がありますプライベートキーは、いくつかのパラメータによって生成することができ
  • 大きなファイル(例えば、パスワード)
  • 生成された秘密鍵は公開鍵と互換性がなければならない(公開鍵を一度だけ生成され、データベースに保存されている)

推奨アルゴリズムのRuby実装はありますか?

答えて

26

まあ注:エンボスはコメントで言及したように、この答えは、実際のシステムの貧適合しています。まず、この方法を使用してファイルの暗号化を実行しないでください(たとえば、libはAESを提供します)。第二に、この答えは、ソリューションのエンジニアリング方法に影響を及ぼすより広い問題のいずれにも対処しません。

元のソースもmore detailsになります。

Rubyはこれを行うためにOpenSSLを使用することができます。

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

と復号化:私はあなたがここに二つの概念を混合されている怖いhere

+2

私はRubyistは実際にはありませんが、それらはかなり良い電池です。私はどのような難しさは、Pythonに相当するだろうかと思う... – brice

+3

ちょうどそのファイルは、例えば、AES - 256とecnryptedする必要が追加したいが、そのキーはrsaで送信する必要があります。 – tiktak

+4

申し訳ありませんが、これは本当に悪いアドバイスです。 OPはファイルの暗号化/復号化について話しているので、RSAを使用しないでください。 – emboss

10

から

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

を、認証/承認と機密性を守り、両方の側面を1つのステップでカバーしようとしています。それはうまくいかないでしょう。非対称アルゴリズムを使用して「実データ」を暗号化するべきではありません。 a)それはあまりにも遅いです。b)正しく行われなければ、ソリューションのセキュリティをひどく弱める微妙な問題があります。

親指の良いルールは、あなたがプライベート非対称キーで暗号化し終わる必要があります唯一の事は、はるかに高速対称アルゴリズムで使用される対称鍵であるということです。しかし、ほとんどすべてのケースで、あなたが実際に望んでいるケースの90%がそのような場合のTLS(SSL)なので、私はそれをやってはいけません。なぜかhereの理由を説明しようとしました。データベースに格納されるデータの

  • 機密性:一般市民はそれを読んで(あるいはそれにアクセスできないようにする必要があり

    あなたのケースでは、私は必要条件であると仮定します)

  • 選択数(おそらくただ一人)がアクセスできるようにする必要があり、データが

最初の目標は、一般的にを使用することによって達成されていることを読んで。第二の目標は、関連はあるものの、まったく異なる手段によって実現される。ファイルにアクセスしているユーザーが認証される(つまり、IDを確立する)ことを望みます。確立されたアイデンティティが彼らが意図するものを行う権利を持っているかどうかをチェックする)。これは、非対称暗号化がステージに入る場合ですが、必ずしもそうではありません。あなたの質問はRailsでタグ付けされているので、私はRailsアプリケーションについて話していると思います。ユーザーは、通常、既に(前述のTLSを含む)ユーザーの認証と承認を行う手段を持っていますが、実際のファイル暗号化/復号化のための対称キーを確立するために単純に再利用できます。非対称暗号をまったく使用しない場合は、Password-based encryptionがこの目的に適しています。すでに秘密のデータの整合性を保証したい場合、つまり、最終的にアクセスするものが決して変更されていないという意味で、認証された許可されたユーザーに一種の保証を与えたい場合は、さらに複雑になりますその間。

これに対する解決策を開発することは、些細な作業ではなく、所要の要件に大きく依存するため、すべての人に適した「金色の方法」はないと思います。私はいくつかの研究を行い、あなたが達成しようとしていることとその方法をより明確に把握し、まだ不確実な/不快感を感じている科目についてさらにアドバイスを受けようとします。

+1

回答ありがとうございます!1)シンメトリック暗号鍵(sym-key)を生成する。2)sym-keyでファイルを暗号化する。3)sym-keyを公開asym-keyで暗号化する。4)ファイルを送信し、暗号化する。 sym-key 5)ユーザーの秘密の暗号化されたasym-keyをユーザーの秘密トークンで解読する6)受信したsym-keyを秘密のasym-keyで解読する7)解読されたsym-keyでファイルを解読する。それはむしろ正常だと思う。 – tiktak

+2

それは正しい方向です!しかし、それでも攻撃を繰り返すのは脆弱です。非対称キーでラップされたキーを送信する代わりに、代わりにTLSを使用できませんでしたか?私は、AからBへのデータ転送のほとんどすべてにおいて、非対称暗号の代わりにTLSを使用すべきであることを発見しました.TLSは、カスタムプロトコルを破る可能性の高いものからあなたを守ります。 – emboss

0

私はこれを助けるために宝石を作った。これはcryptosystemと呼ばれています。秘密鍵へのパスとパスワード、公開鍵へのパスを設定するだけで、残りの処理は実行されます。

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

そして解読:

暗号化は同じくらい簡単です

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

あなたはGitHubRubyGemsでそれをチェックアウトすることができます。

0

Symmetric Encryptionは非常に高速で、非常に大きなファイルのストリーミングに優れています。

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

Symmetric Encryptionは、組織内のデータと大きなファイルを暗号化するために設計されています。

他の組織とファイルを共有する場合、最良の選択肢はPGPです。 PGPで非常に大きなファイルのストリーミングのために考慮してください。IOStreams

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

ファイルのiostream /より多くのPGP例についてのlib/io_streams/pgp.rbを見てください。また、Rubyから直接PGP鍵管理をサポートしています。