Hem » Handbok » Mcrypt – PHP

Mcrypt – PHP

PHP Mcrypt (PHP Multiple Crypto) är en inbyggd bibliotek i PHP som ger tillgång till olika kryptografiska algoritmer och funktioner, såsom symmetrisk kryptering, hashning och autentisering. Det används oftast för att skydda data som skickas över nätverket, till exempel vid inloggningar, betalningar eller andra typer av känsliga uppgifter.

Mcrypt tillhandahåller möjlighet att kryptera och dekryptera data med olika algoritmer, såsom AES, Blowfish, DES och andra. Det finns även stöd för olika krypteringslägen, som Cipher Block Chaining (CBC) och Electronic Codebook (ECB).

Sedan PHP-version 7.1 har Mcrypt varit märkt deprecated (föråldrad) och stödet togs bort helt i version 7.2. Således rekommenderas inte Mcrypt att användas i nyutveckling. Istället finns det andra alternativ som är mer säkra och moderna, såsom OpenSSL och Sodium.

Stöd för Mcrypt dåligt på webbhotell

I och med att fler och fler webbhotell övergår till nya PHP-versioner för att bibehålla en hög funktionalitet med nya tekniker, bättre säkerhet och snabbare system så fasas även stödet för Mcrypt ut.

Vissa webbhotell erbjuder dig möjligheten att välja äldre PHP-versioner för din kod där t.ex. Oderland och andra webbhotell med cPanel har ett bra stöd för detta. Dels kan du välja PHP-version men också vilka bibliotek du vill ha aktiverade där du då kan välja mcrypt.

Det finns alltså en viss möjligheten att köra Mcrypt ett tag till men så fort PHP 7.1 inte längre stöds av webbhotellen försvinner även stödet för Mcrypt helt och hållet. Eftersom PHP 7.1 slutade få nya säkerhetsuppdateringar redan i slutet av 2019 är det idag inte rekommenderat att använda mjukvara som förlitar sig på mcrypt även av den anledningen.

Så gör du om din mjukvara använder Mcrypt

Om din mjukvara använder Mcrypt så borde nyare versioner av mjukvaran uppdaterats till att använda Sodium eller OpenSSL istället. Således bör ditt primära mål vara att uppdatera din mjukvara för att lösa problemet.

Äldre mjukvara som slutat uppdateras eller som är egenutvecklad blir således mer problematisk. Ett alternativ kan såklart vara att själv ta över driften och underhållet av mjukvaran och således uppdatera till något av de rekommenderade metoderna för nyare versioner av PHP.

Fördelen med att uppdatera koden själv är att du kan köra den på webbhotell med nya versioner av PHP. Då får du snabbare och säkrare exekvering samtidigt som driften kan överlämnas till webbhotellet.

Ett sämre alternativ som i bästa scenario bör beskrivas som en nödlösning tillsvidare är att sätta upp en egen server och då förslagsvis en billigare VPS. Eftersom du själv styr över mjukvaran som installeras kan du välja äldre mjukvara i form av Apache, MySQL och PHP så du får åtkomst till Mcrypt.

Exempelkod för Mcrypt

Som exempel kan du här nedanför se PHP-kod som använder Mcrypt för att kryptera en textsträng.

<?php

// Texten som ska krypteras
$plaintext = 'Hej, världen!';

// En säker nyckel som används för att kryptera och dekryptera data
$key = 's3cr3t-k3y';

// Initialiserar mcrypt-biblioteket med en vald algoritm (AES) och läge (CBC)
$mcrypt = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_CBC, '');

// Genererar en initialiseringsvektor (IV) för att förbättra säkerheten
$iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($mcrypt), MCRYPT_RAND);

// Initialiserar krypteringen med nyckeln och IV:et
mcrypt_generic_init($mcrypt, $key, $iv);

// Krypterar texten med hjälp av mcrypt
$ciphertext = mcrypt_generic($mcrypt, $plaintext);

// Avslutar krypteringen och stänger mcrypt-biblioteket
mcrypt_generic_deinit($mcrypt);
mcrypt_module_close($mcrypt);

// Texten är nu krypterad i variabeln $chipertext och kan skickas över nätverket säkert

?>

För att dekryptera innehållet i variabeln kan vi använda oss av följande kod hos mottagaren:

<?php

// Samma nyckel krävs hos mottagaren för att kunna dekryptera innehållet
$key = 's3cr3t-k3y';

// Initialiserar mcrypt-biblioteket med samma algoritm och läge som vid krypteringen
$mcrypt = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_CBC, '');

// Genererar en initialiseringsvektor (IV) för att förbättra säkerheten
$iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($mcrypt), MCRYPT_RAND);

// Initialiserar dekrypteringen med nyckeln och IV:et
mcrypt_generic_init($mcrypt, $key, $iv);

// Dekrypterar texten med hjälp av mcrypt
$decrypted = mdecrypt_generic($mcrypt, $ciphertext);

// Avslutar dekrypteringen och stänger mcrypt-biblioteket
mcrypt_generic_deinit($mcrypt);
mcrypt_module_close($mcrypt);

// Texten är nu dekrypterad och kan läsas igen
echo $decrypted; // Skriver ut "Hej, världen!"

?>

Använd OpenSSL istället…

För att uppnå samma resultat med hjälp av biblioteket OpenSSL kan du använda dig av följande kod:

<?php

// Texten som ska krypteras
$plaintext = 'Hej, världen!';

// En säker nyckel som används för att kryptera och dekryptera data
$key = 's3cr3t-k3y';

// Genererar en initialiseringsvektor (IV) för att förbättra säkerheten
$iv_length = openssl_cipher_iv_length('aes-256-cbc');
$iv = openssl_random_pseudo_bytes($iv_length);

// Krypterar texten med hjälp av OpenSSL
$ciphertext = openssl_encrypt($plaintext, 'aes-256-cbc', $key, 0, $iv);

// Texten är nu krypterad och kan skickas över nätverket säkert

// För att dekryptera texten gör vi liknande saker:

// Dekrypterar texten med hjälp av OpenSSL
$decrypted = openssl_decrypt($ciphertext, 'aes-256-cbc', $key, 0, $iv);

// Texten är nu dekrypterad och kan läsas igen
echo $decrypted; // Skriver ut "Hej, världen!"

?>

OpenSSL är både ett säkrare och enklare sätt att kryptera text på och rekommenderas om du kör någon av de nyare versionerna av PHP.