none
Consulta Sobre desarrollo RRS feed

  • Pregunta

  • Hola amigos! Tengo un gran problema con las practicas que se estan aplicando en un desarrollo web y me gustaria leer algunas opiniones sobre el caso.

    El punto es que en una app web se esta haciendo todo el encriptado del login y registro con javaScript y me parece que esta expuesto, pero se me ordena hacerlo de esta forma: Sera bueno hacer esa practica? 

    Aqui un ejemplo:

    function SHA1 (msg) { 
    	function rotate_left(n,s) {
    		var t4 = ( n<<s ) | (n>>>(32-s));
    		return t4;
    	}; 
    	function lsb_hex(val) {
    		var str="";
    		var i;
    		var vh;
    		var vl;
     
    		for( i=0; i<=6; i+=2 ) {
    			vh = (val>>>(i*4+4))&0x0f;
    			vl = (val>>>(i*4))&0x0f;
    			str += vh.toString(16) + vl.toString(16);
    		}
    		return str;
    	}; 
    	function cvt_hex(val) {
    		var str="";
    		var i;
    		var v;
     
    		for( i=7; i>=0; i-- ) {
    			v = (val>>>(i*4))&0x0f;
    			str += v.toString(16);
    		}
    		return str;
    	};
     
     
    	function Utf8Encode(string) {
    		string = string.replace(/\r\n/g,"\n");
    		var utftext = "";
     
    		for (var n = 0; n < string.length; n++) {
     
    			var c = string.charCodeAt(n);
     
    			if (c < 128) {
    				utftext += String.fromCharCode(c);
    			}
    			else if((c > 127) && (c < 2048)) {
    				utftext += String.fromCharCode((c >> 6) | 192);
    				utftext += String.fromCharCode((c & 63) | 128);
    			}
    			else {
    				utftext += String.fromCharCode((c >> 12) | 224);
    				utftext += String.fromCharCode(((c >> 6) & 63) | 128);
    				utftext += String.fromCharCode((c & 63) | 128);
    			}
     
    		}
     
    		return utftext;
    	};
     
    	var blockstart;
    	var i, j;
    	var W = new Array(80);
    	var H0 = 0x67452301;
    	var H1 = 0xEFCDAB89;
    	var H2 = 0x98BADCFE;
    	var H3 = 0x10325476;
    	var H4 = 0xC3D2E1F0;
    	var A, B, C, D, E;
    	var temp;
     
    	msg = Utf8Encode(msg);
     
    	var msg_len = msg.length;
     
    	var word_array = new Array();
    	for( i=0; i<msg_len-3; i+=4 ) {
    		j = msg.charCodeAt(i)<<24 | msg.charCodeAt(i+1)<<16 |
    		msg.charCodeAt(i+2)<<8 | msg.charCodeAt(i+3);
    		word_array.push( j );
    	}
     
    	switch( msg_len % 4 ) {
    		case 0:
    			i = 0x080000000;
    		break;
    		case 1:
    			i = msg.charCodeAt(msg_len-1)<<24 | 0x0800000;
    		break;
     
    		case 2:
    			i = msg.charCodeAt(msg_len-2)<<24 | msg.charCodeAt(msg_len-1)<<16 | 0x08000;
    		break;
     
    		case 3:
    			i = msg.charCodeAt(msg_len-3)<<24 | msg.charCodeAt(msg_len-2)<<16 | msg.charCodeAt(msg_len-1)<<8	| 0x80;
    		break;
    	}
     
    	word_array.push( i );
     
    	while( (word_array.length % 16) != 14 ) word_array.push( 0 );
     
    	word_array.push( msg_len>>>29 );
    	word_array.push( (msg_len<<3)&0x0ffffffff );
     
     
    	for ( blockstart=0; blockstart<word_array.length; blockstart+=16 ) {
     
    		for( i=0; i<16; i++ ) W[i] = word_array[blockstart+i];
    		for( i=16; i<=79; i++ ) W[i] = rotate_left(W[i-3] ^ W[i-8] ^ W[i-14] ^ W[i-16], 1);
     
    		A = H0;
    		B = H1;
    		C = H2;
    		D = H3;
    		E = H4;
     
    		for( i= 0; i<=19; i++ ) {
    			temp = (rotate_left(A,5) + ((B&C) | (~B&D)) + E + W[i] + 0x5A827999) & 0x0ffffffff;
    			E = D;
    			D = C;
    			C = rotate_left(B,30);
    			B = A;
    			A = temp;
    		} 
    		for( i=20; i<=39; i++ ) {
    			temp = (rotate_left(A,5) + (B ^ C ^ D) + E + W[i] + 0x6ED9EBA1) & 0x0ffffffff;
    			E = D;
    			D = C;
    			C = rotate_left(B,30);
    			B = A;
    			A = temp;
    		}
     
    		for( i=40; i<=59; i++ ) {
    			temp = (rotate_left(A,5) + ((B&C) | (B&D) | (C&D)) + E + W[i] + 0x8F1BBCDC) & 0x0ffffffff;
    			E = D;
    			D = C;
    			C = rotate_left(B,30);
    			B = A;
    			A = temp;
    		} 
    		for( i=60; i<=79; i++ ) {
    			temp = (rotate_left(A,5) + (B ^ C ^ D) + E + W[i] + 0xCA62C1D6) & 0x0ffffffff;
    			E = D;
    			D = C;
    			C = rotate_left(B,30);
    			B = A;
    			A = temp;
    		} 
    		H0 = (H0 + A) & 0x0ffffffff;
    		H1 = (H1 + B) & 0x0ffffffff;
    		H2 = (H2 + C) & 0x0ffffffff;
    		H3 = (H3 + D) & 0x0ffffffff;
    		H4 = (H4 + E) & 0x0ffffffff;
     
    	}
     
    	var temp = cvt_hex(H0) + cvt_hex(H1) + cvt_hex(H2) + cvt_hex(H3) + cvt_hex(H4);
     
    	return temp.toLowerCase();
    }

    Y asi se encuentra toda la parte de seguridad, encriptacion simetrica, eas, contadores, has, todo esta hecho en javaScript y se comprueba en el servidor, pero no se como argumentar que esto para mi no es seguro. Y me gustaria saber si es buena practica hacerlo o si es algo descabellado?.

    Gracias!


    José

    sábado, 23 de enero de 2016 16:17

