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

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

新規登録して質問してみよう
ただいま回答率
85.48%
MySQL

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

セキュリティー

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

PHP

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

Q&A

解決済

2回答

981閲覧

可逆暗号の保管と安全性

nuages

総合スコア40

MySQL

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

セキュリティー

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

PHP

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

1グッド

5クリップ

投稿2017/09/21 03:38

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

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

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

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

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

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

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

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

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

よろしくお願いします。

hayato7👍を押しています

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

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

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

投稿2017/09/21 06:18

ockeghem

総合スコア11701

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nuages

2017/09/21 10:43

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

2017/09/21 13:36

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

0

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

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

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

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

投稿2017/09/21 04:36

maisumakun

総合スコア145183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問