前提・実現したいこと
独学でプログラミングを勉強しています。
今回はクレカ情報を扱うシステムを想定して作成しているのですが,クレカ情報の適切な保存方法のところで躓いてしまいました。
クレカ情報などの個人情報を保存する方法について考えてみたので問題があるところ,改善できるところをご教授いただきたいです。
よろしくお願いします。
###環境
製作はXamppでのApache,mysql,php7.4ですが,
仮想として,レンタルサーバ(XserverやCoreServer,さくらサーバ等)でのLet's Encryptでの運用を前提として考えて頂けると嬉しいです。
###準備ファイル
password.jsonは100個ほど適当に作成します。(16文字)
password.jsonは非公開ディレクトリ(public_htmlよりも上のディレクトリ)に保存。
json
1{ 2 1:"password1", 3 2:"password2", 4 ・ 5 ・ 6 ・ 7 100:"password100" 8}
以下のようにphp側でデータを暗号化し,暗号化したデータとベクトルデータ,パスワードのidをデータベースに保存しようと思います。
勿論,情報を取得する場合はphpで複合化します。
php
1if(isset($_POST['card_number'])//カード番号 2 && is_int($_POST['card_number'])//カード番号が数字かのチェック 3 && str_length((int)$_POST['card_number'])==16//カード番号の桁数確認 4 && isset($_POST['card_expire'])//有効期限 5 && isset($_POST['security_code'])//3桁のセキュリティコード 6 && is_int($_POST['security_code'])//3桁のセキュリティコードが数字かのチェック 7 && str_length((int)$_POST['security_code'])==3//セキュリティコードの桁数確認 8){//POST内容の不足等チェック 9$pwd_number=1;//1-100をランダムに取得 10$password=$password[$pwd_number];//password.jsonからパスワードを取得(割愛) 11$method='AES-256-CBC';//より良い暗号化方式はなんでしょう? 12$iv_length = openssl_cipher_iv_length($method); 13$iv=openssl_random_pseudo_bytes($iv_length); 14$encrypted = openssl_encrypt($text, $method, $password, 0, $iv); 15$iv = bin2hex($iv); 16$stmt=$pdo->prepare("INSERT INTO card_info (card_number,cn_iv,pwd_number) VALUES(?,?,?)"); 17$stmt->execute(array($encrypted,$iv,$pwd_number)); 18}
この方法では,個人情報を扱うには脆弱でしょうか?
ベクトルデータもパスワードと同じように別ファイルで作成しておき,idと紐づけの方法もあるかと思います。
###質問したいこと
0. 上記の方法でのセキュリティレベル(十分,不十分など,理由も教えて頂きたい)
0. 上記の方法での脆弱性(どの部分がセキュリティホールに繋がるのか,改善方法など)
0. 実際に運用されている個人情報保存方法など
以上,よろしくお願いします。
#お礼
沢山のご回答ありがとうございました。
まだまだ自分の勉強不足だと感じましたのでこれからも勉強頑張ってまいります。
普段からセキュリティ関係のことでEGセキュアソリューションズ様のサイトを確認させていただいておりますし,ご丁寧な回答でしたのでockeghem様をベストアンサーに選ばさせていただきました。
回答3件
あなたの回答
tips
プレビュー