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
390
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
忘れた頃にMcryptは廃止される
PHPerKaigi 2018 LT発表資料です。
https://phperkaigi.jp/2018/
sapi_kawahara
March 10, 2018
More Decks by sapi_kawahara
See All by sapi_kawahara
EzSignという 電子ペーパー
sapi_kawahara
2
75
Gitがない時代 インターネットがない時代の 開発話
sapi_kawahara
0
330
プログラミング言語において文字列を複数行にわたって だらだらと記載するアレ
sapi_kawahara
0
180
コマンドラインを見直そう(1995年からタイムリープ)
sapi_kawahara
0
750
今から始める8bits CPU アセンブラ言語
sapi_kawahara
0
1.7k
執筆テーマの決め方
sapi_kawahara
2
440
LTの禁じ手
sapi_kawahara
2
1.3k
||とorの違いは登壇して解決した
sapi_kawahara
0
410
Macintosh talk / Macintoshの話
sapi_kawahara
0
260
Other Decks in Programming
See All in Programming
Apache Hive: Toward a Cloud Native Lakehouse
okumin
0
160
AI がコードを書く時代における新卒エンジニアの仕事風景 (2026) / New Graduate Engineers in the Era of AI Coding (2026)
sushichan044
0
240
【SRE NEXT 2026 Lunch Session】一人目専任SREの立ち上げを加速する ― AIと進めたオンボーディングで2分を0.04秒にした話
pkshadeck
PRO
0
3.2k
『コードを書く以外の』エンジニアリング〜課金基盤移行プロジェクト推進のためのTips4選
yuriko1211
0
550
コーディングルールの鮮度を保ちたい for SRE NEXT 2026 / keep-fresh-go-internal-conventions-sre-next-2026
handlename
0
150
Apache Hive: そしてCloud Native Lakehouseへ
okumin
1
180
Go言語とトイモデルで学ぶTransformerの気持ち / fukuokago23-transformer
monochromegane
0
150
Welcome to the "Parametricity" 🏙️ − Generic だけど Specific な世界 −
guvalif
PRO
1
190
Build-to-own AI: Agentic Development for Humans
inesmontani
PRO
0
110
【やさしく解説 設計編・中級 #6】良いアーキテクチャとは ~ 一本の登り道の、行き先 ~
panda728
PRO
0
190
ITヒヤリハットを整理してみた ~ライフサイクルと原因から考える再発防止策~
koukimiura
1
120
20260722_microCMSで考える、AI時代のコンテンツ運用設計
yosh1
0
140
Featured
See All Featured
Rebuilding a faster, lazier Slack
samanthasiow
85
9.6k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
52
6k
Designing for Performance
lara
611
70k
The SEO Collaboration Effect
kristinabergwall1
1
510
How to Build an AI Search Optimization Roadmap - Criteria and Steps to Take #SEOIRL
aleyda
1
2.1k
Discover your Explorer Soul
emna__ayadi
2
1.2k
Ethics towards AI in product and experience design
skipperchong
2
330
Prompt Engineering for Job Search
mfonobong
0
380
Context Engineering - Making Every Token Count
addyosmani
9
1k
Introduction to Domain-Driven Design and Collaborative software design
baasie
1
910
Fantastic passwords and where to find them - at NoRuKo
philnash
52
3.8k
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
31
10k
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については、うまく行かなかった理由を検証をしてないで す。 • もう少し、突っ込んで検証しておきたいのですが、それは宿題にさせ てください。