Respuestas

  • Presumiblemente, la idea al usar criptografía en el javascript es que el usuario teclea los datos críticos (tales como una password), estos se cifran en el navegador, y se transmiten al servidor cifrados con la intención de que nadie los pueda ver "en tránsito" por la línea.

    ¿Qué problema tiene esto? Pues que la entrega del javascript desde el servidor al navegador no es segura. Un atacante que pueda ver los datos "en tránsito" probablemente también puede alterarlos, y podría enviar al navegador un script inseguro en sustitución del script original, logrando así recuperar los datos cifrados.

    Por eso la criptografía debe hacerla el propio navegador, que para eso lleva internamente una implementación de SSL, basada en código que ya viene "de fábrica" en el navegador, y en consecuencia no puede ser trucado enviándole código ficticio por parte de un atacante. En resumidas cuentas: es más seguro usar https que meter criptografía en javascript. Y también es mucho más sencillo, no requiere escribir nada de código.

    • Marcado como respuesta Jose1714 lunes, 25 de enero de 2016 5:44
    sábado, 23 de enero de 2016 17:13

Todas las respuestas

  • esper este articulo te ayude

    https://www.nccgroup.trust/us/about-us/newsroom-and-events/blog/2011/august/javascript-cryptography-considered-harmful/


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    sábado, 23 de enero de 2016 16:56
  • Presumiblemente, la idea al usar criptografía en el javascript es que el usuario teclea los datos críticos (tales como una password), estos se cifran en el navegador, y se transmiten al servidor cifrados con la intención de que nadie los pueda ver "en tránsito" por la línea.

    ¿Qué problema tiene esto? Pues que la entrega del javascript desde el servidor al navegador no es segura. Un atacante que pueda ver los datos "en tránsito" probablemente también puede alterarlos, y podría enviar al navegador un script inseguro en sustitución del script original, logrando así recuperar los datos cifrados.

    Por eso la criptografía debe hacerla el propio navegador, que para eso lleva internamente una implementación de SSL, basada en código que ya viene "de fábrica" en el navegador, y en consecuencia no puede ser trucado enviándole código ficticio por parte de un atacante. En resumidas cuentas: es más seguro usar https que meter criptografía en javascript. Y también es mucho más sencillo, no requiere escribir nada de código.

    • Marcado como respuesta Jose1714 lunes, 25 de enero de 2016 5:44
    sábado, 23 de enero de 2016 17:13