2009-10-28 9 views
12

大量の機密データを格納する必要のあるレールアプリケーションを作成しています。私の顧客にデータが保護されていることを保証するために、私はそれをユーザーごとに暗号化したい。私はこれを達成できる宝石を探して研究しました。今まで私はstrongboxsafeを見つけました。一緒に、これは私のための解決策を提供するように思われる。Railsを使用してデータベース内のユーザーデータを保護する方法は?

しかし、これが一般的な操作であるかどうかは疑問です。ほとんどのレールアプリケーションには、ユーザーに関する重要なデータが保存されているようです。 はパスワードの暗号化を処理していますが、電子メールやその他の個人情報も慎重です。これらのアイテムを暗号化せずにデータベースに残し、決して侵害されないと想定するのは一般的な習慣ですか?私はデータベースが外界と通信できない領域に存在することを理解していますが、決定された攻撃者はこれを簡単に侵害する可能性があります。 Rails開発者がデータを暗号化せずに残し、単にWebサーバーのセキュリティを信頼するのは一般的なプラクティスですか?

+0

「それが損なわれないことを前提とし、」べきではありません。 –

+0

@Rory:この質問は2年近く経っているので、別のサイトに移行されることはありません。 –

+0

@Bill - wups - 私はそれに気付かなかった。私はちょうどセキュリティタグを参照していたし、日付にも注意を払っていませんでした。ごめんなさい。 –

答えて

12

データベースを暗号化する際の問題は、暗号化されたものはSQLクエリで使用できず、使用する前に復号化する必要があることです。これは、解読鍵をデータベースのすぐ近くに置く必要があることを意味し、ほとんどの場合、誰かがデータベースを侵害する可能性がある場合、解読鍵を同時に侵害したことになります。したがって、暗号化の手順はあなたを少ししか買っていません。パスワードでは、実際にはハッシュ関数なので、復号化は不要です。最初にデータベースが決して妥協されていないことを確認する方がずっと優れています。

ハッカーがセキュリティの一部を侵害する可能性がある場合、常にそのすべてを侵害する可能性があるとします。チェーンはその弱いリンクとすべてのものと同じくらい強いです。

クレジットカード番号と社会保障番号(幸いにもあなたは通常は索引付けする必要はありません)はおそらくこれの最も明白な例外ですが、この質問をする必要がある場合、最初の場所にあるアイテム。あなたは、そのことをいじめるために得ることができるすべての種類の法律上の問題があります。

+4

私は、階層化されたセキュリティー・メカニズムを使用するという業界標準に反することは悪いアドバイスだと思います。最も弱いリンクと同じ強さしかないチェーンへの言及は、防御メカニズムの階層化には適用されません。ただし、必要な場合を除き、機密情報を保管しないようにアドバイスしてください。 – Peder

+2

Bob - より便利で正確な前提があります。十分な時間が与えられれば、攻撃者が特定のセキュリティ機能を侵害すると仮定します。このような理由から、複数のレイヤーを使用して防御を深く使用することができます。これにより、レイヤーを見て反応するポイントまで攻撃を遅らせることができます。 –

+0

徹底的な防御は良い考えですが、データベースフィールドを暗号化することは、それを復号化する必要があることを意味します。あなたが保護しようとしている脅威がすでにあなたの所有しているハッカーであると仮定しているならば、正当な目的のためにサーバがデータに安全にアクセスできるようにするために使用する暗号/ボックス? –

6

クレジットカード番号、SSNなどは、常に暗号化して保存する必要があります。

パスワードは、一方向ハッシュを使用して常に暗号化して保存する必要があります。これは、ユーザーがパスワードを入力すると、DBに格納されているものと一致するかどうかを判断できますが、DBの暗号化された表現のみが与えられている場合は、ブルートフォース/

私のアプリでは、暗号化された表現を扱うのを無防備にするために、暗号化されていない_ ****リーダーとライターをクラスに追加したいと思っています。

class User 
    # has db column encrypted_cc_number 
    def unencrypted_cc_number 
    WhateverEncryptionClassYouUse.decrypt(encrypted_cc_number) 
    end 
    def unencrypted_cc_number=(val) 
    self.encrypted_cc_number = WhateverEncryptionClassYouUse.encrypt(val) 
    end 
end 
3

大量の機密データを格納する場合は、階層化されたセキュリティメカニズムと強力な暗号化を使用することをお勧めします。これは、支払いカード業界のデータセキュリティ基準(PCI DSS)によって要求されます。次のガイドラインの文書をお読みになることをお勧めします:https://www.pcisecuritystandards.org/pdfs/pci_fs_data_storage.pdf

あなたは間違いなく、この質問は、レールや実装固有のものではない

関連する問題