2013-07-01 28 views
5

Railsアプリケーションでフィールドレベルの暗号化にattr_encrypted gemを使用することを検討しています。この宝石で使用する暗号鍵を生成するにはどうすればよいですか?attr_encryptedで使用する暗号鍵の生成方法

secret_key = Digest::SHA256.hexdigest('a secret key') 
encrypted_value = Encryptor.encrypt('some string to encrypt', :key => secret_key) 

私はa secret keyは任意のことができることを推測する:|:

更新(基本的な使い方下)attr_encryptedで使用される基本的な暗号化であるEncryptorため

ドキュメント、次のように述べて長さがランダムな文字列で、hexdigestを呼び出すと、そこから適切な固定長の文字列が計算されます。これをお勧めする方法ですか?

+0

私は答えようとしましたが、質問があります。誰(またはどのようなシナリオ)で平文データを秘密にしていますか? –

+0

オフサイトバックアップの目的(オフサイトバックアップシステムでは暗号化キーにアクセスできない場合)のために、データベース内の特定のフィールドを安心して暗号化する必要があります。 –

+0

その場合、オフサイトシステムはデータにアクセスできますが、構成やソースコードにはアクセスしていないと思いますか?おそらくキーの少なくとも一部を格納する設定にはまだ間違いがあり、それを供給する方法として正しいキーを取得するメソッドを呼び出すという宝石の能力を使用します。しかし、ソースコードがバックアップデータフィールドあたりの暗号化キーのハードコーディングも実行可能です。 –

答えて

6

鍵は単なる文字列であり、文字列であれば、平文データを見ることを許可されていない人から離れても構いません。あなたは単にSecureRandom.base64を使って鍵を生成することができます。そうすれば、あなたからの努力はほとんど無駄になりますが、それは事実上、暴力によってはっきりしないでしょう。

ここで興味深いのは鍵管理です。この宝石のオプションは、次のように表示されます。

  • アプリケーションにキーをハードコードします。これにより、例えば敏感なデータの「誤った」読み取りが防止される。 DBAやサポートエンジニアが、ソースコードとデータベースの両方にアクセスできる場合、宝石の仕組みを知っている人からは安全ではありません。

  • 参照キーを決定する名前付きメソッドを参照してください。これはもっと面白いですが、キーをデータベースに入れてもセキュリティはあまり増えません。データベースとコードにアクセスできる人は、値がハードコードされている場合と同じように処理できます。

あなたは少し物事を向上させることができ、あるいは少なくとも開発チームは、アプリケーションが、おそらく開発者(または開発者のちょうど過半数の場所からキーの少なくとも一部を読むことによって、暗号化されたデータから分離します)は本番環境ではアクセスできません。アプリケーションは暗号化/復号化キーにアクセスして実行する必要があるため、この宝石をそのまま使用すると、それ以上のことは難しくなります。

これが十分であるかどうかは、データを最初に暗号化する理由によって異なります。

+0

+1。ありがとう、Neil。私の場合の暗号化の主な目的は、オフサイトで物理的にキーから分離されたデータベースバックアップの残りのデータでの暗号化です。キーはコードとは別に保存されます。ほとんどの場合、プロダクションサーバー上のプロダクションキー値にのみ設定される環境変数によって設定されます。キーはアプリケーションのソースコードに埋め込まれません。 –

+0

生成されるキーの長さはどのくらいですか? –

+0

'SecureRandom.base64'のデフォルト出力は適切でなければなりません(22文字までの可変文字).20文字以上を選択する以外は、入力するのが面倒なことがあります。それを余分に長くしても、実際にIMOのセキュリティは向上しません。 –

関連する問題