Foros del Web » Programando para Internet » Javascript »

Enviar datos cifrados

Estas en el tema de Enviar datos cifrados en el foro de Javascript en Foros del Web. Buenas compañeros, tengo una duda. Yo tengo un formulario html que envía datos al servidor. Entonces me gustarían que estos datos estén cifrados y poderlos ...
  #1 (permalink)  
Antiguo 19/05/2012, 11:49
Avatar de Heent  
Fecha de Ingreso: diciembre-2008
Mensajes: 140
Antigüedad: 15 años, 4 meses
Puntos: 6
Pregunta Enviar datos cifrados

Buenas compañeros, tengo una duda. Yo tengo un formulario html que envía datos al servidor. Entonces me gustarían que estos datos estén cifrados y poderlos descifrar al lado del servidor con PHP.

¿Com puedo cifrarlos? El problema que me encuentro es que si creo un algoritmo que me cifre los datos antes de mandar el formulario es que se puede ver el código y claro entonces es fácil, supongo, crear un código que lo descifre.

Si queréis os paso el algoritmo y miran a ver si lo encontráis seguro o no jeje


Saludos y muchas gracias!
  #2 (permalink)  
Antiguo 19/05/2012, 12:27
 
Fecha de Ingreso: julio-2011
Ubicación: Zapopan, Jal. MX
Mensajes: 316
Antigüedad: 12 años, 9 meses
Puntos: 32
Respuesta: Enviar datos cifrados

Hola, podrias usar md5 para ello, pero como Javascript no tiene una funcion nativa de md5, puedes copiar el codigo de esta pagina http://phpjs.org, te dejo la funcion md5 y la utf8_encode ya que md5 requiere codificar en utf8.

