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 · 15 comments

Comments

Projects
None yet
7 participants
@mendicm

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

This comment has been minimized.

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

This comment has been minimized.

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

This comment has been minimized.

Owner

eusonlito commented Jan 16, 2017

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

Gracias!

@dataclickes

This comment has been minimized.

dataclickes commented Jan 16, 2017

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

This comment has been minimized.

Owner

eusonlito commented Jan 16, 2017

Perfect :) en breve lo actualizo.

@eusonlito

This comment has been minimized.

Owner

eusonlito commented Feb 6, 2017

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

This comment has been minimized.

pablooneto commented Apr 18, 2017

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

This comment has been minimized.

Owner

eusonlito commented Apr 18, 2017

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

This comment has been minimized.

dataclickes commented Apr 18, 2017

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

This comment has been minimized.

Owner

eusonlito commented Apr 18, 2017

Ok, pues merge y close :)

Gracias a todos 🎉

@eusonlito eusonlito closed this Apr 18, 2017

@Daxtermania

This comment has been minimized.

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

This comment has been minimized.

carmenates09 commented Aug 4, 2017

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

Jose Carlos Ramos Carmenates

tekaaa referenced this issue in tekaaa/sermepa Oct 16, 2017

@ayalga

This comment has been minimized.

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

This comment has been minimized.

Owner

eusonlito commented Nov 24, 2017

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

@ayalga

This comment has been minimized.

ayalga commented Nov 24, 2017

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment