Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Mcrypt está deprecated en PHP 7.1 #14

Closed
mendicm opened this issue Nov 15, 2016 · 16 comments
Closed

Mcrypt está deprecated en PHP 7.1 #14

mendicm opened this issue Nov 15, 2016 · 16 comments

Comments

@mendicm
Copy link

mendicm commented Nov 15, 2016

En la nueva versión de php 7.1 el módulo mcrypt pasará a estar deprecated en favor de openssl.

He probado a cambiar el código para hacer una pull request pero no he conseguido simular el mismo comportamiento. La funcion encrypt3DES me quedaba así:

private static function encrypt3DES($message, $key)
{
    $iv = implode(array_map('chr', array(0, 0, 0, 0, 0, 0, 0, 0)));
    return openssl_encrypt($message, 'des-ede3-cbc', $key, OPENSSL_RAW_DATA, $iv);
}

De esta forma la pasarela redsys da un error. A alguien se le ocurre que puede ser?

Un saludo.

@eusonlito
Copy link
Owner

eusonlito commented Nov 15, 2016

Y si pruebas con el alias de cifrado DES3 en vez de des-ede3-cbc o simplemente con des-ede3?

@dataclickes
Copy link

dataclickes commented Jan 16, 2017

Hola, yo también he tenido este problema con OpenSSL al actualizar a PHP 7.1, y he informado a RedSys para indicar cómo arreglarlo.

El motivo es que OpenSSL utiliza un padding de PKCS7, mientras las obsoletas MCrypt un padding de ZeroBytes y la cadena a codificar debe ser múltiplo de 8, por tanto para arreglar el problema se debe:

  1. Rellenar con el carácter cero la cadena a codificar hasta llegar al siguiente múltiplo de 8
  2. Devolver únicamente la longitud esperada de la cadena que será el mismo múltiplo de 8

Esta sería la nueva función:

`
function encrypt_3DES($message, $key) {

            $l = ceil(strlen($message) / 8) * 8;

            return substr(openssl_encrypt($message . str_repeat("\0", $l - strlen($message)), 'des-ede3-cbc', $key, OPENSSL_RAW_DATA, "\0\0\0\0\0\0\0\0"), 0, $l);
}

`

Saludos.
Eduardo Ruiz - Dataclick.es

@eusonlito
Copy link
Owner

Has podido probar si funciona? Por qué usas \0 para escapar los strings de cero?

Gracias!

@dataclickes
Copy link

Claro que funciona!! o no hubiera enviado la función sin haberla probado antes ;)

Para poner el carácter ASCII-0 se indica con \0 si se pone solo 0 sería el carácter ASCII-48
También se podría haber puesto chr(0) pero \0 es más corto ;)

@eusonlito
Copy link
Owner

Perfect :) en breve lo actualizo.

@eusonlito
Copy link
Owner

En el branch de develop teneis una versión igual que master pero con esta actualización.

Si lo probais y funciona lo paso a release.

Saludos!

@pablooneto
Copy link

Puedo corroborar que funciona bien este cambio. Además he cmabiado la visibilidad de la función getMerchantParameters() la he pasado de privatea publicporque necesitaba enviar los datos sin que estén dentro de un <input type="hidden" />

@eusonlito
Copy link
Owner

Perfect, he actualizado develop para que pueda funcionar con openssl y mcrypt, siendo openssl la opción por defecto en caso de estar disponible.

También he pasado a públicas algunas funciones, pero no debes cambiar manualmente el ámbito de las privadas, ya que son mucho más propensas a cambiar, y siendo privadas, el desarrollador da por supuesto que no afectará a los usuarios.

@dataclickes
Copy link

Desde hace más de 3 meses que puse el cambio a OpenSSL en mi servidor no ha habido problema en las tiendas que tengo en varias Webs a la hora de realizar el pago, y se han hecho ya cientos de pedidos, así que se puede decir que funciona perfectamente.

Inexplicablemente solo este thread parece que se ha interesado por el tema, porque ni RedSys me ha contestado (y les envié la nueva función) ni han actualizado su área de descarga para cambiar a este arreglo de mcrypt a OpenSSL... Así que se ve que somos los únicos en España con tiendas en PHP 7.1 ;) esperemos que si alguien más tiene este problema pueda llegar aquí mediante Google ;)

@eusonlito
Copy link
Owner

Ok, pues merge y close :)

Gracias a todos 🎉

@Daxtermania
Copy link

Daxtermania commented Apr 25, 2017

Hola buenas,

He estado mirando la funcion encrypt_3DES que habeis hecho y me ha ayudado bastante, ahora tengo un problema con la contraria, decrypt_3DES, podeis ayudarme? No se como traducirla D:

function decrypt_3DES($message, $key){
	$bytes = array(0,0,0,0,0,0,0,0); //byte [] IV = {0, 0, 0, 0, 0, 0, 0, 0}
	$iv = implode(array_map("chr", $bytes)); //PHP 4 >= 4.0.2
	$ciphertext = mcrypt_decrypt(MCRYPT_3DES, $key, $message, MCRYPT_MODE_CBC, $iv); //PHP 4 >= 4.0.2
	return $ciphertext;
}

Gracias por adelantado

@carmenates09
Copy link

Maybe it can help you https://stackoverflow.com/a/19748494/2153237

Jose Carlos Ramos Carmenates

@ayalga
Copy link

ayalga commented Nov 24, 2017

Al igual que vosotros he decido dar el salto a PHP7 a un ecommerce con pago mediante la api de Redsys, he realizado el cambio que habéis comentado dejando de usar la función mcrypt_encrypt y usando la función openssl_encrypt. En PHP 5.6 funciona perfectamente con el cambio.

Pero al actualizar a PHP 7.0 o 7.1, realizo el proceso de pago, aparentemente todo correcto, inserto datos de tarjeta correctos, el código de seguridad y luego se produce el fallo con la comunicación SOAP y el TPVV muestra el siguiente fallo:

No se puede realizar la operación
La comunicación con el comercio no es posible en estos momentos. Por favor, inténtelo más tarde

El error que muestra Redsys en su TPV Virtual es “9998 Sin finalizar”. He revisado los logs del servidor y no encuentro ningún error.

Desde Redsys no ayudan mucho y se limitan a comentar que tienen en proceso la actualización pero sin fechas.
¿Podríais ayudarme o darme alguna pista por donde tirar?
Muchas gracias!!

@eusonlito
Copy link
Owner

Pero es con el uso de la librería, o es código propio?

@ayalga
Copy link

ayalga commented Nov 24, 2017

Es con el uso de la librería de redsys para PHP:
http://www.redsys.es/?MOD=AJPERES

@emilioj
Copy link

emilioj commented Sep 15, 2020

Así que se ve que somos los únicos en España con tiendas en PHP 7.1 ;) esperemos que si alguien más tiene este problema pueda llegar aquí mediante Google ;)

Pues hoy me ha tocado actualizar una máquina virtual de Debian Stretch a Debian Buster y PHP 7.2 llegó para romper la pasarela de pago. Gracias mil por compartir tu solución!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

8 participants