web-dev-qa-db-ja.com

PHP&MySQLある時点で復号化する必要があるデータの暗号化

ユーザーが「ギフトカードピン」を購入するアプリを持っています。購入が完了すると、ブローカーとしてサードパーティからピンを購入し、エンドユーザーに提供する必要があります。

ピンを取得したら、ユーザーが通常のカードのように使用できるようにピンをアップロードする必要があります。これは機密データである必要がありますが、同時に最終的にエンドユーザーに表示する必要があるデータのため、私はここで最善のアプローチに悩まされています。

これらのコードを安全に保存する必要がありますが、同時にエンドユーザーが販売者XYZのWebサイトでユーザーにコードを表示する必要があるため、コードをデコードできます。

アプリケーションは、暗号化ライブラリが組み込まれたPHPのCodeIgniterフレームワークを使用します。

例:

$this->encryption->encrypt($data['Pin'])

次に、ピンは暗号化されてMySQL DBに保存され、次のようにして取得できます。

$this->encryption->decrypt($pin)

セキュリティの観点からのこの問題は、PHPアプリケーションに暗号化キーが格納されているため、これらのメソッドを実行できるようにすることです。

最終的にデータの真の値を知る必要があるので、この状況ではハッシュを使用できないと思います。

これに対するアプローチについて何か提案はありますか?

3
SBB

アプリケーションの目的は、シークレットを保存し、適切なタイミングでそれを許可されたユーザーに公開することです。これは、上記の秘密を解読することができなければ機能しません。組織がシークレットに完全にアクセスできないソリューションは機能しないと思います。したがって、最悪のシナリオからユーザーを保護する唯一のセキュリティ対策は、明らかなものです"アプリケーションにセキュリティホールを設けないでください。"

ただし、社内のさまざまな部門の知識を区分化したい場合は、データベース内の保存データを暗号化することも有効です。

たとえば、アプリケーションサーバー管理者のみが本番環境で使用される復号化キーにアクセスできる場合、データベース管理者と開発者に、ピンを盗むことを心配することなく、本番データベースへの読み取りアクセス権を付与できます。日常の問題の大部分は、平文のピンを必要とせずに解決できます。ただし、問題のトラブルシューティングを行うために、運用データベースのピンを解読する必要がある場合があることに注意してください。したがって、プロセスがこれらの状況の例外を許可することを確認してください。

もちろん、これは、組織が実際にそのような区分化が意味をなすのに十分大きい場合にのみ適用されます。 DBA、サーバー管理者、開発者、セキュリティ管理者が同じ人物である中小企業の場合、これらすべては無意味です。

また、権限のないユーザーがデータベースへの読み取りアクセスを取得する(SQLインジェクションやデータベースサーバーの設定ミスなどによって)が、復号化キーが保存されているサーバー設定ではない場合にも役立ちます。ただし、これは考えられる攻撃シナリオの一部にすぎないことを忘れないでください。

ただし、いずれの場合も、保管時のデータ暗号化を過度に設計しないように注意してください。より洗練されたソリューションであるほど、より多くのバグが発生します。そして、それが持つバグが多いほど、そのバグを修正するために復号化されたデータを人々が見ざるを得なくなる状況が多くなります。

2
Philipp

メインのアプリケーションロジックから暗号化および復号化プロセスを処理するためのソリューションを検討する必要がある場合があります。

HSMまたは(SaaS HSM、たとえば AWS CloudHSM )を組み込んで暗号化および復号化プロセスを実行すると、コード内のハードコーディングされたセキュリティ変数が減り、ユーザーによる改ざんも可能になります。あなたの組織では難しい。

必要に応じて、 hashicorp-vault などのシークレットマネージャーや、 thycotic secret server などの特権ID管理ツールを試すこともできます。これらのツールは、パスワードのローテーション、監査証跡などを実行できます。


あなたのOPから、私はあなたの論理を100%確信していませんが、購入時にユーザーにコードを割り当てたいと思うかもしれません。これに該当する場合は、代わりにユーザーにコードの予約を割り当てて、ユーザーが要求して「1回限り」にする場合にのみプルすることで、露出を減らすことができます。たとえば、書き留める必要があるか、取得できないそれをもう一度、または少なくとも、ユーザーが実際にそれを引き換える必要があると最初に言った後でのみ、ユーザーに公開します。

ここでも、HSMを使用すると、割り当てられるか、実際に割り当ての管理に使用されるまで、ピンコードのリストを安全に保つのに役立ちます。


理想的には、すべてのユーザーが秘密鍵と公開鍵のペアを持ち、値を暗号化して特定のユーザーだけが復号できるようにすることができます。ただし、これは Webアプリで実行 するのはかなり困難です。

人々のパスワードを保存するLastPass のようなものに似た設定を考えてみてください。しかし、LastPassには、人々の保存されたパスワードの大きなプレーンテキストデータベースはありません。

MIT Mylar を見て、機密データの管理と保護をどのように処理するかについてもご覧ください。

チェックアウト:


また、サプライヤからカードとピンのリストを取得するときに考慮する必要があることも考慮してください。このファイルを保護しておく必要があります。そうすると、このプロセスで中間ファイルが残ります。つまり、データが他の場所に公開される可能性があるため、app/dbへの途中でデータが公開される可能性のある場所を確認します。

0
Eric G