Foros del Web » Programando para Internet » PHP »

Funcion dentro de otra

Estas en el tema de Funcion dentro de otra en el foro de PHP en Foros del Web. Hola gente, estoy trabajando con Laravel readaptando un sistema viejo que por varios motivos no puedo modificar la base de datos, principalmente porque el sistema ...
  #1 (permalink)  
Antiguo 13/02/2019, 06:24
 
Fecha de Ingreso: julio-2009
Mensajes: 121
Antigüedad: 14 años, 7 meses
Puntos: 1
Funcion dentro de otra

Hola gente, estoy trabajando con Laravel readaptando un sistema viejo que por varios motivos no puedo modificar la base de datos, principalmente porque el sistema viejo va a seguir usandose y no hay codigo fuente del mismo como para modificarlo.

El registro me guarda la contraseña en bcrypt (yo ya adapte el hash que necesito y reemplacé la funcion de momento para probar... hasta aca todo bien)

El problema es que en el SQLSrv tengo que guardar la contraseña en binary.

Código:
SQLSTATE[42000]: [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]No se permite la conversión implícita del tipo de datos nvarchar a binary. Utilice la función CONVERT para ejecutar esta consulta. (SQL: insert into [user_auth] ([name], [email], [password], [updated_at], [created_at]) values (Nombre, [email protected], 0xb13f7b1e2fc16d380d94b2b27fe5c3c3, 2019-02-13 12:37:58.817, 2019-02-13 12:37:58.817))
La contraseña me la guarda correctamente como la necesito, peeero necesito que esa misma la almacene en binary

Yo tengo esta parte del codigo
Código PHP:
return User::create([
            
'name' => $data['name'],
            
'email' => $data['email'],
            
'password' => bcrypt($data['password']),
        ]); 
Que me convierte la contraseña a como la necesito, pero necesitaria que eso lo pase a binary antes y no encuentro la solucion

Acá dejo el metodo de encriptación:

Código:
function bcrypt($str, $options = []){
        //return app('hash')->make($value, $options);

        $key = array();
        $dst = array();
        $i = 0;

        $nBytes = strlen($str);
        while ($i < $nBytes){
            $i++;
            $key[$i] = ord(substr($str, $i - 1, 1)); 
            $dst[$i] = $key[$i];
        } 

        while ($i < 16){ 
            $i++;
            $key[$i] = 0;
            $dst[$i] = $key[$i];
        } 

        $rslt = $key[1] + $key[2]*256 + $key[3]*65536 + $key[4]*16777216;
        $one = $rslt * 213119 + 2529077;
        $one = $one - intval($one/ 4294967296) * 4294967296;

        $rslt = $key[5] + $key[6]*256 + $key[7]*65536 + $key[8]*16777216;
        $two = $rslt * 213247 + 2529089;
        $two = $two - intval($two/ 4294967296) * 4294967296;

        $rslt = $key[9] + $key[10]*256 + $key[11]*65536 + $key[12]*16777216;
        $three = $rslt * 213203 + 2529589;
        $three = $three - intval($three/ 4294967296) * 4294967296;

        $rslt = $key[13] + $key[14]*256 + $key[15]*65536 + $key[16]*16777216;
        $four = $rslt * 213821 + 2529997;
        $four = $four - intval($four/ 4294967296) * 4294967296;

        $key[4] = intval($one/16777216); 
        $key[3] = intval(($one - $key[4] * 16777216) / 65535);
        $key[2] = intval(($one - $key[4] * 16777216 - $key[3] * 65536) / 256);
        $key[1] = intval(($one - $key[4] * 16777216 - $key[3] * 65536 - $key[2] * 256));

        $key[8] = intval($two/16777216); 
        $key[7] = intval(($two - $key[8] * 16777216) / 65535);
        $key[6] = intval(($two - $key[8] * 16777216 - $key[7] * 65536) / 256);
        $key[5] = intval(($two - $key[8] * 16777216 - $key[7] * 65536 - $key[6] * 256));

        $key[12] = intval($three/16777216); 
        $key[11] = intval(($three - $key[12] * 16777216) / 65535);
        $key[10] = intval(($three - $key[12] * 16777216 - $key[11] * 65536) / 256);
        $key[9] = intval(($three - $key[12] * 16777216 - $key[11] * 65536 - $key[10] * 256));

        $key[16] = intval($four/16777216); 
        $key[15] = intval(($four - $key[16] * 16777216) / 65535);
        $key[14] = intval(($four - $key[16] * 16777216 - $key[15] * 65536) / 256);
        $key[13] = intval(($four - $key[16] * 16777216 - $key[15] * 65536 - $key[14] * 256));

        $dst[1] = $dst[1] ^ $key[1];

        $i=1;
        while ($i<16){
            $i++;
            $dst[$i] = $dst[$i] ^ $dst[$i-1] ^ $key[$i];
        }

        $i=0;
        while ($i<16){
            $i++;
            if ($dst[$i] == 0) $dst[$i] = 102;
        }

        $encrypt = "0x";
        $i=0;
        while ($i<16){
            $i++;
            if ($dst[$i] < 16) {
                $encrypt = $encrypt . "0" . dechex($dst[$i]);
            } else {
                $encrypt = $encrypt . dechex($dst[$i]);
            }
        }
        return $encrypt;
    }
}

