web-dev-qa-db-ja.com

「なぜMySQLでAESを避ける​​べきなのか?」ほんと?

2012 Smashing Magazineの記事 から、MySQL自体でAESを回避するためにかなり大胆な声明が出されています。あるいは、「MySQLでAESを使用すべきでない理由」と述べています。ただし、SQL暗号化を検索すると、しばしばAES_ENCRYPT(My)SQLから言及。多くの検索結果がステートメントが正しくないことを意味していると言っているわけではありませんが、それは私に考えさせられました。以下の3つの引用された理由は実際に正しいですか?

「PHPのMcryptがMySQLのAES関数より優れている理由」について、セキュリティの専門家はどのように考えていますか。

  • MySQLでは、暗号化と復号化を行うために、アプリケーションとデータベース間のデータベースリンクが必要です。これにより、データベースに内部障害が発生した場合、不要なスケーラビリティの問題や致命的なエラーが発生し、アプリケーションが使用できなくなる可能性があります。

この問題は理解できません。 PHPで暗号化/復号化する場合、データベースリンクを使用してデータベースに値を保存する必要もありますか? PHP側で復号化が失敗した場合、これもアプリケーションの失敗につながりますか?ここでのポイントは何ですか?

  • PHPは同じMySQLの復号化と暗号化を多少の労力で実行できますが、データベース接続は不要です。これにより、アプリケーションの速度と効率が向上します。

PHPは「少し努力して」それを行うことができ、それによってアプリケーションの速度が向上しますか?ネットワーク経由で送信される前に暗号化しているため、アプリケーション(暗号化を処理します)の速度と効率が向上しますか?どうしてそれが本当だろうか?私の意見では、それは「仕事に最適なツール」に関するものであるため、「phpも機能する」という主張は、それ自体がbestツールも同様です。これは単なるaツールですが、なぜそれが最良のツールであるかという議論はありません。

  • MySQLはトランザクションをログに記録することが多いため、データベースのサーバーが侵害された場合、ログファイルは暗号化キーと元の値の両方を生成します。

これは、データベースの値を暗号化し、ロギングをオンにしている場合に有効なポイントです。 バイナリログ はトランザクションのみをログに記録し、selectステートメントはログに記録しないため、少なくとも 一般クエリログ をオフにする必要があります。ロギングをまったく必要としない場合は、「MySQLでAESを使用する場合は、すべてのロギングをオフにする」というステートメントを作成できます。これは、「MySQLでAESを使用する場合は、phpで実行する」よりも私には有効に思えます。

上記のポイントが有効である理由、および一般に-(My)SQLではなく(php)アプリケーションでデータを暗号化する方が良い理由を誰かに説明できますか?.

23
Jurian Sluiman

MySQLでAES_ *関数を使用しない主な理由は、安全ではないECBブロック操作モードを使用しているためです。

続きを読む:

https://en.wikipedia.org/wiki/Block_cipher_mode_of_operation

編集:MySQL 5.6.17以降は変更され、MySQLはCBCブロックモードをサポートしていますが、手動で有効にする必要があります。読む http://mysqlserverteam.com/understand-and-satisfy-your-aes-encryption-needs-with-5-6-17/

17
Matrix

すべてのパフォーマンスに関して、MySQLにAES暗号化を実行させることは大したことではないことをお勧めします。データの暗号化よりも、データのフェッチや書き込みに(平均して)多くの時間を浪費するでしょう。これは、データベースが暗号化と復号化を行うだけの場合を除いてです。

それにもかかわらず、MySQLにAESを実行させることには大きな問題が1つあります。暗号化キーがプレーンテキストとして渡されるMySQLに対してクエリを発行するには、PHPアプリケーションが必要です。これを保護するには、安全な接続、またはtcpdumpコマンドは、PHP-MySQLの議論を簡単に盗聴することができます。

PHPアプリがデータを内部的に暗号化する場合、データの露出が少なくなり、暗号化されていないデータまたは表示可能なキーを処理するコンポーネントが1つ少なくなります。

5
Shlomi Noach

(重複していることに同意しません データベース関数またはコードを使用して暗号化を実行するのが望ましいですか? 多くの重複があります)

私がポストについて考えることができる唯一の正当化-それは重要で有効なもの-は、アプリケーション層(PHP)のスケーリングは簡単ですが、リレーショナルデータベース層(MySQL)のスケーリングは難しいということです。前者の場合は、サーバーを追加するだけですが、後者の場合は、より大きなボックス/協調型クラスタリングが必要です。したがって、PHPで暗号化を行うと、DBMSの負荷が軽減されます。

さらに、「MySQLにはデータベースリンクが必要です...」に関して、処理のためにデータを他の場所に送信するとレイテンシが発生します。一部のデータの暗号化または復号化された値の計算は困難な場合がありますが、ネットワーク経由でデータを送信する場合と同じくらいの時間がかかることはほとんどありません。

ただし、最も重要な問題は、これがセキュリティモデルにどのように適合するかということです。そこでログとキー管理の問題が出てきます。

4
symcbean

MySQLの暗号化関数に関するドキュメントに従って、 http://dev.mysql.com/doc/refman/5.5/en/encryption-functions.html

注意

暗号化関数の引数として指定されたパスワードまたはその他の機密値は、SSL接続が使用されていない限り、MySQLサーバーにプレーンテキストで送信です。また、そのような値はMySQLログに表示されますに書き込まれます。これらのタイプの公開を回避するために、アプリケーションはサーバーに送信する前にクライアント側で機密値を暗号化できます。同じ考慮事項が暗号化キーに適用されます。これらの公開を回避するために、アプリケーションはストアドプロシージャを使用して、サーバー側で値を暗号化および復号化できます。

これらを回避するために、クライアント側で暗号化することをお勧めします。

4
Karthick