[解決済み] openssl_encryptにおける初期化ベクトルの使用について
質問
私は この の質問を見て、自分でもやってみたくなりました。私はこのコード(から直接取られた)を実行したとき この答え ):
$textToEncrypt = "My super secret information.";
$encryptionMethod = "AES-256-CBC"; // AES is used by the U.S. gov't to encrypt top secret documents.
$secretHash = "25c6c7ff35b9979b151f2136cd13b0ff";
//To encrypt
$encryptedMessage = openssl_encrypt($textToEncrypt, $encryptionMethod, $secretHash, '1234567812345678');
//To Decrypt
$decryptedMessage = openssl_decrypt($encryptedMessage, $encryptionMethod, $secretHash);
//Result
echo "Encrypted: $encryptedMessage <br>Decrypted: $decryptedMessage";
しかし、警告が表示されます。
openssl_encrypt(): Using an empty Initialization Vector (iv) is potentially insecure and not recommended
そこで、私は ドキュメント を見てみましたが、「ドキュメントがない」のです。そこで、次のようなものを見つけました。 コメント を見つけましたが、初期化ベクターがどうあるべきか、それをどう使うべきかについては、まだ言及されていません。どなたか教えていただけませんか?
私はもっとググることができたと思いますが、Stackoverflow は多くの検索結果で最初に出てくるので、この質問はこの問題を抱えている他の誰かにとって有用であるかもしれないと思いました。
どのように解決するのですか?
IVとは一般に、暗号化されたテキストがユニークであることを保証する乱数のことです。
なぜそれが必要なのかを説明するために、「secret」という鍵で暗号化された人名のデータベースがあり、IVがない場合を想定してみましょう。
1 John dsfa9p8y098hasdf
2 Paul po43pokdfgpo3k4y
3 John dsfa9p8y098hasdf
もしJohn 1が自分の暗号文(dsfa9p8y098hasdf)を知っていて、他の暗号文にアクセスできれば、Johnという名前の他の人たちを簡単に見つけることができます。
さて、実際には、IV を必要とする暗号化モードでは、常に IV を使用します。IV を指定しない場合、IV は自動的に null バイトの束に設定されます。最初の例で、IV が一定 (00000000) であることを想像してみてください。
1 John dsfa9p8y098hasdf 00000000
2 Paul po43pokdfgpo3k4y 00000000
3 John dsfa9p8y098hasdf 00000000
暗号文の繰り返しを防ぐために、同じ「秘密」鍵とランダムなIVを使用して名前を暗号化することができます。
1 John sdf875n90mh28458 45gh3546
2 Paul fg9087n5b60987nf 56897ngq
3 John gjhn0m89456vnler 8907345f
ご覧の通り、2つの「John」暗号文は異なるものになりました。それぞれのIVはユニークで、暗号化処理に影響を与え、最終結果もユニークになります。John 1は現在、ユーザー3の名前が何であるかわかりません。
復号化には、もちろんテキストが暗号化されたのと同じ IV を使用する必要があり、それがデータベースに保存されなければならない理由です。IVは鍵なしでは役に立ちませんので、暗号化されたテキストと一緒に送信または保存することは問題ではありません。
これは単純化しすぎた例ですが、実際のところ、IV を使用しないことは、セキュリティに重大な影響を及ぼします。
今、あなたのコードは IV (1234567812345678) を設定しているように見えますが、復号化では使用していないようです。これは確実に失敗します。
また、PHPのIV生成関数のいくつかを利用したいと思うかもしれません。これはあなたのために働くはずです。
$iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
$encryptedMessage = openssl_encrypt($textToEncrypt, $encryptionMethod, $secretHash, 0, $iv);
$decryptedMessage = openssl_decrypt($encryptedMessage, $encryptionMethod, $secretHash, 0, $iv);
保存・送信の場合は、IVと暗号文を以下のように連結すればよい。
$data = $iv.$encryptedMessage;
そして、回収時にIVを引き出して復号化する。
$iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
$iv = substr($data, 0, $iv_size);
$decryptedMessage = openssl_decrypt(substr($data, $iv_size), $encryptionMethod, $secretHash, 0, $iv);
より詳細な情報は、PHPのMcryptライブラリをチェックしてみてください。非常に充実した機能で、たくさんのサンプルがあり、その多くが openssh の暗号化実装に役立ちます。 http://php.net/manual/en/function.mcrypt-encrypt.php
関連
-
[解決済み] PHP & MySQL: mysqli_num_rows() expects parameter 1 to be mysqli_result, boolean given [重複] PHP & MySQL: mysqli_num_rows() expects parameter 1 to be mysqli_result, boolean given.
-
[解決済み] php5パッケージのインストール候補がない (Ubuntu 16.04)
-
[解決済み】未定義の関数mysql_query()をLoginで呼び出す【重複
-
[解決済み】mysqli_select_db()は、パラメータ1がmysqliであることを期待し、文字列が与えられる。
-
[解決済み】/var/www/htmlとは何ですか?[クローズド]
-
[解決済み】Netbeans 7.4 for PHPで「スーパーグローバルな$_POST配列に直接アクセスしないでください」という警告が発生する。
-
MacでPHPを実行した際に、メモリサイズが134217728バイトも消費される問題の解決方法について
-
[解決済み】phpのシンタックスエラー、予期しないT_IFエラーを修正する方法は?[クローズド]。
-
[解決済み] オートロードとは何ですか; spl_autoload、__autoload、spl_autoload_register はどのように使うのですか?
-
[解決済み] どのような場合に '$this' よりも 'self' を使うべきですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】move_uploaded_fileは、「failed to open stream: Permission denied" というエラーが出る
-
[解決済み】予期せぬ例外。SQLSTATE[HY000] [1045] Access denied for user ****@'localhost' (using password: YES)
-
[解決済み] php5パッケージのインストール候補がない (Ubuntu 16.04)
-
[解決済み】 $_SERVER['DOCUMENT_ROOT'] と $_SERVER['HTTP_HOST'] の違いについて]
-
[解決済み】 libapache2-mod-php7 パッケージが見つからない。
-
[解決済み】Laravel 5.2 Storage::makeDirectory($dir) でディレクトリが作成されない。
-
[解決済み】既に開始されているPHPセッション【重複あり
-
[解決済み] * vchiqインスタンスを開くのに失敗しました。
-
[解決済み】書き込みコンテキストでメソッドの戻り値を使用することができない
-
[解決済み] PHP 未定義関数への呼び出し