質問

Stack Overflowを見つけたばかりで、プロジェクトで友人と一緒に持っている制約のアイデアがあるかどうかを確認していますが、これは理論的な質問ですしばらくの間答えを見つけようとしています。

暗号技術にはあまり詳しくありませんが、十分に明確でない場合は、質問を明確にするために編集/コメントしようとします。

簡単に説明すると、環境は次のようなものです。

  • 暗号化/復号化キーおよびバックエンドへのアクセスとしてのフロントエンドがストレージおよびクエリにのみ使用されるアプリケーション。

  • いくつかのフィールドにアクセスできないデータベースがある場合、たとえば「アドレス」と言ってみましょう。これは通常どおりtext / varcharです。

  • 情報を復号化するためのキーにアクセスできず、すべての情報はすでに暗号化されたデータベースに到着します。

主な問題は次のようなものです。データベースで一貫してクエリを実行する方法です。「%F§ YU /´〜#JKSks23%」のようなアドレスを実行することはできません。 。 (もしこれに対する答えを感じている人がいれば、遠慮なく撮影してください。)

ただし、 where address = '±!NNsj3〜^º-:' を実行しても大丈夫ですか?それとも、データベースを完全に使い果たしてしまうでしょうか?

適用される可能性のあるもう1つの制限は、フロントエンドで利用できる処理能力があまりないため、すでに情報の暗号化/復号化が開始されて情報が限界に達することです。 (「テーブルの結合をフロントエンドにエクスポートしてクエリする」などの返信を避けるためだけにこれを言ってください。)

誰かがそれについて考え続ける方向を教えてくれますか?


午前4時に非常に高速に返信していただき、ありがとうございます。初めての使用では、このコミュニティに感銘を受けました。 (または、多分、私はそれが異なるタイムゾーンのためだけだと思います)

情報を入力するだけです:

主な問題は、部分一致に関するものです。ほとんどのデータベースの必須要件は、部分一致を許可することです。主な制約は、実際にはデータベース所有者がデータベース内で情報を調べることを許可されないです。最後の10分間で、データベースの問題の可能性に再び拡張する可能な解決策を考え出しました。ここに追加します:

半部分一致を可能にする解決策:

  • 実際には、パスワードとユーザーのいくつかの公開フィールドが暗号化の鍵です。認証の目的は、静的な値を暗号化し、データベース内で比較することです。
  • 解析された方法で情報が格納される新しいテーブルセットを作成します。たとえば、「4th Street」のようなものです。 2つの暗号化された行になります(1つは「4番目」、もう1つは「ストリート」になります)。これにより、検索が別のテーブルで既に実行される可能性があるため、すでに半部分一致が許可されます。

新しい質問:

  • これはおそらくデータベースサーバーを再び使い果たしてしまうのでしょうか、それとも部分一致の問題の実行可能な解決策だと思いますか?

Post Scriptum:Cade Rouxからの回答は受け入れられませんでした。ただ、さらなる議論と、特に新しい質問への可能な回答を許可するためです。

役に立ちましたか?

解決

あなたが説明した方法でそれを行うことができます-ハッシュを効率的に照会しますが、その要件を持つシステムは多くありません。暗号化がルールアウトするため、一致します。圧縮に関する問題と同じです。数年前、非常に小さな環境では、データをデータ形式に入れる前に圧縮する必要がありました。もちろん、これらのフィールドは簡単に検索できませんでした。

より一般的なアプリケーションでは、最終的に、キーはチェーン内の誰か(おそらくWebサーバー)が利用できるようになります。

エンドユーザートラフィックの場合、SSLはそのパイプを保護します。一部のネットワークスイッチはWebサーバーとデータベースの間でそれを保護でき、暗号化されたデータをデータベースに保存することは問題ありませんが、そのような暗号化されたデータに対してクエリを実行することはありません。

データが表示されると、そのデータはマシン上にあるため、その時点であらゆる汎用コンピューティングデバイスを回避でき、アプリケーションの外で実際に機能する境界防御が可能になります。

他のヒント

データベーステーブルを保持するディスクを暗号化し、データベース接続を暗号化し、データベースを正常に動作させるのはなぜですか?

[このレベルの妄想を必要とするコンテキスト/制約を実際に理解していない]

編集:"法律の制約"え?あなたが違法なことに関与していないことを願っています、私は不注意なアクセサリーになりたくない...;-)

場合-ahem-法的制約-この解決策を強制し、それですべてです-LIKE一致なし、クライアントマシンが処理できない場合の応答が遅くなります。

数か月前、同じ問題に遭遇しました:データベース全体(インデックスを除く)が暗号化され、部分一致の問題が発生しました。

解決策を探すためにインターネットを検索しましたが、これにはあまり対処する必要はありませんが、「回避策」があります。

最終的に採用したソリューションは次のとおりです。

  1. クエリが実行され、復号化されるフィールドのデータと、テーブルの主キーである別のフィールドで一時テーブルを作成します(明らかに、このフィールドはそのまま復号化する必要はありませんプレーンテキスト)。

  2. その一時テーブルに対して部分一致を再度実行し、識別子を取得します。

  3. これらの識別子の実際のテーブルを照会し、結果を返します。

  4. 一時テーブルを削除します。

これは簡単なオーバーヘッドではないことは承知していますが、データベースが完全に暗号化されていることが必須である場合、このタスクを実行する別の方法は見つかりませんでした。

特定のケースによっては、結果のデータを失うことなく、一時テーブルに挿入される行数をフィルタリングできる場合があります(クエリを実行しているユーザーに属する行などのみを考慮してください)。 ..)。

md5ハッシュを使用します。基本的に、それは文字列を受け取り、それを再現できないハッシュに変換します。その後、それを使用して後で物事を検証できます。例:

$salt = "123-=asd";
$address = "3412 g ave";

$sql = "INSERT INTO addresses (address) VALUES ('" . md5($salt . $address) . "')";
mysql_query($sql);

次に、将来住所を検証するために:

$salt = "123-=asd";
$address = "3412 g ave";

$sql = "SELECT address FROM addresses WHERE address = '" . md5($salt . $address) . "'";
$res = mysql_query($sql);
if (mysql_fetch_row($res))
    // exists
else
    // does not

現在はデータベース側で暗号化されているため、ソースコードを調べても誰も見つけられません。ただし、ソルトを見つけると、解読できます。

http://en.wikipedia.org/wiki/MD5

後でクエリする機密データを保存する必要がある場合は、プレーンテキストで保存し、できる限りそのテーブルへのアクセスを制限することをお勧めします。

それができず、フロントエンドでオーバーヘッドが必要ない場合は、サーバーで実行され、暗号化されたデータを処理するコンポーネントをバックエンドで作成できます。

暗号化されたデータにクエリを作成しますか?優れた暗号化アルゴリズムを使用している場合、その方法は想像できません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top