Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
忘れた頃にMcryptは廃止される
Search
sapi_kawahara
March 10, 2018
Programming
0
390
忘れた頃にMcryptは廃止される
PHPerKaigi 2018 LT発表資料です。
https://phperkaigi.jp/2018/
sapi_kawahara
March 10, 2018
Tweet
Share
More Decks by sapi_kawahara
See All by sapi_kawahara
コマンドラインを見直そう(1995年からタイムリープ)
sapi_kawahara
0
710
今から始める8bits CPU アセンブラ言語
sapi_kawahara
0
1.3k
執筆テーマの決め方
sapi_kawahara
1
410
LTの禁じ手
sapi_kawahara
1
1.3k
||とorの違いは登壇して解決した
sapi_kawahara
0
390
Macintosh talk / Macintoshの話
sapi_kawahara
0
240
混合接種してみた / Mixed inoculation
sapi_kawahara
0
180
安くて美味い日本酒 / Great wholesale market
sapi_kawahara
0
440
オフラインもし逢えたなら素敵だね / It would be nice to meet you offline.
sapi_kawahara
0
490
Other Decks in Programming
See All in Programming
コードレビューをしない選択 #でぃーぷらすトウキョウ
kajitack
3
1.2k
「効かない!」依存性注入(DI)を活用したAPI Platformのエラーハンドリング奮闘記
mkmk884
0
270
AIと共にエンジニアとPMの “二刀流”を実現する
naruogram
0
100
Symfony + NelmioApiDocBundle を使った スキーマ駆動開発 / Schema Driven Development with NelmioApiDocBundle
okashoi
0
250
AI活用のコスパを最大化する方法
ochtum
0
350
Xdebug と IDE による デバッグ実行の仕組みを見る / Exploring-How-Debugging-Works-with-Xdebug-and-an-IDE
shin1x1
0
260
今からFlash開発できるわけないじゃん、ムリムリ! (※ムリじゃなかった!?)
arkw
0
170
Rethinking API Platform Filters
vinceamstoutz
0
3.3k
Fundamentals of Software Engineering In the Age of AI
therealdanvega
2
300
我々はなぜ「層」を分けるのか〜「関心の分離」と「抽象化」で手に入れる変更に強いシンプルな設計〜 #phperkaigi / PHPerKaigi 2026
shogogg
2
700
今こそ押さえておきたい アマゾンウェブサービス(AWS)の データベースの基礎 おもクラ #6版
satoshi256kbyte
1
210
L’IA au service des devs : Anatomie d'un assistant de Code Review
toham
0
120
Featured
See All Featured
Bridging the Design Gap: How Collaborative Modelling removes blockers to flow between stakeholders and teams @FastFlow conf
baasie
0
500
エンジニアに許された特別な時間の終わり
watany
106
240k
AI Search: Implications for SEO and How to Move Forward - #ShenzhenSEOConference
aleyda
1
1.2k
SEO for Brand Visibility & Recognition
aleyda
0
4.4k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
27k
Discover your Explorer Soul
emna__ayadi
2
1.1k
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
659
61k
State of Search Keynote: SEO is Dead Long Live SEO
ryanjones
0
160
Paper Plane (Part 1)
katiecoart
PRO
0
6.1k
A Tale of Four Properties
chriscoyier
163
24k
GitHub's CSS Performance
jonrohan
1032
470k
The AI Search Optimization Roadmap by Aleyda Solis
aleyda
1
5.5k
Transcript
忘れた頃にMcryptは廃止さ れる さっぴー川原 Facebook:kawahara.hideaki.0204 Twitter:@sapi_kawahara
自己紹介 ▪ 川原 英明(老眼進行中の49歳、PhpStormをナイトモードじゃないツ ライです) ▪ COEDOのふるさと川越に住んでます。 ▪ 元ゲームエンジニアです。(ファミコン時代から開発してました、この当 時のネタも語れます)
▪ スキルは、今はやってないアセンブラからC言語に始まって、今はPerl、 PHP、Java、Pythonです、基本的にはなんでもやります! ▪ 今は、どこかの契約社員で、業務委託的なことをしてますが、今日は、 そこのシステムじゃないです。
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.
いいでしょう!Mcryptを抹殺しましょう! ▪ 更によく読むと、Mcryptのドキュメントには「十年近くにわたって放置されて おり」とあります。 ▪ 自分は、これを良い機会だと思いました、PECLで使うのは単なる延命だ! ▪ Mcryptに関するレガシーなコードを抹殺するのが良いのでは? ▪ 推奨しているOpenSSLに行こうじゃないですか?!
▪ 参考:http://php.net/manual/ja/migration71.deprecated.php ▪ mcrypt 拡張モジュールは十年近くにわたって放置されており、極めて使いづらいもので す。 そこで、この拡張モジュールを非推奨にしました。かわりに OpenSSL を使いましょ う。 mcryptは PHP 7.2 でコアから削除されて、PECL に移る予定です。
この先生きのこるには? ▪ Mcryptを抹殺するために、選択肢はどれになりますか? 1. PECLに頼る。 2. データを初期化して、OpenSSLに行く。 3. データを初期化せずに、OpenSSLに行く。
せっかくだから 俺はこの 赤の扉を選ぶぜ!
せっかくだから 俺はこの 「データを初期化せずに、 OpenSSLに行く」 を選ぶぜ!
簡単な、ecbモードで確認する ▪ 簡単に確認したいので、ecbモードで確認する。 ▪ ソースコードは、quitaに置いてます。 ▪ https://qiita.com/hideaki0204/items/bbfbc57fd12ff348f216
ソースコード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;
ソースコード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); }
出力結果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: テストするための文字
出力結果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
出力結果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
出力結果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
出力結果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
出力結果6/6 mcrypt_method: tripledes input message: テストするための文字 openssl_method: not decrypt
結果 ▪ 4つ、移行出来ることが判明! ▪ 自分の担当では、desとblowfishを使っていたので、OpenSSLに移行で きるのは嬉しい! ▪ Mcryptの抹殺が進められる! ▪ ただ、rijndael-192がダメだったのは残念でした。
mcrypt_method openssl_method cast-128 cast5 rijndael-128 aes-256 des des blowfish bf
実は、まだ抹殺できてません ▪ rijndael-192を使っているのは、残念ながらPHP 5で生きてます。 ▪ それ以外は、無事にPHP 7.2.0 で、OpenSSLに移行しました。 ▪ 残る手は、McryptのデータをOpenSSLにコンバートする手ですが、ま
だ決断には至っていません。
この騒動で得たこと ▪ 大半のシステムでMcryptを抹殺できた、一部未完です。 ▪ PHP 5.3.x から追加されたエラーレベル、E_DEPRECATEDは開発時に は、よく見るこよく見ること!ググると表示を消す方法が出てきて悲し いです。 ▪
Mcrypt以外にも、レガシーなコードがあるのではないかと、ソースコー ドを見直す、きっかけにもなりました。 ▪ 他にも、レガシーなコードでで抹殺するのが望ましいのがあれば、抹 殺しようと思いました。
LT後の補足 • rijndael-192については、うまく行かなかった理由を検証をしてないで す。 • もう少し、突っ込んで検証しておきたいのですが、それは宿題にさせ てください。