Upgrade to Pro — share decks privately, control downloads, hide ads and more …

忘れた頃にMcryptは廃止される

 忘れた頃にMcryptは廃止される

PHPerKaigi 2018 LT発表資料です。
https://phperkaigi.jp/2018/

sapi_kawahara

March 10, 2018
Tweet

More Decks by sapi_kawahara

Other Decks in Programming

Transcript

  1. 自己紹介 ▪ 川原 英明(老眼進行中の49歳、PhpStormをナイトモードじゃないツ ライです) ▪ COEDOのふるさと川越に住んでます。 ▪ 元ゲームエンジニアです。(ファミコン時代から開発してました、この当 時のネタも語れます)

    ▪ スキルは、今はやってないアセンブラからC言語に始まって、今はPerl、 PHP、Java、Pythonです、基本的にはなんでもやります! ▪ 今は、どこかの契約社員で、業務委託的なことをしてますが、今日は、 そこのシステムじゃないです。
  2. Mcryptの廃止は、いきなり来た ▪ 自分の感覚では、Mcryptの廃止は、唐突にアナウンスがきたような気 がします。 ▪ PHP 7.1.0で非推奨、PHP 7.2.0で廃止と参考URLにも書いてありまし た。 ▪

    メジャーバージョンじゃなく、マイナーバージョンで廃止って、あんまり 普通じゃない気がします。じゃない気がする。 ▪ 参考 http://php.net/manual/ja/intro.mcrypt.php ▪ 警告 This feature was DEPRECATED in PHP 7.1.0, and REMOVED in PHP 7.2.0.
  3. いいでしょう!Mcryptを抹殺しましょう! ▪ 更によく読むと、Mcryptのドキュメントには「十年近くにわたって放置されて おり」とあります。 ▪ 自分は、これを良い機会だと思いました、PECLで使うのは単なる延命だ! ▪ Mcryptに関するレガシーなコードを抹殺するのが良いのでは? ▪ 推奨しているOpenSSLに行こうじゃないですか?!

    ▪ 参考:http://php.net/manual/ja/migration71.deprecated.php ▪ mcrypt 拡張モジュールは十年近くにわたって放置されており、極めて使いづらいもので す。 そこで、この拡張モジュールを非推奨にしました。かわりに OpenSSL を使いましょ う。 mcryptは PHP 7.2 でコアから削除されて、PECL に移る予定です。
  4. ソースコード1/2 <?php $message = 'テストするための文字'; $key = '01234567890123456789012345678901234567890'; // opensslの利用可能な暗号メソッドを取得

    $ciphers = openssl_get_cipher_methods(); // mcryptの利用可能な暗号メソッドを取得 $algorithms = mcrypt_list_algorithms(); // mcryptの暗号の分、ループする foreach($algorithms as $mcrypt_method) { // ブロックサイズ0は今回は対象外 $size = @mcrypt_get_block_size($mcrypt_method , 'ecb'); if ($size == null) { } else { echo "mcrypt_method: ${mcrypt_method} \n"; echo "input message: {$message} \n"; // 暗号化する文字列を取得したブロックサイズでpaddingする $padding_message = pkcs5_pad($message , $size); // mcrypt_get_key_sizeで、最小のキー長さを取得し、その長さをキーとする $setting_key = substr ($key , 0, mcrypt_get_key_size($mcrypt_method, 'ecb')); // mcryptで暗号化実行 $crypto = base64_encode(mcrypt_encrypt($mcrypt_method, $setting_key, $padding_message, MCRYPT_MODE_ECB)); // opensslで確認する $has_decrypt = false;
  5. ソースコード2/2 // opensslの暗号の分、ループする foreach($ciphers as $openssl_method) { if (preg_match('/ecb¥z/', $openssl_method))

    { // decryptする $decrypt = openssl_decrypt($crypto, $openssl_method ,$setting_key ); // decryptして入力文字列と一致したらOKとする if ($message == $decrypt) { echo "openssl_method: ${openssl_method} is OK¥n"; echo "decrypt message: {$decrypt} ¥n¥n"; $has_decrypt = true; break; } } } if ($has_decrypt == false) { echo "openssl_method: not decrypt ¥n¥n"; } } } function pkcs5_pad ($text, $blocksize) { $pad = $blocksize - (strlen($text) % $blocksize); return $text . str_repeat(chr($pad), $pad); }
  6. 出力結果1/6 mcrypt_method: cast-128 input message: テストするための文字 openssl_method: cast5-ecb is OK

    decrypt message: テストするための文字 mcrypt_method: gost input message: テストするための文字 openssl_method: not decrypt mcrypt_method: rijndael-128 input message: テストするための文字 openssl_method: aes-256-ecb is OK decrypt message: テストするための文字
  7. 出力結果2/6 mcrypt_method: twofish input message: テストするための文字 openssl_method: not decrypt mcrypt_method:

    cast-256 input message: テストするための文字 openssl_method: not decrypt mcrypt_method: loki97 input message: テストするための文字 openssl_method: not decrypt
  8. 出力結果3/6 mcrypt_method: rijndael-192 input message: テストするための文字 openssl_method: not decrypt mcrypt_method:

    saferplus input message: テストするための文字 openssl_method: not decrypt mcrypt_method: blowfish-compat input message: テストするための文字 openssl_method: not decrypt
  9. 出力結果4/6 mcrypt_method: des input message: テストするための文字 openssl_method: des-ecb is OK

    decrypt message: テストするための文字 mcrypt_method: rijndael-256 input message: テストするための文字 openssl_method: not decrypt mcrypt_method: serpent input message: テストするための文字 openssl_method: not decrypt
  10. 出力結果5/6 mcrypt_method: xtea input message: テストするための文字 openssl_method: not decrypt mcrypt_method:

    blowfish input message: テストするための文字 openssl_method: bf-ecb is OK decrypt message: テストするための文字 mcrypt_method: rc2 input message: テストするための文字 openssl_method: not decrypt
  11. この騒動で得たこと ▪ 大半のシステムでMcryptを抹殺できた、一部未完です。 ▪ PHP 5.3.x から追加されたエラーレベル、E_DEPRECATEDは開発時に は、よく見るこよく見ること!ググると表示を消す方法が出てきて悲し いです。 ▪

    Mcrypt以外にも、レガシーなコードがあるのではないかと、ソースコー ドを見直す、きっかけにもなりました。 ▪ 他にも、レガシーなコードでで抹殺するのが望ましいのがあれば、抹 殺しようと思いました。