7

おそらくご存じのとおり、拡張子 mcrypt は php 7.1 で非推奨になります。

最終的にこのバージョンに移行したい「レガシー」アプリケーションを維持するために使用していたので、テストを実行し、次のコードを使用するコードがあるため、100% のカバレッジを取得できないことを確認しました。

$key = 'sA*(DH';

// initialization vector
$iv = md5(md5($key));
$output = base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, md5($key), $string,     MCRYPT_MODE_CBC, $iv));

このコードを使用して、このコードを openssl_encrypt に移植しようとしました

$key = md5('sA*(DH');
$iv = md5($key);
echo base64_encode(openssl_encrypt($data, "aes-256-cbc", $key, OPENSSL_RAW_DATA, $iv));

しかし、これには2つの問題があります:

  1. IV の長さは 16 文字にする必要があるため (md5 では 32 文字になります)、PHP の警告が表示されます。
  2. 出力は同じではありません(16文字に切り捨てても)

誰もが同様の問題を抱えていました(またはそれを修正する方法を知っていますか?)

ところで: 私は PHP の dev master バージョンを使用しています (7.1.0 alpha 3 であると思われます)。

4

3 に答える 3

3

Mcrypt 関数を openssl_encrypt() および openssl_decrypt() に置き換えるために、ANSI テキストを受け取って返すさらに別のテスト済みソリューション:

//Return encrypted string
public function stringEncrypt ($plainText, $cryptKey = '7R7zX2Urc7qvjhkr') {

  $cipher   = 'aes-128-cbc';

  if (in_array($cipher, openssl_get_cipher_methods()))
  {
    $ivlen = openssl_cipher_iv_length($cipher);
    $iv = openssl_random_pseudo_bytes($ivlen);
    $ciphertext_raw = openssl_encrypt(
      $plainText, $cipher, $cryptKey, $options=OPENSSL_RAW_DATA, $iv);
    $hmac = hash_hmac('sha256', $ciphertext_raw, $cryptKey, $as_binary=true);
    $encodedText = base64_encode( $iv.$hmac.$ciphertext_raw );
  }

  return $encodedText;
}


//Return decrypted string
public function stringDecrypt ($encodedText, $cryptKey = '7R7zX2Urc7qvjhkr') {

  $c = base64_decode($encodedText);
  $cipher   = 'aes-128-cbc';

  if (in_array($cipher, openssl_get_cipher_methods()))
  {
    $ivlen = openssl_cipher_iv_length($cipher);
    $iv = substr($c, 0, $ivlen);
    $hmac = substr($c, $ivlen, $sha2len=32);
    $ivlenSha2len = $ivlen+$sha2len;
    $ciphertext_raw = substr($c, $ivlen+$sha2len);
    $plainText = openssl_decrypt(
      $ciphertext_raw, $cipher, $cryptKey, $options=OPENSSL_RAW_DATA, $iv);
  }

  return $plainText;
}

詳しくはopensslのドキュメントを読んでください

于 2019-02-14T19:14:37.590 に答える
1

何にでも md5 を使用する習慣をやめるべきです。

$iv = openssl_random_pseudo_bytes(16);
$key = substr(hash('sha256', 'sA*(DH'), 0, 32)

mcrypt_encryptopenssl_encrypt同じ平文と鍵が与えられた場合、同じ暗号文は出力されません。

また、 PHP 7.1 では非推奨であり、削除されていません。したがって、変更せmcryptずに 7.1 に更新できます。ただし、一般的には削除することをお勧めします。mcryptopensslmcrypt

于 2016-11-28T19:17:22.690 に答える