md5
Código Javascript:
Ver original
  1. function md5 (str) {
  2.     // Calculate the md5 hash of a string  
  3.     //
  4.     // version: 1109.2015
  5.     // discuss at: http://phpjs.org/functions/md5    // +   original by: Webtoolkit.info (http://www.webtoolkit.info/)
  6.     // + namespaced by: Michael White (http://getsprink.com)
  7.     // +    tweaked by: Jack
  8.     // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
  9.     // +      input by: Brett Zamir (http://brett-zamir.me)    // +   bugfixed by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
  10.     // -    depends on: utf8_encode
  11.     // *     example 1: md5('Kevin van Zonneveld');
  12.     // *     returns 1: '6e658d4bfcb59cc13f96c14450ac40b9'
  13.     var xl;
  14.     var rotateLeft = function (lValue, iShiftBits) {
  15.         return (lValue << iShiftBits) | (lValue >>> (32 - iShiftBits));
  16.     };
  17.      var addUnsigned = function (lX, lY) {
  18.         var lX4, lY4, lX8, lY8, lResult;
  19.         lX8 = (lX & 0x80000000);
  20.         lY8 = (lY & 0x80000000);
  21.         lX4 = (lX & 0x40000000);        lY4 = (lY & 0x40000000);
  22.         lResult = (lX & 0x3FFFFFFF) + (lY & 0x3FFFFFFF);
  23.         if (lX4 & lY4) {
  24.             return (lResult ^ 0x80000000 ^ lX8 ^ lY8);
  25.         }        if (lX4 | lY4) {
  26.             if (lResult & 0x40000000) {
  27.                 return (lResult ^ 0xC0000000 ^ lX8 ^ lY8);
  28.             } else {
  29.                 return (lResult ^ 0x40000000 ^ lX8 ^ lY8);            }
  30.         } else {
  31.             return (lResult ^ lX8 ^ lY8);
  32.         }
  33.     };
  34.     var _F = function (x, y, z) {
  35.         return (x & y) | ((~x) & z);
  36.     };
  37.     var _G = function (x, y, z) {        return (x & z) | (y & (~z));
  38.     };
  39.     var _H = function (x, y, z) {
  40.         return (x ^ y ^ z);
  41.     };    var _I = function (x, y, z) {
  42.         return (y ^ (x | (~z)));
  43.     };
  44.  
  45.     var _FF = function (a, b, c, d, x, s, ac) {        a = addUnsigned(a, addUnsigned(addUnsigned(_F(b, c, d), x), ac));
  46.         return addUnsigned(rotateLeft(a, s), b);
  47.     };
  48.  
  49.     var _GG = function (a, b, c, d, x, s, ac) {        a = addUnsigned(a, addUnsigned(addUnsigned(_G(b, c, d), x), ac));
  50.         return addUnsigned(rotateLeft(a, s), b);
  51.     };
  52.  
  53.     var _HH = function (a, b, c, d, x, s, ac) {        a = addUnsigned(a, addUnsigned(addUnsigned(_H(b, c, d), x), ac));
  54.         return addUnsigned(rotateLeft(a, s), b);
  55.     };
  56.  
  57.     var _II = function (a, b, c, d, x, s, ac) {        a = addUnsigned(a, addUnsigned(addUnsigned(_I(b, c, d), x), ac));
  58.         return addUnsigned(rotateLeft(a, s), b);
  59.     };
  60.  
  61.     var convertToWordArray = function (str) {        var lWordCount;
  62.         var lMessageLength = str.length;
  63.         var lNumberOfWords_temp1 = lMessageLength + 8;
  64.         var lNumberOfWords_temp2 = (lNumberOfWords_temp1 - (lNumberOfWords_temp1 % 64)) / 64;
  65.         var lNumberOfWords = (lNumberOfWords_temp2 + 1) * 16;        var lWordArray = new Array(lNumberOfWords - 1);
  66.         var lBytePosition = 0;
  67.         var lByteCount = 0;
  68.         while (lByteCount < lMessageLength) {
  69.             lWordCount = (lByteCount - (lByteCount % 4)) / 4;            lBytePosition = (lByteCount % 4) * 8;
  70.             lWordArray[lWordCount] = (lWordArray[lWordCount] | (str.charCodeAt(lByteCount) << lBytePosition));
  71.             lByteCount++;
  72.         }
  73.         lWordCount = (lByteCount - (lByteCount % 4)) / 4;        lBytePosition = (lByteCount % 4) * 8;
  74.         lWordArray[lWordCount] = lWordArray[lWordCount] | (0x80 << lBytePosition);
  75.         lWordArray[lNumberOfWords - 2] = lMessageLength << 3;
  76.         lWordArray[lNumberOfWords - 1] = lMessageLength >>> 29;
  77.         return lWordArray;    };
  78.  
  79.     var wordToHex = function (lValue) {
  80.         var wordToHexValue = "",
  81.             wordToHexValue_temp = "",            lByte, lCount;
  82.         for (lCount = 0; lCount <= 3; lCount++) {
  83.             lByte = (lValue >>> (lCount * 8)) & 255;
  84.             wordToHexValue_temp = "0" + lByte.toString(16);
  85.             wordToHexValue = wordToHexValue + wordToHexValue_temp.substr(wordToHexValue_temp.length - 2, 2);        }
  86.         return wordToHexValue;
  87.     };
  88.  
  89.     var x = [],        k, AA, BB, CC, DD, a, b, c, d, S11 = 7,
  90.         S12 = 12,
  91.         S13 = 17,
  92.         S14 = 22,
  93.         S21 = 5,        S22 = 9,
  94.         S23 = 14,
  95.         S24 = 20,
  96.         S31 = 4,
  97.         S32 = 11,        S33 = 16,
  98.         S34 = 23,
  99.         S41 = 6,
  100.         S42 = 10,
  101.         S43 = 15,        S44 = 21;
  102.  
  103.     str = this.utf8_encode(str);
  104.     x = convertToWordArray(str);
  105.     a = 0x67452301;    b = 0xEFCDAB89;
  106.     c = 0x98BADCFE;
  107.     d = 0x10325476;
  108.  
  109.     xl = x.length;    for (k = 0; k < xl; k += 16) {
  110.         AA = a;
  111.         BB = b;
  112.         CC = c;
  113.         DD = d;        a = _FF(a, b, c, d, x[k + 0], S11, 0xD76AA478);
  114.         d = _FF(d, a, b, c, x[k + 1], S12, 0xE8C7B756);
  115.         c = _FF(c, d, a, b, x[k + 2], S13, 0x242070DB);
  116.         b = _FF(b, c, d, a, x[k + 3], S14, 0xC1BDCEEE);
  117.         a = _FF(a, b, c, d, x[k + 4], S11, 0xF57C0FAF);        d = _FF(d, a, b, c, x[k + 5], S12, 0x4787C62A);
  118.         c = _FF(c, d, a, b, x[k + 6], S13, 0xA8304613);
  119.         b = _FF(b, c, d, a, x[k + 7], S14, 0xFD469501);
  120.         a = _FF(a, b, c, d, x[k + 8], S11, 0x698098D8);
  121.         d = _FF(d, a, b, c, x[k + 9], S12, 0x8B44F7AF);        c = _FF(c, d, a, b, x[k + 10], S13, 0xFFFF5BB1);
  122.         b = _FF(b, c, d, a, x[k + 11], S14, 0x895CD7BE);
  123.         a = _FF(a, b, c, d, x[k + 12], S11, 0x6B901122);
  124.         d = _FF(d, a, b, c, x[k + 13], S12, 0xFD987193);
  125.         c = _FF(c, d, a, b, x[k + 14], S13, 0xA679438E);        b = _FF(b, c, d, a, x[k + 15], S14, 0x49B40821);
  126.         a = _GG(a, b, c, d, x[k + 1], S21, 0xF61E2562);
  127.         d = _GG(d, a, b, c, x[k + 6], S22, 0xC040B340);
  128.         c = _GG(c, d, a, b, x[k + 11], S23, 0x265E5A51);
  129.         b = _GG(b, c, d, a, x[k + 0], S24, 0xE9B6C7AA);        a = _GG(a, b, c, d, x[k + 5], S21, 0xD62F105D);
  130.         d = _GG(d, a, b, c, x[k + 10], S22, 0x2441453);
  131.         c = _GG(c, d, a, b, x[k + 15], S23, 0xD8A1E681);
  132.         b = _GG(b, c, d, a, x[k + 4], S24, 0xE7D3FBC8);
  133.         a = _GG(a, b, c, d, x[k + 9], S21, 0x21E1CDE6);        d = _GG(d, a, b, c, x[k + 14], S22, 0xC33707D6);
  134.         c = _GG(c, d, a, b, x[k + 3], S23, 0xF4D50D87);
  135.         b = _GG(b, c, d, a, x[k + 8], S24, 0x455A14ED);
  136.         a = _GG(a, b, c, d, x[k + 13], S21, 0xA9E3E905);
  137.         d = _GG(d, a, b, c, x[k + 2], S22, 0xFCEFA3F8);        c = _GG(c, d, a, b, x[k + 7], S23, 0x676F02D9);
  138.         b = _GG(b, c, d, a, x[k + 12], S24, 0x8D2A4C8A);
  139.         a = _HH(a, b, c, d, x[k + 5], S31, 0xFFFA3942);
  140.         d = _HH(d, a, b, c, x[k + 8], S32, 0x8771F681);
  141.         c = _HH(c, d, a, b, x[k + 11], S33, 0x6D9D6122);        b = _HH(b, c, d, a, x[k + 14], S34, 0xFDE5380C);
  142.         a = _HH(a, b, c, d, x[k + 1], S31, 0xA4BEEA44);
  143.         d = _HH(d, a, b, c, x[k + 4], S32, 0x4BDECFA9);
  144.         c = _HH(c, d, a, b, x[k + 7], S33, 0xF6BB4B60);
  145.         b = _HH(b, c, d, a, x[k + 10], S34, 0xBEBFBC70);        a = _HH(a, b, c, d, x[k + 13], S31, 0x289B7EC6);
  146.         d = _HH(d, a, b, c, x[k + 0], S32, 0xEAA127FA);
  147.         c = _HH(c, d, a, b, x[k + 3], S33, 0xD4EF3085);
  148.         b = _HH(b, c, d, a, x[k + 6], S34, 0x4881D05);
  149.         a = _HH(a, b, c, d, x[k + 9], S31, 0xD9D4D039);        d = _HH(d, a, b, c, x[k + 12], S32, 0xE6DB99E5);
  150.         c = _HH(c, d, a, b, x[k + 15], S33, 0x1FA27CF8);
  151.         b = _HH(b, c, d, a, x[k + 2], S34, 0xC4AC5665);
  152.         a = _II(a, b, c, d, x[k + 0], S41, 0xF4292244);
  153.         d = _II(d, a, b, c, x[k + 7], S42, 0x432AFF97);        c = _II(c, d, a, b, x[k + 14], S43, 0xAB9423A7);
  154.         b = _II(b, c, d, a, x[k + 5], S44, 0xFC93A039);
  155.         a = _II(a, b, c, d, x[k + 12], S41, 0x655B59C3);
  156.         d = _II(d, a, b, c, x[k + 3], S42, 0x8F0CCC92);
  157.         c = _II(c, d, a, b, x[k + 10], S43, 0xFFEFF47D);        b = _II(b, c, d, a, x[k + 1], S44, 0x85845DD1);
  158.         a = _II(a, b, c, d, x[k + 8], S41, 0x6FA87E4F);
  159.         d = _II(d, a, b, c, x[k + 15], S42, 0xFE2CE6E0);
  160.         c = _II(c, d, a, b, x[k + 6], S43, 0xA3014314);
  161.         b = _II(b, c, d, a, x[k + 13], S44, 0x4E0811A1);        a = _II(a, b, c, d, x[k + 4], S41, 0xF7537E82);
  162.         d = _II(d, a, b, c, x[k + 11], S42, 0xBD3AF235);
  163.         c = _II(c, d, a, b, x[k + 2], S43, 0x2AD7D2BB);
  164.         b = _II(b, c, d, a, x[k + 9], S44, 0xEB86D391);
  165.         a = addUnsigned(a, AA);        b = addUnsigned(b, BB);
  166.         c = addUnsigned(c, CC);
  167.         d = addUnsigned(d, DD);
  168.     }
  169.      var temp = wordToHex(a) + wordToHex(b) + wordToHex(c) + wordToHex(d);
  170.  
  171.     return temp.toLowerCase();
  172. }
  #3 (permalink)  
