##前提
XserverのX10プランでにちょっとしたWebアプリを作ろうとしています。
使用言語は,
- PHP
- MySQL
です。
通信はhttpsでLet’s Encryptを用います。
##実現したいこと
一部,個人情報(名前やメアド等)を扱うのですが,データを保護するためにPHPで暗号化したものを保存したいと思っています。
###現在考えている方法
DB接続情報(名前やユーザーなど)や暗号化に用いるパスワードは非公開ディレクトリ(public_htmlより上)に保存し,PHPで読み込むという方法で考えています。
PHP
1$password=$password[$pwd_number];//外部ファイルからパスワードを取得(割愛) 2$method='AES-256-CBC';//より良い暗号化方式はなんでしょう? 3$iv_length = openssl_cipher_iv_length($method); 4$iv=openssl_random_pseudo_bytes($iv_length); 5$iv = bin2hex($iv); 6$encrypted = openssl_encrypt($text, $method, $password, 0, $iv); 7/* 8encryptしたtextとベクトルをDBに保存 9SQLインジェクション対策でプリペアードステートメントを利用 10*/ 11$stmt=$pdo->prepare("INSERT INTO info (encrypted,iv) VALUES(?,?)"); 12$stmt->execute(array($encrypted,$iv)); 13}
この方法で個人情報は守られるでしょうか?
暗号化してからINSERTするのでSQLログに生データは残りませんし,DBが漏洩してもDBだけでは,情報は簡単に解読できないと思います。
が,DBが漏洩するということは,PHPファイルやパスワードなどがあるファイルも抜き取られる可能性が高いと思うのでそうなると,ほぼ無意味になるかと思います。
ちなみにログインなどで使用するパスワードはpassword_hash
を用います。
###保存データ
保存データがなかったので追記しておきます。
- 名前
- メールアドレス
- StripeやPayPayと連携するので公開キーやシークレットキー(受領側)
- StripeやPayPayとの連携情報(CustomerIdやUserAuthorization等)
クレカ情報などはStripeに保存するのでDBでは扱いません。
また,名前で検索をするなどということは想定しておりませんので暗号化したもので保存しても特に問題ありません。
##ご教授願いたいこと
0. 上記の方法でセキュリティとしてはどうなのか
0. よりよい方法はあるのか
0. 実際のアプリケーションではどのように運用されているのか
0. 技術的な突っ込みとかプログラミング方法など突っ込むところがある場合は,内容に限らずご教授いただければ幸いです。
以上,よろしくお願いします。
回答1件
あなたの回答
tips
プレビュー