Última edición por sk0rpi0n; 13/02/2019 a las 06:44
  #2 (permalink)  
Antiguo 15/02/2019, 23:00
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 15 años, 7 meses
Puntos: 2237
Respuesta: Funcion dentro de otra

Creo que necesitas hacerlo directamente en la consulta usando CONVERT: https://docs.microsoft.com/en-us/sql...ql-server-2017

Probablemente alco como

Código PHP:
Ver original
  1. return User::create([
  2.             'name' => $data['name'],
  3.             'email' => $data['email'],
  4.             'password' => 'CONVERT( binary, ' . bcrypt($data['password']) . ')',
  5.         ]);

Prueba y nos cuentas si funciona.
__________________
- León, Guanajuato
- GV-Foto
  #3 (permalink)  
Antiguo 19/02/2019, 20:08
 
Fecha de Ingreso: julio-2009
Mensajes: 121
Antigüedad: 14 años, 7 meses
Puntos: 1
Respuesta: Funcion dentro de otra

Hola, muchas gracias por la respuesta, pero lamentablemente no funcionó :(

Código:
SQLSTATE[42000]: [Microsoft][ODBC Driver 13 for SQL Server][SQL Server]No se permite la conversión implícita del tipo de datos nvarchar a binary. Utilice la función CONVERT para ejecutar esta consulta. (SQL: insert into [user_auth] ([name], [email], [password]) values (Mauro, [email protected], CONVERT( binary, 0xb1be70e95422144570e9cfcf0298bebe)))
Mismo error.

Me la guarda asi: CONVERT( binary, 0xb53aa2dee7078f3f0a93b5b578e2c4c4)

osea eso aparece en la tabla contraseña

Última edición por sk0rpi0n; 23/02/2019 a las 14:08
  #4 (permalink)  
Antiguo 04/03/2019, 06:03
 
Fecha de Ingreso: julio-2009
Mensajes: 121
Antigüedad: 14 años, 7 meses
Puntos: 1
Respuesta: Funcion dentro de otra

Alguien más tiene idea como se puede solucionar plz?
  #5 (permalink)  
Antiguo 05/03/2019, 10:33
Avatar de xfxstudios  
Fecha de Ingreso: junio-2015
Ubicación: Valencia - Venezuela
Mensajes: 2.448
Antigüedad: 8 años, 9 meses
Puntos: 263
Respuesta: Funcion dentro de otra

y si extraes esa linea de las comillas simples?:

Código PHP:
Ver original
  1. return User::create([
  2.             'name' => $data['name'],
  3.             'email' => $data['email'],
  4.             'password' => CONVERT( binary, ' . bcrypt($data['password']) . '),
  5.         ]);
__________________
[email protected]
HITCEL

Etiquetas: funcion, laravel
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 03:09.