Antiguo 19/05/2012, 12:28
 
Fecha de Ingreso: julio-2011
Ubicación: Zapopan, Jal. MX
Mensajes: 316
Antigüedad: 12 años, 9 meses
Puntos: 32
Respuesta: Enviar datos cifrados

utf8_encode
Código Javascript:
Ver original
  1. function utf8_encode (argString) {
  2.     // Encodes an ISO-8859-1 string to UTF-8  
  3.     //
  4.     // version: 1109.2015
  5.     // discuss at: http://phpjs.org/functions/utf8_encode    // +   original by: Webtoolkit.info (http://www.webtoolkit.info/)
  6.     // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
  7.     // +   improved by: sowberry
  8.     // +    tweaked by: Jack
  9.     // +   bugfixed by: Onno Marsman    // +   improved by: Yves Sucaet
  10.     // +   bugfixed by: Onno Marsman
  11.     // +   bugfixed by: Ulrich
  12.     // +   bugfixed by: Rafal Kukawski
  13.     // *     example 1: utf8_encode('Kevin van Zonneveld');    // *     returns 1: 'Kevin van Zonneveld'
  14.     if (argString === null || typeof argString === "undefined") {
  15.         return "";
  16.     }
  17.      var string = (argString + ''); // .replace(/\r\n/g, "\n").replace(/\r/g, "\n");
  18.     var utftext = "",
  19.         start, end, stringl = 0;
  20.  
  21.     start = end = 0;    stringl = string.length;
  22.     for (var n = 0; n < stringl; n++) {
  23.         var c1 = string.charCodeAt(n);
  24.         var enc = null;
  25.          if (c1 < 128) {
  26.             end++;
  27.         } else if (c1 > 127 && c1 < 2048) {
  28.             enc = String.fromCharCode((c1 >> 6) | 192) + String.fromCharCode((c1 & 63) | 128);
  29.         } else {            enc = String.fromCharCode((c1 >> 12) | 224) + String.fromCharCode(((c1 >> 6) & 63) | 128) + String.fromCharCode((c1 & 63) | 128);
  30.         }
  31.         if (enc !== null) {
  32.             if (end > start) {
  33.                 utftext += string.slice(start, end);            }
  34.             utftext += enc;
  35.             start = end = n + 1;
  36.         }
  37.     }
  38.     if (end > start) {
  39.         utftext += string.slice(start, stringl);
  40.     }
  41.      return utftext;
  42. }

