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
350
忘れた頃に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
執筆テーマの決め方
sapi_kawahara
1
180
LTの禁じ手
sapi_kawahara
1
810
||とorの違いは登壇して解決した
sapi_kawahara
0
270
Macintosh talk / Macintoshの話
sapi_kawahara
0
130
混合接種してみた / Mixed inoculation
sapi_kawahara
0
87
安くて美味い日本酒 / Great wholesale market
sapi_kawahara
0
290
オフラインもし逢えたなら素敵だね / It would be nice to meet you offline.
sapi_kawahara
0
320
カジュアル面談本の裏側を語る / Casual Information Book Inside story
sapi_kawahara
0
320
推し技術の紹介 / Introduction of pushing technology
sapi_kawahara
0
130
Other Decks in Programming
See All in Programming
Hanami and htmx
bkuhlmann
0
210
1BRC--Nerd Sniping the Java Community
gunnarmorling
0
340
今、知っておきたい! 生成AIエージェントの世界
elith
3
350
ONE WEDGE_company_guide
1wedge_one
0
470
AWS CDKコントリビュートTIPS / aws-cdk-contribution-tips
gotok365
2
120
VSCodeでのDatabricks開発もお勧めしたい/I would also recommend Databricks development with VSCode.
kazumain
0
250
ゆるい個人開発のススメ
kuroppe1819
10
990
スクラムガイドのスプリントレトロスペクティブを改めて読みかえしてみた / Re-reading the Sprint Retrospective Section in the Scrum Guide
mackey0225
3
410
코틀린으로 멀티플랫폼 만들기
pangmoo
0
150
GitHub Actionsで泣かないためにやっておきたい設定 / Recommended GHA settings to avoid crying
pinkumohikan
3
530
Tailwind CSSを本気でカスタマイズする方法
fsubal
13
5.2k
デフォルトにして至高、RubyMineの大好きな所
ruzia
0
310
Featured
See All Featured
Dealing with People You Can't Stand - Big Design 2015
cassininazir
357
22k
Agile that works and the tools we love
rasmusluckow
325
20k
The Invisible Customer
myddelton
114
12k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
241
1.2M
Fashionably flexible responsive web design (full day workshop)
malarkey
398
65k
GitHub's CSS Performance
jonrohan
1025
450k
A Tale of Four Properties
chriscoyier
151
22k
Code Reviewing Like a Champion
maltzj
514
39k
Ruby is Unlike a Banana
tanoku
96
10k
KATA
mclloyd
15
12k
What’s in a name? Adding method to the madness
productmarketing
PRO
16
2.6k
How To Stay Up To Date on Web Technology
chriscoyier
782
250k
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については、うまく行かなかった理由を検証をしてないで す。 • もう少し、突っ込んで検証しておきたいのですが、それは宿題にさせ てください。