<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	
	xmlns:georss="http://www.georss.org/georss"
	xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#"
	>

<channel>
	<title>Seguridad &#8211; Oscar Blancarte &#8211; Software Architecture</title>
	<atom:link href="https://www.oscarblancarteblog.com/tag/seguridad/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.oscarblancarteblog.com</link>
	<description>Software Architect &#38; FullStack developer</description>
	<lastBuildDate>Fri, 17 Jul 2020 01:14:17 +0000</lastBuildDate>
	<language>es-MX</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=5.5.13</generator>

<image>
	<url>https://www.oscarblancarteblog.com/wp-content/uploads/2019/03/cropped-ob-32x32.png</url>
	<title>Seguridad &#8211; Oscar Blancarte &#8211; Software Architecture</title>
	<link>https://www.oscarblancarteblog.com</link>
	<width>32</width>
	<height>32</height>
</image> 
<site xmlns="com-wordpress:feed-additions:1">89905023</site>	<item>
		<title>Autenticación con JSON Web Tokens</title>
		<link>https://www.oscarblancarteblog.com/2017/06/08/autenticacion-con-json-web-tokens/</link>
					<comments>https://www.oscarblancarteblog.com/2017/06/08/autenticacion-con-json-web-tokens/#comments</comments>
		
		<dc:creator><![CDATA[oblancarte]]></dc:creator>
		<pubDate>Thu, 08 Jun 2017 10:00:51 +0000</pubDate>
				<category><![CDATA[JSON]]></category>
		<category><![CDATA[NodeJS]]></category>
		<category><![CDATA[Seguridad]]></category>
		<category><![CDATA[javascript]]></category>
		<guid isPermaLink="false">https://www.oscarblancarteblog.com/?p=1732</guid>

					<description><![CDATA[<p>Los JSON Web Tokens (JWT) se ha convertido rápidamente en un estándar en la autenticación de aplicaciones, pues permite de una forma simple y elegante identificarte con el servidor mediante un Token. Dicho token es generado por el servidor y es transmitido hacia el cliente, el cual deberá presentar en cada invocación para poder ser [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://www.oscarblancarteblog.com/2017/06/08/autenticacion-con-json-web-tokens/">Autenticación con JSON Web Tokens</a> appeared first on <a rel="nofollow" href="https://www.oscarblancarteblog.com">Oscar Blancarte - Software Architecture</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><img loading="lazy" class="aligncenter size-full wp-image-1738" src="https://www.oscarblancarteblog.com/wp-content/uploads/2017/06/JSON-Web-Tokens.png" alt="JSON Web Tokens" width="1379" height="847" />Los JSON Web Tokens (JWT) se ha convertido rápidamente en un estándar en la autenticación de aplicaciones, pues permite de una forma simple y elegante identificarte con el servidor mediante un Token. Dicho token es generado por el servidor y es transmitido hacia el cliente, el cual deberá presentar en cada invocación para poder ser autenticado.<span id="more-1732"></span></p>
<h2>Que es un Token</h2>
<p>Lo primero que debemos de entender, es que es un token, pues será un concepto fundamental para entender el resto del artículo.</p>
<p>Un token es una cadena alfanumérica con caracteres aparentemente aleatorios, como el siguiente:</p>
<pre class="">eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ</pre>
<p>o el siguiente:</p>
<pre class="">24353689</pre>
<p>Estas cadenas de texto, pueden no aparentar un significado, sin embargo, tiene un significado real para el servidor o institución que lo emitió, el cual puede entender y así, validar al usuario que intenta acceder a la información, e incluso, puede tener datos adicionales.</p>
<p>Te dejo un video donde explico que es un Token:</p>
<p><iframe class='youtube-player' width='648' height='365' src='https://www.youtube.com/embed/CxeNGqZ_US8?version=3&#038;rel=1&#038;fs=1&#038;autohide=2&#038;showsearch=0&#038;showinfo=1&#038;iv_load_policy=1&#038;wmode=transparent' allowfullscreen='true' style='border:0;'></iframe></p>
<p>Un caso simple de tokens, es el dispositivo que dan los bancos para realizar transacciones desde internet, este token te genera un valor numérico que luego tenemos que ingresar al sistema, para que de esta forma, el portal pueda asegurarse de que efectivamente somos nosotros y no un impostor.</p>
<p><img loading="lazy" class="aligncenter wp-image-1733" src="https://www.oscarblancarteblog.com/wp-content/uploads/2017/06/bank-token.png" alt="" width="974" height="351" /></p>
<p>En el caso de los tokens bancarios, no se almacena una información real dentro del Token, sino que simplemente es un valor generado que luego puede ser validado por el banco como un valor real generado por nuestro token. Sin embargo, con JWT podemos enviar cualquier dato del cliente dentro del token para que el servidor pueda obtener mucha más información de nosotros.</p>
<h2>Que son los JSON Web Tokens</h2>
<p>Bien, una vez que comprendemos que son los Tokens podemos decir que los JWT son un tipo de token el cual engloba una estructura, la cual puede ser desencriptada por el servidor y de esta forma, autenticarnos como usuario en la aplicación.</p>
<p>Veamos la estructura de un JWT:</p>
<p><span style="color: #ff00ff;">eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9</span>.<span style="color: #00ccff;">eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9</span>.<span style="color: #ff0000;">TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ</span></p>
<p>Observemos que la cadena está dividida en 3 secciones separadas por un punto. Estas tres secciones tienen un significado:</p>
<ol>
<li><strong>HEADER:</strong> la primera parte, corresponde a los Header, y se almacena por lo general el tipo de token y el algoritmo de encriptamiento.</li>
<li><strong>PAYLOAD:</strong> La segunda parte, contiene los datos que identifican al usuario, como puede ser su ID, nombre de usuario, etc.</li>
<li><strong>FIRMA:</strong> La tercera parte es la firma digital, la cual se genera con las secciones anteriores y sirve para validar que el contenido no haya sido alterado.</li>
</ol>
<p>Ejemplo del Header</p>
<pre class="lang:js decode:true">{
  "alg": "HS256",
  "typ": "JWT"
}</pre>
<p>Ejemplo del Payload</p>
<pre class="lang:js decode:true ">{
  "id": "1234567890",
  "name": "Oscar Blancarte",
  "rol": “admin”
}</pre>
<p>La firma por otra parte es el header y el payload en base64 y después encriptado.</p>
<p>Puedes leer más de <a href="https://jwt.io/">JWT en su página oficial</a></p>
<h2>Como se utiliza los JWT</h2>
<p>Como ya hablamos, los JWT se utilizan para autenticar a los usuarios, para ello, el usuario requiere de un login tradicional como es el usuario y password. Una vez, que el sistema de Backend valida que el usuario y contraseña son correctos, este retorna un token al usuario. Este token lo deberá guardar el cliente, pues de aquí en adelante, todas las peticiones que realice al servidor, deberá llevar el token.</p>
<p><img loading="lazy" class="aligncenter wp-image-1734 " src="https://www.oscarblancarteblog.com/wp-content/uploads/2017/06/JWT-token.png" alt="JWT JSON Web Token" width="954" height="344" /></p>
<p>El token es por lo general almacenado en Cookies o en el LocalStorage del navegador, y cuando es requerido enviar un request al servidor, se recupere y se envía como header.</p>
<p>Un dato interesante del token es que no requiere que el servidor lo almacene para compararlos cuando lo envíe el cliente, pues el token por si solo puede ser auto validado, y como tiene un payload, es posible determinar de quien es el token. Veamos el siguiente payload:</p>
<pre class="lang:js decode:true ">{
  “userID”: 12345,
  “username”: “oblancarte”,
  “rol”: “admin”
}</pre>
<p>Cuando el servidor desencripte el token, podrá recuperar este payload y con ello, podrá saber que usuario es e incluso, es posible guardar datos adicionales como el rol o cualquier dato en formato JSON.</p>
<p>Otro dato interesante del token es que expira, es decir, el token solo es válido por un tiempo determinado. Por lo que el usuario deberá volverse a logear una vez que el token expire.</p>
<h2>Veamos cómo funcionaría todo el ciclo de vida de un JWT</h2>
<p>Ya hemos hablado de como JWT funciona, pero ahora entraremos a ver como es la interacción que tiene un usuario al autenticarse por medio de JWT, para lo cual veamos la siguiente imagen:</p>
<p><img loading="lazy" class="aligncenter wp-image-1735" src="https://www.oscarblancarteblog.com/wp-content/uploads/2017/06/JWT-lifecycle.png" alt="JWT JSON Web Token-lifecycle" width="917" height="407" /></p>
<p>Los pasos son los siguientes:</p>
<ol>
<li>El usuario requiere de una autenticación tradicional con el servidor, es decir usuario y password (o cualquier otro tipo de autenticación).</li>
<li>El servidor validará que los datos introducidos sean correctos y generará un Token.</li>
<li>El servidor enviará el token al usuario y este lo tendrá que almacenar de cualquier forma.</li>
<li>Una vez con el token, el usuario realiza una petición al servidor, enviando en el header el token previamente generado.</li>
<li>El servidor validará que el token sea correcto, desencriptandolo mediante la misma llave que utilizo para encriptarlo.</li>
<li>Si el token es correcto, entonces el servidor retornará los datos solicitados.</li>
</ol>
<p>Cabe mencionar que los puntos 4,5 y 6 se pueden repetir indeterminado número de veces hasta que el token caduque, cuando esto pase, entonces será necesario reiniciar desde el paso 1.</p>
<h2>Como implementar un JWT</h2>
<p>Existe una serie de librerías que nos permite crear un JWT, y todo dependerá del lenguaje que utilicemos. Sin embargo, quiero mostrarte como crear un JWT con <a href="https://www.oscarblancarteblog.com/2017/05/29/introduccion-a-nodejs-2/">NodeJS</a>.</p>
<p>Lo primero, es que será necesario importar el módulo <strong>jsonwebtoken:</strong></p>
<p><em>npm install –save jsonwebtoken</em></p>
<p><em> </em></p>
<h3>Generación del Token</h3>
<p>ya con la dependencia instalada podemos crear el token de la siguiente manera:</p>
<pre class="lang:js decode:true ">var jwt = require('jsonwebtoken')

function generateToken(user) {
  var u = {
   username: user.username,
   id: user.id
  }
  return token = jwt.sign(u, ‘password’, {
     expiresIn: 60 * 60 * 24 // expires in 24 hours
  })
}</pre>
<p>Lo primero que haremos será crear una función que reciba el objeto usuario o cualquier otro objeto que contenga la información requerida para la autenticación. Luego mediante el objeto usuario, creamos el objeto u, el cual solo contiene el username y el ID del usuario. Este objeto se convertirá en el payload del JWT, es decir la segunda parte del token.</p>
<p>Seguido, procedemos a crear el token mediante el módulo jwt, el cual nos proporciona el método sign que recibirá el payload y un password, este password deberá ser secreto, pues con él, podremos crear y desencriptar los tokens. Finalmente, el tercer parámetro son las opciones, aquí podremos seleccionar el algoritmo de encriptación, la fecha de expiración, etc.  En este ejemplo dejamos la configuración por default, pero agregamos que el token sea válidos solo por 24 horas.</p>
<p>Finalmente, el token es retornado al cliente.</p>
<h3>Validación del token</h3>
<p>Hasta este punto solo hemos visto la parte de la generación del Token, pero falta la segunda parte, en donde tenemos que validar que el Token que el cliente nos manda, es válido.</p>
<p>Para validar el Token podemos utilizar un Middleware de Express que valide de forma automática todas las URL que inicien con <strong>/secure</strong>. El middleware se ve de la siguiente manera:</p>
<pre class="lang:js decode:true ">router.use('/secure',function(req, res, next) {
  var token = req.headers['authorization']
  if (!token) {
    res.status(401).send({
      ok: false,
      message: 'Toket inválido'
    })
  }

  token = token.replace('Bearer ', '')

  jwt.verify(token, ‘password’, function(err, token) {
    if (err) {
      return res.status(401).send({
        ok: false,
        message: 'Toket inválido'
      });
    } else {
      req.token = token
      next()
    }
  });
});</pre>
<p>Podemos ver que en la primera llínea inicializa el middleware, luego en la segunda línea obtenemos el token del header <strong>“</strong><strong>authorization”</strong>. Si el token es Null regresamos un 401 indicando que no el cliente no tiene privilegios.</p>
<p>Los token generados por JWT se crean con la palabra “Bearer” al inicio del token, por lo que en la línea 10 quitamos esa parte del token, seguido, en la línea 12 realizamos la validación del token mediante el método verify.</p>
<p>Este método recibe el token como primer parámetro, como segundo parámetro, mandamos el password para desencriptar el token. Finalmente se envía como tercer parámetro una función Callback una vez que el token sea validado.</p>
<p>Si todo salió bien, el token estará en la variable token, en caso contrario, tendremos el error en la variable err.</p>
<h2>Conclusiones</h2>
<p>Como pudimos ver, los tokens son una magnifica forma de administrar la autenticación de los usuarios, pues permite crear de forma fácil, un mecanismo para comunicarse de forma segura entre el cliente y el servidor, además, de que permite mantener autenticado a un usuario por un tiempo determinado, evitando tener que iniciar sesión cada vez que entre a nuestra aplicación.</p>
<p>The post <a rel="nofollow" href="https://www.oscarblancarteblog.com/2017/06/08/autenticacion-con-json-web-tokens/">Autenticación con JSON Web Tokens</a> appeared first on <a rel="nofollow" href="https://www.oscarblancarteblog.com">Oscar Blancarte - Software Architecture</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.oscarblancarteblog.com/2017/06/08/autenticacion-con-json-web-tokens/feed/</wfw:commentRss>
			<slash:comments>70</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1732</post-id>	</item>
		<item>
		<title>sql injection, tu página esta en peligro</title>
		<link>https://www.oscarblancarteblog.com/2016/11/15/sql-injection/</link>
					<comments>https://www.oscarblancarteblog.com/2016/11/15/sql-injection/#comments</comments>
		
		<dc:creator><![CDATA[oblancarte]]></dc:creator>
		<pubDate>Tue, 15 Nov 2016 09:00:31 +0000</pubDate>
				<category><![CDATA[Seguridad]]></category>
		<guid isPermaLink="false">http://www.oscarblancarteblog.com/?p=1165</guid>

					<description><![CDATA[<p>Probablemente hallas escuchado el termino SQL Injection  o Inyección de SQL y es que es uno de los ataques más frecuentes a los sistemas informáticos en la actualidad. Pero que es exactamente SQL Inyección y cómo es que un Hacker puede aprovechar esta vulnerabilidad para atacar los sistemas. Pues estas preguntas las resolveremos en este [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://www.oscarblancarteblog.com/2016/11/15/sql-injection/">sql injection, tu página esta en peligro</a> appeared first on <a rel="nofollow" href="https://www.oscarblancarteblog.com">Oscar Blancarte - Software Architecture</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>				<img loading="lazy" class="wp-image-722 size-thumbnail alignleft" src="http://www.oscarblancarteblog.com/wp-content/uploads/2015/02/cyber-security1-e1438487499493-150x150.jpg" alt="SQL Injection" width="150" height="150" /></p>
<p>Probablemente hallas escuchado el termino SQL Injection  o Inyección de SQL y es que es uno de los ataques más frecuentes a los sistemas informáticos en la actualidad. Pero que es exactamente SQL Inyección y cómo es que un Hacker puede aprovechar esta vulnerabilidad para atacar los sistemas. Pues estas preguntas las resolveremos en este artículo.</p>
<p>&nbsp;</p>
<p>La inyección de código es el método por medio del cual es posible infiltrar código SQL a través de los parámetros que utilizan las aplicaciones para generar las consultas en el BackEnd. La inyección es posible debido a al descuido o la ignorancia a la hora de escribir el código, dejando vulnerable a la aplicación para recibir “parámetros” que en realidad son sentencias de SQL adicionales, que luego son ejecutadas en la base de datos si el conocimiento de los administradores del sistema.</p>
<p>&nbsp;</p>
<p>Este tipo de ataques se da en aplicaciones que generan las instrucciones SQL al vuelo o cuando se concatenan los parámetros a una instrucción base sin las debidas precauciones. Pero para entender mejor como es que se da este tipo de ataques es necesario conocer la anatomía de una instrucción SQL, para lo cual veamos la siguiente imagen:</p>
<p>&nbsp;</p>
<p><img loading="lazy" class="aligncenter wp-image-1166 size-full" src="http://www.oscarblancarteblog.com/wp-content/uploads/2016/11/sqlbase.png" alt="SQL injection - base" width="693" height="160" /></p>
<p><span id="more-1165"></span></p>
<p>Las instrucciones SQL generadas al vuelo por lo general parten de instrucción Base la cuales es una instrucción casi terminada a la cual solo se le concatena en el WHERE el parámetro de filtrado. La instrucción SQL por lo general está definida en el BackEnd, mientras que el parámetro es establecido desde el FrontEnd, de tal manera que el usuario puede manipular este parámetro para enviar no solo el valor esperado, sino que además agrega instrucciones SQL adicionales que serán ejecutadas después de la instrucción Base. Veamos cómo sería una consulta clásica de un usuario de la base de datos por medio de su nombre:</p>
<p>&nbsp;</p>
<p><img loading="lazy" class="aligncenter wp-image-1167 size-full" src="http://www.oscarblancarteblog.com/wp-content/uploads/2016/11/sqlbaseimpl.png" alt="SQL injection - base impl" width="694" height="160" /></p>
<p>&nbsp;</p>
<p>En la imagen vemos en Azul lo que corresponde a la consulta base, esta sección por lo general es fija en el código y solo espera el parámetro para ser concatenado. Tras la concatenación se generaría una consulta completa para consultar a los usuarios que se llamen “oscar”. Hasta aquí todo bien, pero que pasaría si en lugar de mandar solo el parámetro “oscar” mandaran “oscar’; delete from users;”, tras concatenar este parámetro tendríamos el siguiente resultado:</p>
<p><span class="lang:java decode:true crayon-inline ">Select * from users where name=’oscar’; delete from users;</span></p>
<p>Veamos que aquí ya tenemos dos instrucciones completas, por una parte, estamos realizando la consulta del usuario, pero en una segunda instrucción estamos borrando todos los usuarios, por lo tanto, el resultado sería catastrófico para la aplicación.</p>
<p>En este escenario analizamos un delete sobre la base de datos, pero se puede emplear para realizar consultas, insertar registros o actualizarlos. Algunos ejemplos pueden ser actualizar un usuario para darle más privilegios o insertar un nuevo usuario. Lo más importante de este ataque es que tenemos a nuestra merced absolutamente toda la base de datos, al menos hasta donde el usuario de la base de datos empleado para realizar las consultas no lo permite, de esta forma podríamos incluso limpiar todas las tablas o borrarlas.</p>
<p>&nbsp;</p>
<h2>Ejemplo de SQL Injection :</h2>
<p>&nbsp;</p>
<p>Para dejar mucho más claro cómo es que un hacker puede aprovecharse de esta vulnerabilidad para atacar un sistema informático, analizaremos un escenario muy común en las aplicaciones, el login o autenticación de usuario, el cual es un formulario muy simple como el que veremos a continuación:</p>
<p>&nbsp;</p>
<p><img loading="lazy" class="aligncenter wp-image-1168" src="http://www.oscarblancarteblog.com/wp-content/uploads/2016/11/login.jpg" alt="sql injection login" width="439" height="265" /></p>
<p>&nbsp;</p>
<p>En esta pantalla el usuario introduce su email y su password, presiona enter y la aplicación autentifica al usuario y le permite continuar en la aplicación, pero que pasa por dentro cuando presionamos el botón login.</p>
<p>Primero que nada, del lado del backend abra una instrucción base como la siguiente:</p>
<p><span class="lang:java decode:true crayon-inline ">String statement = “Select * from users where email = ‘“ + email + “’ and pwd= ‘“ + password +”’”;</span></p>
<p>Observemos que la instrucción base es un String el cual está esperando los valores de los parámetros para seguido ser ejecutada. En un caso normal un usuario escribiría su email y su correo, por ejemplo <a href="mailto:micorreo@gmail.com/1234">micorreo@gmail.com/1234</a> y esto generaría una instrucción SQL como esta:</p>
<p><span class="lang:java decode:true crayon-inline ">Select * from users where email = ‘micorreo@gmail.com’ and pwd = ‘1234’</span></p>
<p>Se ejecutaría en la base de datos y nos retornaría los datos del usuario. Pero qué pasa si en lugar de mandar los parámetros esperado, agregara algo más, por ejemplo: <span class="lang:java decode:true crayon-inline ">micorre@gmail.com/1234’;delete from users where email like ‘%</span></p>
<p>Veamos que el email es correcto, pero el password, además de tener un valor válido agrega un delete a la tabla de usuarios y tras realizar la concatenación tendríamos el siguiente resultado:</p>
<p><span class="lang:java decode:true crayon-inline ">Select * from users where email = ‘micorreo@gmail.com’ and pwd = ‘1234’; delete from users where email like ‘%’</span></p>
<p>Lo que provocaría la consulta del usuario, seguido del borrado de todos los usuarios, colapsando todo el sistema.</p>
<p>&nbsp;</p>
<h2>Como prevenir un ataque de SQL Injection :</h2>
<p>&nbsp;</p>
<p>Básicamente existen dos formas de prevenir estos ataques los cuales nuestros a continuación:</p>
<h3>Instrucciones SQL preparadas:</h3>
<p>Esta técnica consiste en utilizar ayudas del API de nuestro lenguaje de programación para crear instrucciones SQL preparadas, las cuales ya tiene las instrucciones previamente definidas junto con los parámetros que pueden recibir, impidiendo que instrucciones adicionales puedan ser ejecutadas en Java se implementaría de la siguiente manera:</p>
<pre class="lang:java decode:true">PreparedStatement statement = con.prepareStatement("select * from users where email = ? and psw = ?"); 
statement.setString(1, email); 
statement.setString(2, pwd); 
ResultSet results = statement.executeQuery();</pre>
<h3>Escape de los parámetros:</h3>
<p>Esta técnica consiste básicamente en convertir los caracteres especiales de SQL en simples String, para que de esta forma todos los parámetros sean interpretado como un solo String. Veamos un ejemplo en Java:</p>
<p><span class="lang:java decode:true crayon-inline ">String sql = &#8220;select * from users where user = &#8216;&#8221; + user.replace(&#8220;\\&#8221;, &#8220;\\\\&#8221;).replace(&#8220;&#8216;&#8221;, &#8220;\\'&#8221;) + &#8220;&#8216;;&#8221;;</span></p>
<p>El resultado de este String será que todos los parámetros sea solo un String, de esta manera si se inyecta código SQL este solo será parte del where y no se ejecutara como una instrucción adicional.</p>
<p>&nbsp;</p>
<h2>Conclusiones:</h2>
<p>La técnica de SQL Injection es de los ataques más utilizados en la actualidad y es que la gran mayoría de las aplicaciones que hoy están en funcionamiento son propensas a ser atacadas de esta manera, por lo que la mejor defensa contra este ataque es entender cómo funciona para poder prevenirlo.		</p>
<p>The post <a rel="nofollow" href="https://www.oscarblancarteblog.com/2016/11/15/sql-injection/">sql injection, tu página esta en peligro</a> appeared first on <a rel="nofollow" href="https://www.oscarblancarteblog.com">Oscar Blancarte - Software Architecture</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.oscarblancarteblog.com/2016/11/15/sql-injection/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1165</post-id>	</item>
		<item>
		<title>Seguridad &#8211; Confidencialidad, Integridad y Autenticidad en mensajes</title>
		<link>https://www.oscarblancarteblog.com/2015/02/22/confidencialidad-integridad-y-autenticidad-en-mensajes/</link>
					<comments>https://www.oscarblancarteblog.com/2015/02/22/confidencialidad-integridad-y-autenticidad-en-mensajes/#comments</comments>
		
		<dc:creator><![CDATA[oblancarte]]></dc:creator>
		<pubDate>Sun, 22 Feb 2015 22:30:00 +0000</pubDate>
				<category><![CDATA[Seguridad]]></category>
		<category><![CDATA[Arquitectura de software]]></category>
		<guid isPermaLink="false">http://oscarblancarteblog.com/?p=504</guid>

					<description><![CDATA[<p>				Confidencialidad: Es la capacidad de un mensaje para mantener oculto su contenido de tal forma que si una tercera persona ve el mensaje no pueda interpretar su contenido.</p>
<p>Integridad: Se refiera que los elementos mensajes, datos, documentos, y otros formas de contenido no han sido modificados en tránsito o en reposo.</p>
<p>Autenticidad: Se refiere a garantizar que el mensaje ha sido enviado por quien dice ser.		</p>
<p>The post <a rel="nofollow" href="https://www.oscarblancarteblog.com/2015/02/22/confidencialidad-integridad-y-autenticidad-en-mensajes/">Seguridad &#8211; Confidencialidad, Integridad y Autenticidad en mensajes</a> appeared first on <a rel="nofollow" href="https://www.oscarblancarteblog.com">Oscar Blancarte - Software Architecture</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>				<a href="http://www.oscarblancarteblog.com/wp-content/uploads/2015/02/cyber-security1-e1438487499493.jpg"><img loading="lazy" class="alignleft wp-image-722" src="http://www.oscarblancarteblog.com/wp-content/uploads/2015/02/cyber-security1-e1438487499493.jpg" alt="" width="132" height="120" /></a></p>
<p>Cada día las aplicaciones tiene mayor necesidad de intercambiar mensajes con el fin de integrar aplicaciones o de comunicar algo a otras aplicaciones, este tipo de intercambio de mensajes ha crecido a un mas con la llegada de la arquitectura orientada a Servicios(SOA), ya que ha creado un ambiente propicio para que las aplicaciones intercambien mensajes de un punto a otro.</p>
<p>Sea cual sea la el motivo por el cual un mensaje es enviado de un punto a otro es indispensable asegurarnos que los mensajes sean enviados en un canal seguro y que el mensaje enviado sea el mismo que se reciba del otro lado sin ninguna alteración, también existen escenario en los que los mensajes contienen información altamente confidencial como datos de nuestros clientes o cuentas bancarias por lo que somos responsables de asegurarnos que la información continué siendo confidencial.</p>
<p>La pregunta aquí es, que mecanismos podemos implementar para que nuestros mensajes sean enviados en un canal seguro, el cual impida que nuestro mensaje sea alterado o descifrado por terceras personas.<span id="more-504"></span></p>
<p>Antes de contestar estas preguntas es importante entender que es la Confidencialidad, Integridad y Autenticidad en mensajes por lo que empezaremos con definir estos términos:</p>
<ul>
<li><strong>Confidencialidad</strong>: Es la capacidad de un mensaje para mantener oculto su contenido de tal forma que si una tercera persona ve el mensaje no pueda interpretar su contenido.</li>
<li><strong>Integridad</strong>: Se refiere a que los elementos mensajes, datos, documentos, y otros formas de contenido no han sido modificados en tránsito o en reposo.</li>
<li><strong>Autenticidad</strong>: Se refiere a garantizar que el mensaje ha sido enviado por quien dice ser.</li>
</ul>
<p>Puede que estos tres términos no nos queden muy claros por lo que a continuación hablaremos mas a detalle de cada tema.</p>
<h2><strong>Confidencialidad</strong>:</h2>
<p style="text-align: left;">La confidencialidad de la información es un tema que tenemos que tener muy presente ya que cada vez que enviamos información por la red estamos exponiéndola a que otras personas no autorizadas puedan interceptarlas y hacer con ellas mucho daño.</p>
<figure id="attachment_511" aria-describedby="caption-attachment-511" style="width: 482px" class="wp-caption aligncenter"><a href="http://www.oscarblancarteblog.com/wp-content/uploads/2015/02/sendmessage.png"><img loading="lazy" class="wp-image-511" title="Integridad y autenticidad en mensajes" src="http://www.oscarblancarteblog.com/wp-content/uploads/2015/02/sendmessage.png?w=300" alt="Integridad y autenticidad en mensajes" width="482" height="82" /></a><figcaption id="caption-attachment-511" class="wp-caption-text">Fig.1: En la imagen podemos apreciar un envío típico de mensajes donde el mensaje llega perfectamente del punta A al punto B.</figcaption></figure>
<p>En la imagen anterior podemos ver que un mensaje es enviado de un punto A a un punto B, sin embargo el mensaje no se encuentra cifrado ni se envía por un canal seguro, por lo que podrías ser fácilmente interceptado por una tercera persona.</p>
<figure id="attachment_510" aria-describedby="caption-attachment-510" style="width: 480px" class="wp-caption aligncenter"><a href="http://www.oscarblancarteblog.com/wp-content/uploads/2015/02/interceptmessage.png"><img loading="lazy" class="wp-image-510" src="http://www.oscarblancarteblog.com/wp-content/uploads/2015/02/interceptmessage.png?w=300" alt="Integridad y autenticidad en mensajes" width="480" height="187" /></a><figcaption id="caption-attachment-510" class="wp-caption-text">Fig.2: En la imagen se aprecia como una tercera persona intercepta el mensaje.</figcaption></figure>
<p style="text-align: left;">Esta tercera persona podría tener solo curiosidad de ver que hay en el mensaje o podría estar intencionalmente interceptando estos mensajes para hacernos algún daño, en este punto ya hemos perdido la confidencialidad de los datos ya que esta persona ha podido ver la información que hemos enviado.</p>
<p style="text-align: left;">Una de las forma de evitar esto es enviar el mensaje por un canal seguro como https o SSL lo cual hace que nuestro mensaje vaya cifrado desde que sale de nuestro servidor hasta que llega al servidor destino, de esta forma es mucho mas difícil que nuestro intruso pueda recuperar el mensaje original y revelar la información que este contiene.</p>
<figure id="attachment_507" aria-describedby="caption-attachment-507" style="width: 458px" class="wp-caption aligncenter"><a href="http://www.oscarblancarteblog.com/wp-content/uploads/2015/02/failintercept.png"><img loading="lazy" class="wp-image-507" src="http://www.oscarblancarteblog.com/wp-content/uploads/2015/02/failintercept.png?w=300" alt="Integridad y autenticidad en mensajes" width="458" height="165" /></a><figcaption id="caption-attachment-507" class="wp-caption-text">Fig.3: Un mensaje es enviado por un canal seguro, evitando de esta forma que el intruso pueda revelar la información del mensaje.</figcaption></figure>
<p style="text-align: left;">Como podemos apreciar en la imagen, nuestro intruso recibe una copia del mensaje cifrado por lo que sera prácticamente imposible que descifre su contenido.</p>
<p style="text-align: left;">Otra alternativa es cifrar el contenido del mensaje y enviar el mensaje por un canal seguro como en el punto anterior, esto nos garantiza tener una seguridad mucho mas fuerte ya que si el intruso logra por alguna razón descifrar el mensaje del canal seguro se presentara con el problema de que el mensaje descifrado esta nuevamente cifrado pero esta vez a nivel del contenido.</p>
<figure id="attachment_512" aria-describedby="caption-attachment-512" style="width: 494px" class="wp-caption aligncenter"><a href="http://www.oscarblancarteblog.com/wp-content/uploads/2015/02/trustmessage.png"><img loading="lazy" class="wp-image-512" src="http://www.oscarblancarteblog.com/wp-content/uploads/2015/02/trustmessage.png?w=300" alt="Integridad y autenticidad en mensajes" width="494" height="181" /></a><figcaption id="caption-attachment-512" class="wp-caption-text">Fig. 4: Un intruso logra descifrar el mensaje por el canal seguro, sin embargo se encuentra con que el mensaje aun esta cifrado.</figcaption></figure>
<p>Existen distintos mecanismos de cifrado que nos permitirá enviar mensaje cifrados de un punto a otro y tener la capacidad de descifrar nuevamente el mensaje una vez que llegue a su destino, uno de los algoritmos de cifrado mas utilizados es <a title="RSA" href="http://es.wikipedia.org/wiki/RSA" target="_blank">RSA</a>.</p>
<h2><strong>Autenticidad</strong>:</h2>
<p style="text-align: left;">La autenticidad es algo muy serio cuando hablamos de mensajes ya que de esta forma certificamos que la persona que nos envió el mensaje no es un impostor que se hace pasar por otra entidad. Este tipo de escenarios es muy común cuando nuestro impostor trata de hacer algún daño a nuestros sistemas enviando mensajes para realizar ciertas tareas en nombre de otra entidad.</p>
<p style="text-align: left;">Para prevenir este tipo de ataque es importante que las dos partes sea identificadas antes de que un mensaje sea enviado, para esto se utilizan un intercambio de llaves, son creadas dos llaves, una publica y una privada, la privada nos servirá para cifrar los mensajes, la publica nos servirá para descifrar el mensaje  y validar que el mensaje enviado aya sido enviado por la persona que tiene la llave privada.</p>
<p style="text-align: left;">De esta forma, cuando un mensaje sea enviado de un punto A a un punto B, el punto A enviara el mensaje cifrado con la llave secreta y lo enviara al punto B, el punto B descifrara el mensaje enviado por A y validara que el mensaje fue enviado por A.</p>
<figure id="attachment_514" aria-describedby="caption-attachment-514" style="width: 458px" class="wp-caption aligncenter"><a href="http://www.oscarblancarteblog.com/wp-content/uploads/2015/02/keyinterchange.png"><img loading="lazy" class="  wp-image-514" src="http://www.oscarblancarteblog.com/wp-content/uploads/2015/02/keyinterchange.png?w=300" alt="Integridad y autenticidad en mensajes" width="458" height="371" /></a><figcaption id="caption-attachment-514" class="wp-caption-text">Fig. 5: Proceso de intercambio de llaves y envió de mensajes fácilmente autenticables.</figcaption></figure>
<p style="text-align: left;">En la imagen podemos apreciar el proceso por el cual un punto A y un Punto B hacen un intercambio de llaves, los pasos son los siguientes:</p>
<ol>
<li style="text-align: left;">El servidor A crea un par de llaves, una publica y una privada, la privada se la quedara el y sera el único que sepa de la existencia de esta llave, la publica por otra parte es enviada al punto B con el fin de que este sea capas de descifrar los mensajes que vienen de A y a si asegurarse de que A fue el que realmente envió el mensaje.</li>
<li style="text-align: left;">El servidor A envía un mensaje B y lo cifra con la llave privada que creo en el primer paso.</li>
<li style="text-align: left;">B recibe el mensaje y utiliza la llave publica para descifrar el mensaje.</li>
<li style="text-align: left;">Mediante el proceso de descifrado el servidor B puedo estar seguro de que A fue quien realmente envió el mensaje.</li>
</ol>
<h2 style="text-align: left;"><strong>Integridad:</strong></h2>
<p style="text-align: left;">La integridad por otra parte tiene como objetivo identificar que un mensaje no ha sido manipulado por una tercera persona con el fin de realizar alguna acción en nuestro nombre.</p>
<p style="text-align: left;">Existe el escenario en que el intruso logra descifrar el mensaje no solo con el fin de conocer su contenido, si no que a demás esta interesado en hacer algún daño haciéndose pasar por otra nosotros y enviar el mensaje que ha capturado pero haciéndole algunas modificaciones adicionales con el fin de provocar mas daño.</p>
<figure id="attachment_506" aria-describedby="caption-attachment-506" style="width: 465px" class="wp-caption aligncenter"><a href="http://www.oscarblancarteblog.com/wp-content/uploads/2015/02/decriptsendmessage.png"><img loading="lazy" class="wp-image-506" src="http://www.oscarblancarteblog.com/wp-content/uploads/2015/02/decriptsendmessage.png?w=300" alt="Integridad y autenticidad en mensajes" width="465" height="169" /></a><figcaption id="caption-attachment-506" class="wp-caption-text">Fig. 6: El mensaje original es interceptado,alterado y enviado de nuevo al destinatario.</figcaption></figure>
<p style="text-align: left;">En la imagen vemos como nuestro impostor no solo intercepto nuestro mensaje si no que a demás creo un mensaje nuevo basado en el mensaje capturado para enviarlo al destinatario haciéndose pasar por el remitente original. Este nuevo mensaje llegara al destinatario y este pensara que fue enviado por nosotros, esto llevara a que el mensaje sea procesado por el destinatario realizando todos los cambios que este demande.</p>
<p style="text-align: left;">Para evitar este tipo de problemas es necesario incrustar un sello electrónico dentro del mensaje, este sello es creado combinando la totalidad del mensaje o una parte significativa en una cadena la cual deberá ser pasado por un algoritmo de digestión como <a title="MD5" href="http://es.wikipedia.org/wiki/MD5" target="_blank">MD5</a>, <a title="SHA-1" href="http://en.wikipedia.org/wiki/SHA-1" target="_blank">SHA-1</a>, <a title="SHA-2" href="http://es.wikipedia.org/wiki/SHA-2" target="_blank">SHA-2</a> con el fin de crear una cadena mucho mas reducida, esta cadena deberá ser cifrada mediante un certificado de sello digital.</p>
<figure id="attachment_522" aria-describedby="caption-attachment-522" style="width: 646px" class="wp-caption aligncenter"><a href="http://www.oscarblancarteblog.com/wp-content/uploads/2015/02/sellodigital.png"><img loading="lazy" class="  wp-image-522" src="http://www.oscarblancarteblog.com/wp-content/uploads/2015/02/sellodigital.png?w=300" alt="Integridad y autenticidad en mensajes" width="646" height="239" /></a><figcaption id="caption-attachment-522" class="wp-caption-text">Fig. 7: Mensaje completo(XML), debajo tenemos la cadena original y al final la cadena tras pasar por MD5.</figcaption></figure>
<p style="text-align: left;">En la imagen podemos ver un ejemplo de un mensaje en XML el cual tiene datos de los clientes, debajo tenemos la cadena original generada a partir del la información del mensaje, notemos que no utilizamos todo el mensaje si no solo sus datos, y al final tenemos la cadena original tras pasar por el proceso de digestión MD5, en este punto solo nos quedara hacer el cifrado de la cadena mediante nuestro certificado de sello digital para tener un verdadero sello digital que garantice la integridad del mensaje.</p>
<p style="text-align: left;">Finalmente nuestro mensaje quedaría de la siguiente manera:</p>
<figure id="attachment_525" aria-describedby="caption-attachment-525" style="width: 651px" class="wp-caption aligncenter"><a href="http://www.oscarblancarteblog.com/wp-content/uploads/2015/02/mensajesellodigital.png"><img loading="lazy" class="wp-image-525" src="http://www.oscarblancarteblog.com/wp-content/uploads/2015/02/mensajesellodigital.png?w=300" alt="Integridad y autenticidad en mensajes" width="651" height="128" /></a><figcaption id="caption-attachment-525" class="wp-caption-text">Fig. 8: Muestra un mensaje con sello digital y cadena original para poder validar la integridad del mensaje</figcaption></figure>
<p style="text-align: left;">Cuando el destinatario tome el mensaje, validara que la cadena fue generada con la misma información que contiene el documento. Si un impostor altera el contenido del mensaje no tendrá las llaves para crear el sello electrónico valido, por lo que el destinatario sabrá de inmediato que el mensaje ha sido alterado y su integridad ha sido violada.</p>
<figure id="attachment_505" aria-describedby="caption-attachment-505" style="width: 526px" class="wp-caption aligncenter"><a href="http://www.oscarblancarteblog.com/wp-content/uploads/2015/02/certmessagefail.png"><img loading="lazy" class="wp-image-505" title="Integridad y autenticidad en mensajes" src="http://www.oscarblancarteblog.com/wp-content/uploads/2015/02/certmessagefail.png?w=300" alt="Integridad y autenticidad en mensajes" width="526" height="163" /></a><figcaption id="caption-attachment-505" class="wp-caption-text">Fig.8: Un segundo mensaje invalido es enviado por el impostor.</figcaption></figure>
<p style="text-align: left;">En la imagen podemos apreciar como el mensaje original llega al punto B y este de inmediato valida que el sello digital corresponde con la información enviada, por otra parte el intruso crea un nuevo mensaje alterando el contenido del mensaje original, sin embargo, el nuevo mensaje seguirá teniendo el sello original ya que el intruso no tendrá los certificados para crear un nuevo sello basado en la información que altero, El server B detectará esta irregularidad y de inmediato rechazará el mensaje.</p>
<h2 style="text-align: left;"><strong>Conclusión</strong>.</h2>
<p style="text-align: left;">Como ves, existen muchos riesgos cuando de mandar mensaje se trata, por lo que es importante determinar que nivel de seguridad debemos implementar al enviar nuestros mensajes, es por eso que es importante conocer los riesgos y saber las estrategias a tomar para prevenir este tipo de situaciones.</p>
<p style="text-align: left;">También es importante destacar que estas técnicas son perfectamente combinables para crear un envió mucho mas seguro, por lo que podríamos tener mensajes que contengan sello digital, se envíen cifrados y sobre un canal seguro. esto desde luego logra que nuestro mensaje sea Confidencial, Integro y sea Autentico.</p>
<p style="text-align: left;">Si te gusto este post no dudes en recomendarlo ya que esto me ayudara a seguir creando mas y mejor material.</p>
<p>The post <a rel="nofollow" href="https://www.oscarblancarteblog.com/2015/02/22/confidencialidad-integridad-y-autenticidad-en-mensajes/">Seguridad &#8211; Confidencialidad, Integridad y Autenticidad en mensajes</a> appeared first on <a rel="nofollow" href="https://www.oscarblancarteblog.com">Oscar Blancarte - Software Architecture</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.oscarblancarteblog.com/2015/02/22/confidencialidad-integridad-y-autenticidad-en-mensajes/feed/</wfw:commentRss>
			<slash:comments>11</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">504</post-id>	</item>
	</channel>
</rss>