Ejemplo:
Código Javascript:
Ver original
  1. md5('Kevin van Zonneveld'); // '6e658d4bfcb59cc13f96c14450ac40b9'

Hay marivollas funciones de PHP que se encuentran en http://phpjs.org convertidas en codigo JS.

Si no necesitas md5, puedes usar alguna otra funcion que conozcas en php y la descargas como JS, por ejemplo el famoso y util base64, saludos!

Fuente: http://phpjs.org/
  #4 (permalink)  
Antiguo 19/05/2012, 12:37
Avatar de emprear
Colaborador
 
Fecha de Ingreso: junio-2007
Ubicación: me mudé
Mensajes: 8.388
Antigüedad: 16 años, 10 meses
Puntos: 1567
Respuesta: Enviar datos cifrados

No le encuentro mucho sentido al planteo, lo tendría por ejemplo, si quisieses que los datos enviados en el form se guardasen encriptados en una base de datos ó en el disco del server. Y eso se resolvería todo en el php.

Hacerlo en el html del form, con que objeto, si en definitiva el usuario que ingresa datos sabe el valor de esos datos sin encriptar.
Hasta podrias pasar los datos con ajax, y que el php devuelva como respuesta los valores encriptados, pero sigue sin tener sentido

Saludos
__________________
La voz de las antenas va, sustituyendo a Dios.
Cuando finalice la mutación, nueva edad media habrá
S.R.
  #5 (permalink)  
