可逆暗号の保管と安全性
解決済
回答 2
投稿
- 評価
- クリップ 5
- VIEW 4,811
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ページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
+4
パスワードが一人ひとり分かれておりデータベースに「IV + パスワード + 暗号化したデータ」の形で保存されているなら総当りする必要もなく簡単に復号できます。これはかえって危険なようにも見えます
その通りです。なのでパスワード(暗号鍵)はDBには保存せずに、共通の暗号鍵を安全な方法で保存するという方法が一般的かと思います。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
+3
どちらも完全には安全といえないように思えますが何か間違っているでしょうか?
はい、ワンタイムパッドを除いたすべての暗号は、総当り攻撃に対しては対策法はありません。
ただし、AES-128の場合、暗号鍵も128ビットありますので、総当りを試みようとしたら、たとえ1秒間に1兆個試せたとしても、全部試し終わるのに1000京年ほどかかる計算で、とうてい現実的ではありませんし、調べ終わる前に情報の価値も尽きてしまうことでしょう。
このように、現代暗号は「総当りにかかる時間を非現実的なほど長く取る」ことで実用上問題ない安全性を確保する、計算量的安全性にもとづいています。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
-
この投稿は削除されました
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.09%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2017/09/21 19:43
2017/09/21 22:36
しかし、『アクセスを禁止した階層のコンフィグファイル』ですと、スクリプトからも読むことができなくなるので、スクリプトからは読める権限を与えなければなりません。そうなると、スクリプトが乗っ取られた時に、コンフィグファイルは読まれてしまいます。このあたりが、サーバーでデータを暗号化することの難しさになります。コンフィグファイルには読み取り権限を与えて、ファイルの保存場所を難読化により隠すあたりが現実解ではないでしょうか?