PHP 7.2 での Mcrypt の削除の準備



openssl php-7.1 (1)

したがって、mcryptの時間の経過はPHP 7.2で進むでしょう。 もちろん、代替手段があります:openssl。

AES 256 CBCを使用してIVを保存し、mcryptからopensslに切り替えるのは難しいと思います。 私は暗号学に慣れていないので、本当にすべてを知っているわけではありませんが、基本は理解しています。

私は次のコードを持っているとしましょう

function encrypt($masterPassword, $data) 
{
    $keySize = mcrypt_get_key_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_CBC);
    $ivSize = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_CBC);
    $iv = mcrypt_create_iv($ivSize, MCRYPT_DEV_URANDOM);
    $key = mb_substr(hash('SHA256', $masterPassword), 0, $keySize);
    $encrypted = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $key, $data, MCRYPT_MODE_CBC, $iv);
    return base64_encode($iv . $encrypted);
}

function decrypt($masterPassword, $base64) 
{
    $keySize = mcrypt_get_key_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_CBC);
    $ivSize = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_CBC);
    $key = mb_substr(hash('SHA256', $masterPassword), 0, $keySize);
    $data = base64_decode($base64);
    $iv = substr($data, 0, $ivSize);
    $encrypted = substr($data, $ivSize, strlen($data));
    $decrypted = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $key, $encrypted, MCRYPT_MODE_CBC, $iv);
    return trim($decrypted);
}

このコードを「変換」してmcryptを使用したopensslを使用するにはどうすればよいですか?


Rijndael-256はAES-256ではなく、OpenSSL拡張機能にはRijndael-256サポートが付属していないため、変換できません。
AES-256は、256ビット(32バイト)キーのRijndael-128です。

残念ながら、すべてのデータを再暗号化する必要があります。

編集:また、現在使用しているスキームにはいくつかの問題があります。

  • 認証がありません(PHPでHMACを使用するのが最も簡単な方法です)
  • ブロックモードの暗号化を安全に行うために必要な適切なパディング(mcryptは0バイトのパディング。代わりにPKCS#5パディングなどが必要です)がありません。
  • バイトセーフではありません( mb_substr() を使用しています)

幸いなことに、OpenSSLはPKCS#5のパディングを自動的に行いますが、さらに進んで defuse/php-encryption ような強固な暗号化ライブラリを使用する必要があります。





php-7.1