質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.36%

  • PHP

    21232questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • MySQL

    6137questions

    MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

  • セキュリティー

    475questions

    このタグは、コンピューターシステムの安全性やデータの機密性に関連したトピックの為に使われます。

可逆暗号の保管と安全性

解決済

回答 2

投稿

  • 評価
  • クリップ 5
  • VIEW 1,555

nuages

score 31

PHPに限った話ではないですが、復号可能なデータをデータベースに安全に保管する方法について考えています。

仮に会員名簿のメールアドレスを暗号化して保存するとします。
暗号化方式には一般的と思われる「AES-128-CBC」を使います。

暗号化に必要な初期化ベクトル(IV)はランダムな16バイトのデータを用います。
複合したデータを閲覧可能なのは管理者だけなので暗号化の際のパスワードは全員共通か、それぞれにランダムなパスワードを生成しても良さそうです。

いろいろなサイトを見る限りではIVの値は先頭につけて「IV + 暗号化したデータ」の形で保存しているようでした。

パスワードが全員共通ならコンフィグファイル書いておいたパスワードで暗号化すれば良さそうですが、パスワードを全員ランダムにするならそのパスワードもデータベースに保存しておかなければいけません。
先程の流れで行くと「IV + パスワード + 暗号化したデータ」とし、区切り文字で区別するかパスワードの文字数を固定して文字数で切り出せば取り出せそうです。

ここでデータベースの内容が外部に流出したケースを想定します。

まず不正入手者は暗号化方式はありふれた「AES-128-CBC」だと仮定し、IV の長さは16文字だと推測します。
次にデータベースの内容を見て先頭16文字がIVで残りが暗号文と考えます。パスワードが全員共通でコンフィグファイルに書かれている場合はパスワードは不明なのでランダムなパスワードを総当りで試し一人成功すれば全員分のデータを復号できます。

パスワードが一人ひとり分かれておりデータベースに「IV + パスワード + 暗号化したデータ」の形で保存されているなら総当りする必要もなく簡単に復号できます。これはかえって危険なようにも見えます。データベースにはパスワードそのものではなくソルトをもたせ、コンフィグの全員共通のパスワードと合わせることで正しく復号できるようにするなら少しは時間が稼げそうです。

どちらも完全には安全といえないように思えますが何か間違っているでしょうか?
あるいはもっと根本的に異なる安全な保管の仕方があるのでしょうか?

よろしくお願いします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+3

パスワードが一人ひとり分かれておりデータベースに「IV + パスワード + 暗号化したデータ」の形で保存されているなら総当りする必要もなく簡単に復号できます。これはかえって危険なようにも見えます

その通りです。なのでパスワード(暗号鍵)はDBには保存せずに、共通の暗号鍵を安全な方法で保存するという方法が一般的かと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/09/21 19:43

    回答ありがとうございます。やはりデータベースに暗号鍵を保存しておくのは良くないのですね。アクセスを禁止した階層のコンフィグファイルに共通の暗号鍵を保管する形で進めてみようと思います。

    キャンセル

  • 2017/09/21 22:36

    そうですね。それがいいと思います。
    しかし、『アクセスを禁止した階層のコンフィグファイル』ですと、スクリプトからも読むことができなくなるので、スクリプトからは読める権限を与えなければなりません。そうなると、スクリプトが乗っ取られた時に、コンフィグファイルは読まれてしまいます。このあたりが、サーバーでデータを暗号化することの難しさになります。コンフィグファイルには読み取り権限を与えて、ファイルの保存場所を難読化により隠すあたりが現実解ではないでしょうか?

    キャンセル

+1

どちらも完全には安全といえないように思えますが何か間違っているでしょうか?

はい、ワンタイムパッドを除いたすべての暗号は、総当り攻撃に対しては対策法はありません。

ただし、AES-128の場合、暗号鍵も128ビットありますので、総当りを試みようとしたら、たとえ1秒間に1兆個試せたとしても、全部試し終わるのに1000京年ほどかかる計算で、とうてい現実的ではありませんし、調べ終わる前に情報の価値も尽きてしまうことでしょう。

このように、現代暗号は「総当りにかかる時間を非現実的なほど長く取る」ことで実用上問題ない安全性を確保する、計算量的安全性にもとづいています。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.36%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • PHP

    21232questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • MySQL

    6137questions

    MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

  • セキュリティー

    475questions

    このタグは、コンピューターシステムの安全性やデータの機密性に関連したトピックの為に使われます。