mcrypt is deprecated, what is the alternative?

前端 未结 10 2320
青春惊慌失措
青春惊慌失措 2020-11-22 08:05

The mcrypt-extension is deprecated will be removed in PHP 7.2 according to the comment posted here. So I am looking for an alternative way to encrypt passwords.

Righ

相关标签:
10条回答
  • 2020-11-22 08:32

    I was able to translate my Crypto object

    • Get a copy of php with mcrypt to decrypt the old data. I went to http://php.net/get/php-7.1.12.tar.gz/from/a/mirror, compiled it, then added the ext/mcrypt extension (configure;make;make install). I think I had to add the extenstion=mcrypt.so line to the php.ini as well. A series of scripts to build intermediate versions of the data with all data unencrypted.

    • Build a public and private key for openssl

      openssl genrsa -des3 -out pkey.pem 2048
      (set a password)
      openssl rsa -in pkey.pem -out pkey-pub.pem -outform PEM -pubout
      
    • To Encrypt (using public key) use openssl_seal. From what I've read, openssl_encrypt using an RSA key is limited to 11 bytes less than the key length (See http://php.net/manual/en/function.openssl-public-encrypt.php comment by Thomas Horsten)

      $pubKey = openssl_get_publickey(file_get_contents('./pkey-pub.pem'));
      openssl_seal($pwd, $sealed, $ekeys, [ $pubKey ]);
      $encryptedPassword = base64_encode($sealed);
      $key = base64_encode($ekeys[0]);
      

    You could probably store the raw binary.

    • To Decrypt (using private key)

      $passphrase="passphrase here";
      $privKey = openssl_get_privatekey(file_get_contents('./pkey.pem'), $passphrase);
      // I base64_decode() from my db columns
      openssl_open($encryptedPassword, $plain, $key, $privKey);
      echo "<h3>Password=$plain</h3>";
      

    P.S. You can't encrypt the empty string ("")

    P.P.S. This is for a password database not for user validation.

    0 讨论(0)
  • 2020-11-22 08:34

    As detailed by other answers here, the best solution I found is using OpenSSL. It is built into PHP and you don't need any external library. Here are simple examples:

    To encrypt:

    function encrypt($key, $payload) {
      $iv = openssl_random_pseudo_bytes(openssl_cipher_iv_length('aes-256-cbc'));
      $encrypted = openssl_encrypt($payload, 'aes-256-cbc', $key, 0, $iv);
      return base64_encode($encrypted . '::' . $iv);
    }
    

    To decrypt:

    function decrypt($key, $garble) {
        list($encrypted_data, $iv) = explode('::', base64_decode($garble), 2);
        return openssl_decrypt($encrypted_data, 'aes-256-cbc', $key, 0, $iv);
    }
    

    Reference link: https://www.shift8web.ca/2017/04/how-to-encrypt-and-execute-your-php-code-with-mcrypt/

    0 讨论(0)
  • 2020-11-22 08:37

    You can use phpseclib pollyfill package. You can not use open ssl or libsodium for encrypt/decrypt with rijndael 256. Another issue, you don't need replacement any code.

    0 讨论(0)
  • 2020-11-22 08:37

    As pointed out, you should not be storing your users' passwords in a format that is decryptable. Reversable encryption provides an easy route for hackers to find out your users' passwords, which extends to putting your users' accounts at other sites at risk should they use the same password there.

    PHP provides a pair of powerful functions for random-salted, one-way hash encryption — password_hash() and password_verify(). Because the hash is automatically random-salted, there is no way for hackers to utilize precompiled tables of password hashes to reverse-engineer the password. Set the PASSWORD_DEFAULT option and future versions of PHP will automatically use stronger algorithms to generate password hashes without you having to update your code.

    0 讨论(0)
  • 2020-11-22 08:41

    Pure-PHP implementation of Rijndael exists with phpseclib available as composer package and works on PHP 7.3 (tested by me).

    There's a page on the phpseclib docs, which generates sample code after you input the basic variables (cipher, mode, key size, bit size). It outputs the following for Rijndael, ECB, 256, 256:

    a code with mycrypt

    $decoded = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, ENCRYPT_KEY, $term, MCRYPT_MODE_ECB);
    

    works like this with the library

    $rijndael = new \phpseclib\Crypt\Rijndael(\phpseclib\Crypt\Rijndael::MODE_ECB);
    $rijndael->setKey(ENCRYPT_KEY);
    $rijndael->setKeyLength(256);
    $rijndael->disablePadding();
    $rijndael->setBlockLength(256);
    
    $decoded = $rijndael->decrypt($term);
    

    * $term was base64_decoded

    0 讨论(0)
  • 2020-11-22 08:42

    You should use openssl_encrypt() function.

    0 讨论(0)
提交回复
热议问题