In 2017 komt PHP 7.2 uit en met deze nieuwe versie verdwijnt de verouderde en onveilige PHP-Mcrypt module definitief. Mcrypt wordt al enige tijd afgeraden omdat het niet meer veilig en betrouwbaar is. Toch blijkt uit enkele steekproeven dat sommige applicaties nog steeds gebruik maken van deze functies. In deze blog leggen we uit waarom je Mcrypt echt niet meer wilt gebruiken en wat de alternatieven zijn.
Wat is Mcrypt?
Mcrypt is een PHP-extensie die versleuteling van informatie mogelijk maakt. Het stelt je in staat om data veilig te verzenden. Maar Mcrypt heeft veel bugs en veiligheidsrisico's, waardoor het niet langer een betrouwbare optie is. De ontwikkeling van de libmcrypt-bibliotheek, waarop de PHP-module draait, is al sinds 2008 gestopt. Dit betekent dat bekende problemen en kwetsbaarheden niet worden opgelost. De onbetrouwbare random generator maakt het nog riskanter om Mcrypt te blijven gebruiken.
Waarom geen Mcrypt gebruiken?
Er zijn enkele belangrijke redenen om geen gebruik te maken van Mcrypt:
- Onveilige cryptografische functies: Het is eenvoudig om onveilige functies te gebruiken, wat de beveiliging van je applicatie in gevaar brengt.
- Verouderde software: De libmcrypt-bibliotheek is al sinds 2008 niet meer in ontwikkeling. Bugs en veiligheidsproblemen blijven dus onopgelost.
- Onbetrouwbare encryptie: De random generator is niet betrouwbaar genoeg voor veilige versleuteling.
Wat zijn de alternatieven voor Mcrypt?
Gelukkig zijn er veiligere alternatieven beschikbaar voor cryptografische functies in PHP:
- libsodium: Dit is de meest efficiënte en veilige methode voor versleuteling. Vanaf PHP 7.2 wordt libsodium standaard meegeleverd. Maak je gebruik van PHP 7.0 of nieuwer? Dan kun je bij ons al gebruik maken van de Libsodium PECL-extensie.
- Defuse PHP-Encryption: Deze wrapper voor OpenSSL maakt het moeilijk om onveilige PHP-functies te gebruiken. Als je Composer gebruikt, kun je deze zelf installeren met: composer require defuse/php-encryption.Op onze servers is deze bibliotheek standaard beschikbaar en kun je hem aanroepen met: require_once('defuse-crypto');.
- OpenSSL: Als je geen gebruik kunt maken van de bovenstaande opties, kun je terugvallen op de OpenSSL-functies die standaard in PHP aanwezig zijn.
De planning van Mcrypt
Vanaf PHP 7 is Mcrypt al "deprecated," wat betekent dat er bij het gebruik van deze functie een waarschuwing wordt gegenereerd in de error logs. Vanaf PHP 7.2 is Mcrypt volledig verwijderd, en als je toch probeert de functies aan te roepen, krijg je een fatale foutmelding: Fatal error: Call to undefined function mcrypt_*.
Wat moet je nu doen?
Applicaties zoals WordPress, Joomla en Magento gebruiken in de recente versies geen Mcrypt-functies meer. Je hoeft in die gevallen dus niets te veranderen. Maar als je zelf een andere PHP-applicatie hebt, raden we aan om je code te controleren. Let op de volgende functies:
mcrypt_cfb.
mcrypt_cbc.
mcrypt_create_iv.
mcrypt_decrypt.
mcrypt_ecb.
mcrypt_enc_get_algorithms_name.
mcrypt_enc_get_block_size.
mcrypt_enc_get_iv_size.
mcrypt_enc_get_key_size.
mcrypt_enc_get_modes_name.
mcrypt_enc_get_supported_key_sizes.
mcrypt_enc_is_block_algorithm_mode.
mcrypt_enc_is_block_algorithm.
mcrypt_enc_is_block_mode.
mcrypt_enc_self_test.
mcrypt_encrypt.
mcrypt_generic_deinit.
mcrypt_generic_end.
mcrypt_generic_init.
mcrypt_generic.
mcrypt_get_block_size.
mcrypt_get_cipher_name.
mcrypt_get_iv_size.
mcrypt_get_key_size.
mcrypt_list_algorithms.
mcrypt_list_modes.
mcrypt_module_close.
mcrypt_module_get_algo_block_size.
mcrypt_module_get_algo_key_size.
mcrypt_module_get_supported_key_sizes.
mcrypt_module_is_block_algorithm_mode.
mcrypt_module_is_block_algorithm.
mcrypt_module_is_block_mode.
mcrypt_module_openmcrypt_module_self_test.
mcrypt_ofb.
mdecrypt_generic.
Met de volgende shell-opdracht kun je snel code vinden die gebruik maakt van Mcrypt-functionaliteit:
lh_mcrypt_functions=(“mcrypt_encrypt” \
“mcrypt_create_iv” \
“mcrypt_cfb” \
“mcrypt_cbc” \
“mcrypt_create_iv” \
“mcrypt_decrypt” \
“mcrypt_ecb” \
“mcrypt_enc_get_algorithms_name” \
“mcrypt_enc_get_block_size” \
“mcrypt_enc_get_iv_size” \
“mcrypt_enc_get_key_size” \
“mcrypt_enc_get_modes_name” \
“mcrypt_enc_get_supported_key_sizes” \
“mcrypt_enc_is_block_algorithm_mode” \
“mcrypt_enc_is_block_algorithm” \
“mcrypt_enc_is_block_mode” \
“mcrypt_enc_self_test” \
“mcrypt_encrypt” \
“mcrypt_generic_deinit” \
“mcrypt_generic_end” \
“mcrypt_generic_init” \
“mcrypt_generic” \
“mcrypt_get_block_size” \
“mcrypt_get_cipher_name” \
“mcrypt_get_iv_size” \
“mcrypt_get_key_size” \
“mcrypt_list_algorithms” \
“mcrypt_list_modes” \
“mcrypt_module_close” \
“mcrypt_module_get_algo_block_size” \
“mcrypt_module_get_algo_key_size” \
“mcrypt_module_get_supported_key_sizes” \
“mcrypt_module_is_block_algorithm_mode” \
“mcrypt_module_is_block_algorithm” \
“mcrypt_module_is_block_mode” \
“mcrypt_module_openmcrypt_module_self_test” \
“mcrypt_ofb” \
“mdecrypt_generic” \
)
find_lh_mcrypt_functions=$(echo ${lh_mcrypt_functions[@]}|tr ” ” “|”)
grep -Ern –include “*.php” “$find_lh_mcrypt_functions” .