Antiguo 20/05/2012, 22:48
 
Fecha de Ingreso: julio-2011
Ubicación: Zapopan, Jal. MX
Mensajes: 316
Antigüedad: 12 años, 9 meses
Puntos: 32
Respuesta: Enviar datos cifrados

Hola emprear, yo tambien pienso algo asi como lo que mencionas, pero aqui el punto del tema es resolver el problema lo mas directo posible y lo mas importante hay que darle a todos la libertad de experimentar cualquier ocurrencia aunque sea "sin sentido" pero yo creo que es la mejor forma de aprender. Saludos
  #6 (permalink)  
Antiguo 21/05/2012, 03:36
(Desactivado)
 
Fecha de Ingreso: marzo-2012
Mensajes: 366
Antigüedad: 12 años
Puntos: 31
Respuesta: Enviar datos cifrados

Hace unos dias estube mirando esto mismo en otros foros. Al parecer es muy facil de escribir el código para usar la encriptación md5... pero también he leido que este tipo de encriptación es muy facil de desencriptar para quien consiga tener acceso al tráfico del envio del formulario. Osea, que prácticamente quien tenga acceso a los datos enviados, ya sea por el tráfico ya sea accediendo a la base de datos, solo tendrá que hacer un pequeño paso más de descriptación para acceder a los datos. Entonces... no es aconsejable este tipo de encriptación para sistemas en producción. Aunque siempre depende de la seguridad necesaria que quieras implementar.

