2

mysqlを使用するRails3アプリケーションがあります。このアプリは、顧客の電話番号とメールアドレスをテーブルに保存します。フィールドを単純な値として保存するのではなく、暗号化したいと思います。このようにして、データベースにアクセスできたとしても、テーブルはだれにも役に立たなくなります。

しかし、別の問題があります。レコードは、電子メールと電話番号を使用して多くのクエリが実行され、インデックスが作成されます。パフォーマンスに影響を与えることなくフィールドの暗号化を実現し、それでも簡単に検索して照合できるようにするにはどうすればよいですか?

4

3 に答える 3

5

まず、誰かがあなたのコードファイルを読み取るのに十分なアクセス権を取得した場合、おそらく彼はあなたの復号化ルーチンとキーを取得することを覚えておいてください-あなたの暗号化はデータベースへのアクセス権を取得する攻撃者からのみあなたを保護します。

MySQLを使用して部分的なメールアドレスと電話番号を検索する場合、暗号化を使用することはできません-データがMySQLが読み取れない方法で暗号化されている場合、MySQLは読み取ることができないため、検索できませんそれ。

ただし、次のことを行うことができます。

  • データをハッシュし、「email_hash」列にハッシュを保存します
  • データを暗号化し、2番目の列「email_crypt」に保存します

電子メールXの行を検索する場合は、email_hash = hash(X)の場所を選択します。行の電子メールアドレスを知りたい場合は、email_cryptを選択して復号化します。

ただし、これにより、攻撃者は特定の電子メールがデータベースにあるかどうかをテストできます(つまり、ハッシュをブルートフォースする可能性があります)。これを防ぐには、ハッシュにHMACメソッドを使用し、キーを秘密にしておく必要があります。

これで、「ハッシュをスキップして、プレーンな電子メールアドレスを暗号化し、同じ暗号化された文字列を含む行を探すことで検索を実行できます」と考えることができます。いいえ、それはできません。データを暗号化する場合は、データと一緒に保存するランダムな「IV」を使用して、同じデータを2回暗号化すると、異なる結果が得られるようにします。IVを一定の値に設定することもできますが、これは暗号化を使用する非標準的な方法であり、セキュリティの問題を引き起こす可能性があるため、そうしないでください。また、AES-CBCなどの適切なチェーンモードを使用します。

于 2012-12-31T05:48:46.343 に答える
1
  1. 暗号化: 対称暗号化 (AES) が必要です。マスター暗号化キーを使用して暗号化キー (データ暗号化キーと呼びます) を暗号化してください。
  2. Fast Query and Retrieval : テーブルには、電子メールと電話番号の一方向ハッシュ値も必要です。テーブルで検索を発行する前に、ハッシュ (SHA-1) または (MD5) を生成します。
于 2012-12-31T05:40:22.763 に答える
1

MySQL で行う方が簡単です。単純な MySQL のENCODE/DECODE関数または や などの高度な関数AES_DECRYPT()のいずれかを使用できますAES_ENCRYPT()

全機能一覧はこちら

注:使用するものは何でも、この行に対して列にソルトを保存してください。そして、アプリケーション構成ファイルに別のソルトを保存します。これにより、動的ソルトを使用して暗号化が行われ、ソルトの一部を秘密にすることもできます。攻撃者がそれらを取得するのは困難です。

于 2012-12-31T05:41:14.433 に答える