問題タブ [pgcrypto]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - Java と Postgre データベースを使用したクライアント側の暗号化
クライアント側のテナントごとの暗号化の実装についてかなりの掘り下げと調査を行いましたが、アプリケーションをどのように進めるべきかについて少し困惑しています。いくつかの背景として、を使用してデータベースdropwizard
に情報を格納する多くのカスタム DAO を持つアプリケーションがあります。データベースには、多くのテーブル、カスタム関数、カスタム ユーザー定義データ型があります。私たちの要件は、お客様の機密データを暗号化する必要があることです (データベース テーブルの特定の列)。データは、テナントごとに行で分割されます。postgres
jooq
データの暗号化をどこに置くかについて 2 つのオプションがあることを理解しています。
- 私たちのアプリケーションでは
- 私たちの
postgres
データベースでは
上記の2つのオプションを調べたときに見つけたものは次のとおりです。
私たちのアプリケーションに暗号化を入れることは私の当初の計画でしたが、すべての DAO を編集しなければならないことは、多くの問題を引き起こし、非常に時間がかかる可能性があります。
そこで、pgcrypto を使用して列側の暗号化を使用してデータベースに暗号化を処理させるという代替案を検討しました。ただし、前述のように、列のすべてのカスタム データ型が原因で、暗号化されたデータが として返されるため、これらのカスタム データ型の列に暗号化されたデータを保存することはできませんbytea
。ドキュメンテーションやその他のスタック オーバーフローの投稿の剪定 可能であれば回避したいカスタム タイプと bytea を受け入れるようにこれらの列のデータ型を変更する以外に、これに対する解決策を見つけることができませんでした。
この後、ここで説明した両方のオプションを使用すると、かなりの時間がかかり、アプリの多くが壊れる可能性があるため、次にどのように進めるのが最善かについて少し困惑しています。
私が持っていた他のいくつかのアイデア:
- 暗号化を調べ
jooq
たりliquibase
実行したりしましたが、何も見つかりませんでした。 - 列のデータ型を更新する代わりに、新しい暗号化されたバージョンのデータベースを作成し、テーブルのプレーンテキスト表現にビューを使用します。
私の大きな質問: ここでの背景情報を考えると、クライアント側の暗号化を実装するための提案や代替手段はありますか? (現在のアーキテクチャへの影響が最も少ない)
ありがとう!:)
python-3.x - Python SQLALchemy は、コンパイルされたクエリの where 句の変数に pgp_sym_encrypt ではなく、列に pgp_sym_decrypt を使用します。
SQLAlchemy を使用したすべての SQL 操作のメソッドを使用して、各テーブルにクラス モデルを使用します。
pgp_sym_encrypt と pgp_sym_decrypt を PostgreSQL の拡張子でインストールします
SQLAlchemy ドキュメントの助けを借りて my クラス User を使用した後、PostgreSQL のパッケージ pgcrypto の機能である pgp_sym_encrypt を使用してデータを暗号化します (バージョン 13.4 を使用します)。
セキュリティのために、postgreSQL のネイティブ pgp_sym_encrypt および pgp_sym_decrypt ネイティブ関数を使用したいユーザーのデータを暗号化します。psycopg2でプレーンテキストクエリを使用する前に。SQLAlchemy ORM を使用しているため、Flask-SQLALchemy 拡張機能を使用しています。
私は解決策を見つけました: https://docs.sqlalchemy.org/en/14/core/custom_types.html#applying-sql-level-bind-result-processing
しかし、どれもクエリ内で使用する例を示していません
実際、私のコードは次のとおりです。
create_user メソッドを使用すると、ユーザー データのデータが暗号化されます。
しかし、私のクラスで、このメソッドでユーザー名、電子メール、またはその他のデータをチェックして、ユーザーが存在するかどうかをチェックするメソッドを追加した場合:
これにより、次のクエリが生成されます。
このクエリが返さNone
れるのは、実際の ENCRYPTION_KEY で pgp_sym_encrypt を使用すると、データが新しい方法で暗号化されるためです。
https://www.postgresql.org/docs/13/pgcrypto.html#id-1.11.7.34.8 https://en.wikipedia.org/wiki/Pretty_Good_Privacy#/media/File:PGP_diagram.svg
PGPString(TypeDecorator):
pgp_sym_decrypt を使用して SQLAlchemy ドキュメント関数を変更し、以下のクエリのように暗号化された変数ではなく、列を復号化する方法は次のとおりです。
通常、私は今のところ Python と SQLAlchemy でうまくやっていますが、これは本当に私のスキルを超えており、私にはまったく知られていない機能に影響するため、この関数を変更する方法が本当にわかりません。
とりあえずテキスト機能を使ってますが、これはイマイチです
たとえば、ユーザー名から ID を取得する別の方法 (暗号化されたデータ)
助けてくれてありがとう!よろしくお願いします