He leido en otros foros sobre una función Crypt() que implementa un sistema de encriptación más avanzado y dificil de desencriptar, pero no se como funciona. Yo he utilizado a modo de pruevas el md5, tal y como han indicado las respuestas anteriores... pero yo lo he hecho solo a modo de prueva. Si tubiese que tener un sistema en explotación, no usaría el md5. Usaría el crypt()... aunque ya te digo, no he mirado como funciona. Seguramente haya aqui más compañeros que sepan como funciona el método crypt().
  #7 (permalink)  
Antiguo 21/05/2012, 23:05
 
Fecha de Ingreso: julio-2011
Ubicación: Zapopan, Jal. MX
Mensajes: 316
Antigüedad: 12 años, 9 meses
Puntos: 32
Respuesta: Enviar datos cifrados

Muy bien Kritik, me interesa ver eso del crypt y concuerdo con lo que dices. Por algo existe el protocolo https, nunca lo he manejado pero seguramente se encarga de bloquear conexiones inesperadas y quien sabe cuanto haga, pero si solo es cuestion de echarse unos tutoriales de seguridad web :)
  #8 (permalink)  
Antiguo 22/05/2012, 11:17
Avatar de Tecna  
Fecha de Ingreso: enero-2010
Mensajes: 291
Antigüedad: 14 años, 3 meses
Puntos: 45
Respuesta: Enviar datos cifrados

Buenas,

Cualquier cifrado que se realice en la parte del cliente con javascript sería altamente inseguro, por no decir inutil porque sería facilmente descifrable. Lo más seguro (partiendo de la base que no hay nada totalmente seguro) es usar el protocolo https, que además de implementar algoritmos de cifrado tiene otras medidas de seguridad como el uso de diferente puerto y capas de conexión y transporte que el protocolo http.

El algoritmo de cifrado MD5 al igual que otros como DES, SHA o RIPEMD son de un sólo sentido es decir no existe una función para obtener la cadena inicial sin cifrar partiendo de la cadena cifrada, se puede obtener por fuerza bruta y será más fácil cuanto mayor sea el número de colisiones posibles en la cadena cifrada (se produce una colisión cuando diferentes cadenas de entrada producen la misma cadena cifrada) y más dificil cuantos más bits tenga la cadena cifrada (en el caso de md5 128), pero todos más tarde o más temprano presentan alguna vulnerabilidad.

La función crypt() está disponible hace mucho tiempo en sistemas unix/linux y también en muchos lenguajes como perl, c, php y lo que hace es cifrar la cadena que se pasa como primer parámetro con cualquier algoritmo de cifrado existente en el sistema, que por supuesto se puede elegir. Podría darse el caso de que el único disponible fuera md5 así que no puede afirmarse que crypt sea más seguro que md5 porque son cosas distintas pero ambas podrían generar la misma cadena cifrada si crypt usara md5.
  #9 (permalink)  
Antiguo 22/05/2012, 11:28
Avatar de Aijoona
Colaborador
 
Fecha de Ingreso: mayo-2011
Ubicación: Buenos Aires
Mensajes: 779
Antigüedad: 12 años, 11 meses
Puntos: 343
Respuesta: Enviar datos cifrados

MD5 es para hashing, no vas a poder recuperar nada (de manera práctica al menos).

Como recmoienda @Tecna, deberías usar https.
__________________
blog | @aijoona

Etiquetas: cifrar, formulario
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 19:08.