New question

Question:

Date: 16-03-2016 05:10:40 (In Spanish)

Enviar datos encriptados en POST de Form[Resolved]

Hola gente! tengo un form bajo HTTPS que registra datos de tarjeta de credito para realizar pagos.... como puedo hacer que cuando el form haga el POST no se vean esos datos? osea con cualquier debug se ven...

Cual seria la mejor practica de enviar esos datos encriptados?
Tags: $_POST - HTTPS - Javascript - PHP - Question - SSL Secure Sockets Layer - TLS Transport Layer Security Votes: 3 - Answers: 8 - Views: 23 Share on: Google Facebook Twitter LinkedIn Link
 

Answers:

  • Date: 16-03-2016 06:31:57 Hola Ramiro, muy interesante el tema, para el manejo de los datos sensibles (en este caso tarjetas de credito) debes tener consideraciones en varios aspectos, lógicos, físicos, sociales, entre otros. Con esto quiero decir que de nada sirve enviar la información de forma segura si luego la dejas sobre la mesa al alcance de todos. Cuando leí el titulo de tu pregunta "Guardando nro de tarjeta de credito en dB" me imagine que preguntabas por el guardado encriptado de la información en la base de datos (el equivalente a no dejar la info sobre la mesa) y no a la información que se visualiza del lado del cliente con un inspector de código/debugger.

    Debo decirte que por lo general no se hace nada más del lado del cliente, se supone que si el cliente es el que ingresa la información, poco sentido tendrá ocultarle esta a un inspector de código/debugger, porque el ya lo conoce, ahora bien, cuando esta información es enviada al servidor por medio de una peticón POST HTTPS, esta información viaja encriptada por el certificado utilizado, y con esto nadie podrá entender/leer el contenido del POST. Una vez la información llega al servidor, esta deberá ser almacenada de forma correcta (encriptada idealmente).

    Lo que puedes hacer para ver como se esta enviando al información es utilizar un sniffer de red como wireshark (para capturar el paquete POST y comprobar que es ilegible).

    Saludos,
      Votes: 3 - Link answer
     
  • Date: 16-03-2016 06:54:28 Hola Ramiro:

    Cuanto te dice Fernando es lo puntual en tu caso.

    Rizando el rizo (estaba escribiendo mientras Fernando editaba el tema y desde esa primera lectura, entendida como Fernando, también yo "me imagine que preguntabas por el guardado encriptado de la información en la base de datos".

    Por si sirve el tema y válido para las contraseñas que ni el administrador de la web podría descifrarlas.

    Yo te recomendaría que utilices password_hash() (a partir de PHP 5 >= 5.5.0, PHP 7).

    Lo describía mínimamente en este link de un tema de password
    Verás un montón de datos pero insetarlos como número de tarjeta no te servirá

    Te explico brevemente el procedimiento:
    Yo tengo una tarjeta de crédito cuyos 16 números son:
    <?php
    $notarjeta =  '1234567890123456';?>

    La obtención del hast sería :
    <?php echo password_hash($notarjeta, PASSWORD_BCRYPT, ['cost' => 12,]);
    // ['cost'] puede ser un número entre 04 y 31 //
    ?>


    Si lo ejecutamos varias veces obtenemos valores tales como
    $2y$12$bFE8tPV6pWX7MoqUz6sSDuEeaB2LiteVMlavCFvgdJzlXQ3PB/6cu
    $2y$12$UKAvS3eDg2MiqP5YZjoo7.VmEnPc/eg2rqmyBtM5onvEyxvDMhQLy


    Como puedes observar, el password_hash() no se repite en cada entrada, siendo éste el valor que entraría en la base de datos o directamente lo someteríamos a verificación.

    Para verificarlo tenemos password_verify() que lo codificaríamos de la forma siguiente:
    <?php
    $notarjeta =  '1234567890123456';
    $hash = '$2y$12$bFE8tPV6pWX7MoqUz6sSDuEeaB2LiteVMlavCFvgdJzlXQ3PB/6cu';
    // El que tenemos en nuestro post o base de datos
    if (password_verify($notarjeta, $hash)) {
        echo '¡La verificación es válida!';
    } else {
        echo 'La verificación no es válida.';
    }
    ?>


    Las ventajas son superiores a md5(), sha1(), BLOWFISH o crypt() por citar algunos.

    Desde lo interesante del tema, seguiremos compartiendo.
      Votes: 3 - Link answer
     
  • Date: 16-03-2016 07:54:22 Bueno muchachos ante todo muchas gracias por las respuestas y perdón por el enunciado... la parte de guardarlo encriptado en la dB ya la tengo implementada el tema es como viaja la info, lo cual leyendo me quedo un poco mas tranquilo ya que la conexión de la pagina es con https.

    Mi consulta era porque en sitios de registros donde tenes que poner tarjeta de crédito la info no se ve con un debug como el firebug ... ya viaja de otra forma, por ahí eso es lo que quería lograr, voy a testear un loco lo del wireshark.
      Votes: 2 - Link answer
     
  • Date: 16-03-2016 08:28:12 De nada Ramiro, aprovecho para pedirte que comentes como es que estas haciendo la persistencia en la base de datos, si estas usando encriptación a nivel base de datos o a nivel aplicación con PHP u algún otro lenguaje/complemento.

    Con respecto a la información que ves localmente, podras dar mas detalle? por ejempo con que navegador / inspector / debugger estas visualizando la info, en qué momento la vez? (antes o despues del post?), etc....

    Saludos,
      Votes: 1 - Link answer
     
  • Date: 16-03-2016 11:17:21 Si la encriptacion la realizo con MD5 que mirando lo que puso Txema podria ver lo de password_hash() y lo que veo localmente es al hacer el post con el firebug   Votes: 1 - Link answer
     
  • Date: 16-03-2016 11:57:28 Si usas MD5 para guardar los datos de la tarjeta de credito entonces no te interesa recuperarlos, no? toda información que sea pasada por el algoritmo MD5 no podrá ser vuelta a leer.... yo en este caso recomendaría funciones de PHP como mcrypt_encrypt y mcrypt_decrypt.... o encriptación a nivel MySQL AES_ENCRYPT() y AES_DECRYPT()

    Saludos,

    PD: espero puedan compartir experiencias en la encriptación de información, muchas gracias de antemano.
      Votes: 1 - Link answer
     
  • Date: 16-03-2016 12:04:24 Si te sirve como experiencia ajena, el uso de lo que denominan fuerza bruta para desencriptar md5 y sh1 lo puedes ver en Algoritmo para realizar Fuerza Bruta a MD5 y SHA1 en PHP

    La autoría la tienes al inicio del foro, y a ellos les corresponde el mérito, no de ejecutarlo sino de advertirlo, con algunas recomendaciones al final de la entrada del foro.

    La verdad es que si investigas lo que representa $2y$12$ en mi ejemplo, la encriptación (que podría ser en sus caracteres iniciales de $2y$04$ a $2y$31$) es un plus importante. Y la verificación tarda de micromilélimas a unas pocas milésimas de segundo.

    Saludos.
      Votes: 1 - Link answer
     
  • Date: 16-03-2016 14:34:39 Hola Txema, muy bueno, aquí yo hice mi prueba con el texto "fer" en MD5 y obtuvo el resultado por fuerza bruta en 3,546,452 intentos, muy buen aporte!

    Dejo el script 100% ejecutable para el que lo quiera probar / mejorar. Como bien dijo el creado "Bonedragon" en el foro de "dragonjar", hay que armar el formulario, y yo le sumo a esto:
    Habría que hacer una función que pueda ser invocaca recursivamente para hacer dinámica la cantidad de caracteres y no dependiente del código (este código intenta descubrir textos hasta con 6 caracteres).
    Una mejora sustancial sería incorporar un diccionar de contraseñas habituales (hay muchos en Internet que se pueden descargar)

    <?php
    ini_set('max_execution_time', 1200); //Tiempo de ejecución del script
    $m = 0; //Contador de intentos
    //$key = "202cb962ac59075b964b07152d234b70"; //Clave en md5 o sha1 según se requiera 
    $key = '90eb8760c187a2097884ed4c9ffbb6a4';
    
    //Validacion de 1 caracter
    for ($a = 32; $a < 255; $a++) {
        $pal = chr($a);
        $m++;
        if (md5($pal) == $key) {
            echo "la clave es ".$pal."<br>";
            echo "Se encontró la clave en ".number_format($m)." intentos"; //Mensaje informativo
            exit();
        }
    }
    
    //Validación de 2 caracteres
    for ($a = 32; $a < 255; $a++) {
        for ($b = 32; $b < 255; $b++) {
            $pal = chr($a).chr($b);
            $m++;
            if (md5($pal) == $key) {
                echo "la clave es ".$pal."<br>";
                echo "Se encontró la clave en ".number_format($m)." intentos"; //Mensaje informativo
                exit();
            }
        }
    }
    
    //Validación de 3 caracteres
    for ($a = 32; $a < 255; $a++) {
        for ($b = 32; $b < 255; $b++) {
            for ($c = 32; $c < 255; $c++) {
                $pal = chr($a).chr($b).chr($c);
                $m++;
                if (md5($pal) == $key) {
                    echo "la clave es ".$pal."<br>";
                    echo "Se encontró la clave en ".number_format($m)." intentos"; //Mensaje informativo
                    exit();
                }
            }
        }
    }
    
    //Validación de 4 caracteres
    for ($a = 32; $a < 255; $a++) {
        for ($b = 32; $b < 255; $b++) {
            for ($c = 32; $c < 255; $c++) {
                for ($d = 32; $d < 255; $d++) {
                    $pal = chr($a).chr($b).chr($c).chr($d);
                    $m++;
                    if (md5($pal) == $key) {
                        echo "la clave es ".$pal."<br>";
                        echo "Se encontró la clave en ".number_format($m)." intentos"; //Mensaje informativo
                        exit();
                    }
                }
            }
        }
    }
    
    //Validación de 5 caracteres
    for ($a = 97; $a < 123; $a++) {
        for ($b = 97; $b < 123; $b++) {
            for ($c = 97; $c < 123; $c++) {
                for ($d = 97; $d < 123; $d++) {
                    for ($e = 97; $e < 123; $e++) {
                        $pal = chr($a).chr($b).chr($c).chr($d).chr($e);
                        $m++;
                        if (md5($pal) == $key) {
                            echo "la clave es ".$pal."<br>";
                            echo "Se encontró la clave en ".number_format($m)." intentos"; //Mensaje informativo
                            exit();
                        }
                    }
                }
            }
        }
    }
    
    //Validación de 6 caracteres
    for ($a = 97; $a < 123; $a++) {
        for ($b = 97; $b < 123; $b++) {
            for ($c = 97; $c < 123; $c++) {
                for ($d = 97; $d < 123; $d++) {
                    for ($e = 97; $e < 123; $e++) {
                        for ($f = 97; $f < 123; $f++) {
                            $pal = chr($a).chr($b).chr($c).chr($d).chr($e).chr($f);
                            $m++;
                            if (md5($pal) == $key) {
                                echo "la clave es ".$pal."<br>";
                                echo "Se encontró la clave en ".number_format($m)." intentos"; //Mensaje informativo
                                exit();
                            }
                        }
                    }
                }
            }
        }
    }
    
    echo "Después de ".$m." intentos no se encontro la clave";
    


    Saludos!
      Votes: 2 - Link answer
     
To actively participate in the community first must authenticate, enter the system.Sign In