<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	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/"
		>
<channel>
	<title>Comments on: Cómo proteger las contraseñas de los usuarios</title>
	<atom:link href="http://blog.4bits.es/como-proteger-las-contrasenas-de-los-usuarios/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.4bits.es/como-proteger-las-contrasenas-de-los-usuarios/</link>
	<description>Ahora en 16 colores</description>
	<lastBuildDate>Wed, 01 Sep 2010 03:20:45 +0000</lastBuildDate>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
	<item>
		<title>By: Tutor Dk</title>
		<link>http://blog.4bits.es/como-proteger-las-contrasenas-de-los-usuarios/#comment-594</link>
		<dc:creator>Tutor Dk</dc:creator>
		<pubDate>Fri, 16 Apr 2010 11:30:12 +0000</pubDate>
		<guid isPermaLink="false">http://blog.4bits.es/?p=396#comment-594</guid>
		<description>Me quedao flipao con los comentarios!

Que cracks! jajaj

Un saludo!</description>
		<content:encoded><![CDATA[<p>Me quedao flipao con los comentarios!</p>
<p>Que cracks! jajaj</p>
<p>Un saludo!</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Fran</title>
		<link>http://blog.4bits.es/como-proteger-las-contrasenas-de-los-usuarios/#comment-459</link>
		<dc:creator>Fran</dc:creator>
		<pubDate>Wed, 25 Nov 2009 12:45:11 +0000</pubDate>
		<guid isPermaLink="false">http://blog.4bits.es/?p=396#comment-459</guid>
		<description>Al respecto de todo este tema, he hecho un par de búsquedas rápidas y he visto que varios entornos realizan iteraciones sobre los &lt;em&gt;hashes&lt;/em&gt;. Por ejemplo: en el &lt;a href=&quot;http://api.drupal.org/api/drupal/includes--password.inc/7/source&quot; rel=&quot;nofollow&quot;&gt;password.inc de Drupal&lt;/a&gt; y/o en &lt;a href=&quot;http://shervinasgari.blogspot.com/2009/06/iteration-on-password-is-added-in-jboss.html&quot; rel=&quot;nofollow&quot;&gt;JBoss Seam&lt;/a&gt;.

Supongo que habrá muchos más, por lo que he leído casi todo el mundo se basa en el estándar PKCS #5 que ha mencionado &lt;strong&gt;Daniel&lt;/strong&gt;.</description>
		<content:encoded><![CDATA[<p>Al respecto de todo este tema, he hecho un par de búsquedas rápidas y he visto que varios entornos realizan iteraciones sobre los <em>hashes</em>. Por ejemplo: en el <a href="http://api.drupal.org/api/drupal/includes--password.inc/7/source" rel="nofollow">password.inc de Drupal</a> y/o en <a href="http://shervinasgari.blogspot.com/2009/06/iteration-on-password-is-added-in-jboss.html" rel="nofollow">JBoss Seam</a>.</p>
<p>Supongo que habrá muchos más, por lo que he leído casi todo el mundo se basa en el estándar PKCS #5 que ha mencionado <strong>Daniel</strong>.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Lek</title>
		<link>http://blog.4bits.es/como-proteger-las-contrasenas-de-los-usuarios/#comment-458</link>
		<dc:creator>Lek</dc:creator>
		<pubDate>Wed, 25 Nov 2009 11:57:29 +0000</pubDate>
		<guid isPermaLink="false">http://blog.4bits.es/?p=396#comment-458</guid>
		<description>Correcto, &lt;b&gt;Fran&lt;/b&gt;, mi cerebro ignoró la parte &quot;a sus propios resultados&quot;...</description>
		<content:encoded><![CDATA[<p>Correcto, <b>Fran</b>, mi cerebro ignoró la parte &#8220;a sus propios resultados&#8221;&#8230;</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Daniel Fernández</title>
		<link>http://blog.4bits.es/como-proteger-las-contrasenas-de-los-usuarios/#comment-457</link>
		<dc:creator>Daniel Fernández</dc:creator>
		<pubDate>Wed, 25 Nov 2009 11:45:13 +0000</pubDate>
		<guid isPermaLink="false">http://blog.4bits.es/?p=396#comment-457</guid>
		<description>Hola castarco, 

Entiendo tu razonamiento, pero se basa en que la función hash no distribuya uniformemente sus resultados a lo largo de su espacio de posibles salidas, esto es, que no sea inyectiva (lo que se denomina una &quot;función hash perfecta&quot;). Inyectiva quiere decir que aunque su entrada sea del mismo tamaño que su salida (que es el caso que tenemos a partir de la segunda iteración), dará un valor de salida diferente para cada valor de entrada diferente. 

Por supuesto no contamos con el caso en que la entrada es más pequeña que la salida (por ejemplo, una password de 2 caracteres), porque en ese caso claramente la función hash no tiene nada que hacer ya que el espacio de entradas nunca podrá cubrir todo el espacio de salidas posible.

Aunque obviamente no todas las funciones hash son inyectivas (hay funciones hash para dar y tomar), algunas sí. Y desde luego las criptográficas tienen como una de sus misiones &quot;aspirar&quot; a serlo (aunque teóricamente deberían serlo todas si fuesen, eso, &quot;perfectas&quot;).

¡Ajá! dirás, ¡así que reconoces que aunque en teoría lo sean, en la práctica no son inyectivas y que por tanto tengo razón! pues no :-). En la práctica, la &quot;no inyectividad&quot; de estas funciones es absolutamente mínima (y despreciable), y la pérdida de espacio de salidas que provoquemos iterando la función 1000 veces (que, repito, es lo que recomienda RSA para crear claves de cifrado a partir de passwords textuales) compensa más que sobradamente la diferencia en complejidad computacional de aplicar la función esa cantidad de veces.

Un saludo.</description>
		<content:encoded><![CDATA[<p>Hola castarco, </p>
<p>Entiendo tu razonamiento, pero se basa en que la función hash no distribuya uniformemente sus resultados a lo largo de su espacio de posibles salidas, esto es, que no sea inyectiva (lo que se denomina una &#8220;función hash perfecta&#8221;). Inyectiva quiere decir que aunque su entrada sea del mismo tamaño que su salida (que es el caso que tenemos a partir de la segunda iteración), dará un valor de salida diferente para cada valor de entrada diferente. </p>
<p>Por supuesto no contamos con el caso en que la entrada es más pequeña que la salida (por ejemplo, una password de 2 caracteres), porque en ese caso claramente la función hash no tiene nada que hacer ya que el espacio de entradas nunca podrá cubrir todo el espacio de salidas posible.</p>
<p>Aunque obviamente no todas las funciones hash son inyectivas (hay funciones hash para dar y tomar), algunas sí. Y desde luego las criptográficas tienen como una de sus misiones &#8220;aspirar&#8221; a serlo (aunque teóricamente deberían serlo todas si fuesen, eso, &#8220;perfectas&#8221;).</p>
<p>¡Ajá! dirás, ¡así que reconoces que aunque en teoría lo sean, en la práctica no son inyectivas y que por tanto tengo razón! pues no :-). En la práctica, la &#8220;no inyectividad&#8221; de estas funciones es absolutamente mínima (y despreciable), y la pérdida de espacio de salidas que provoquemos iterando la función 1000 veces (que, repito, es lo que recomienda RSA para crear claves de cifrado a partir de passwords textuales) compensa más que sobradamente la diferencia en complejidad computacional de aplicar la función esa cantidad de veces.</p>
<p>Un saludo.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: castarco</title>
		<link>http://blog.4bits.es/como-proteger-las-contrasenas-de-los-usuarios/#comment-456</link>
		<dc:creator>castarco</dc:creator>
		<pubDate>Wed, 25 Nov 2009 11:25:46 +0000</pubDate>
		<guid isPermaLink="false">http://blog.4bits.es/?p=396#comment-456</guid>
		<description>La reducción del conjunto imagen es una cosa clarísima, es un subconjunto del conjunto imagen para la función hash aplicada una sola vez, y aplicada tres veces el conjunto imagen se reduce aun más, por lo que a más iteraciones, más colisiones para el mismo conjunto de partida. El tamaño del hash puede ser el mismo tal y como dices, pero resulta que no todos los hash posibles se daran en la segunda iteración (algunos no serán alcanzables), y en la tercera iteración habrá menos hash alcanzables, y así hasta que nos quede un conjunto mínimo e irreductible en el que la función hash actue de forma biyectiva.

Por otro lado, la única forma de que no pasara lo que describo sería haciendo que la funcion hash actuara de forma biyectiva si se restringe a su conjunto imagen, es decir, si es un automorfismo sobre su conjunto imagen. El hecho de que sea un automorfismo sobre su conjunto imagen, puede, a su vez, reducir aun más la dificultad de encontrar contraimágenes y reducir consecuentemente la seguridad de la función hash, por lo que la composición iterada no es más segura. Sólo es más segura desde el punto de vista intelectual, pues la simplificación de los cálculos puede resultar muy compleja... aunque solo se tiene que hacer una sola vez, y funcionará para siempre. Que no se haya simplificado nunca la composición de funciones hash no significa que sea imposible.. y una vez hecha no se tiene que volver a hacer nunca más para ningún otro ataque.</description>
		<content:encoded><![CDATA[<p>La reducción del conjunto imagen es una cosa clarísima, es un subconjunto del conjunto imagen para la función hash aplicada una sola vez, y aplicada tres veces el conjunto imagen se reduce aun más, por lo que a más iteraciones, más colisiones para el mismo conjunto de partida. El tamaño del hash puede ser el mismo tal y como dices, pero resulta que no todos los hash posibles se daran en la segunda iteración (algunos no serán alcanzables), y en la tercera iteración habrá menos hash alcanzables, y así hasta que nos quede un conjunto mínimo e irreductible en el que la función hash actue de forma biyectiva.</p>
<p>Por otro lado, la única forma de que no pasara lo que describo sería haciendo que la funcion hash actuara de forma biyectiva si se restringe a su conjunto imagen, es decir, si es un automorfismo sobre su conjunto imagen. El hecho de que sea un automorfismo sobre su conjunto imagen, puede, a su vez, reducir aun más la dificultad de encontrar contraimágenes y reducir consecuentemente la seguridad de la función hash, por lo que la composición iterada no es más segura. Sólo es más segura desde el punto de vista intelectual, pues la simplificación de los cálculos puede resultar muy compleja&#8230; aunque solo se tiene que hacer una sola vez, y funcionará para siempre. Que no se haya simplificado nunca la composición de funciones hash no significa que sea imposible.. y una vez hecha no se tiene que volver a hacer nunca más para ningún otro ataque.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Daniel Fernández</title>
		<link>http://blog.4bits.es/como-proteger-las-contrasenas-de-los-usuarios/#comment-455</link>
		<dc:creator>Daniel Fernández</dc:creator>
		<pubDate>Wed, 25 Nov 2009 11:08:15 +0000</pubDate>
		<guid isPermaLink="false">http://blog.4bits.es/?p=396#comment-455</guid>
		<description>Hola,

Quisiera aclarar que la teoría de que la iteración en el hashing reduzca el nivel de seguridad es incorrecta, aunque sí es cierto que causa cierta discusión en muchos foros. Y me explico:

1. Una función de hash da como resultado una determinada cantidad fija de bytes, por ejemplo, 64. Y los resultados de esa función de hash se supone que están uniformemente distribuidos entre los posibles valores de esos 64 bytes.

2. El hecho de que el tamaño del resultado sea &quot;x&quot;, significa que tenemos unas probabilidades &quot;y&quot; de que tengamos una colisión entre dos entradas a la función de hash. Y ese &quot;y&quot; depende directamente de &quot;x&quot;: a más tamaño, menos probabilidades (siempre que la función hash esté bien hecha y distribuya uniformemente sus resultados, claro).

3. Si aplicamos la función hash una segunda vez, el resultado seguirán siendo &quot;x&quot; bytes, exactamente el mismo tamaño,  y por tanto la probabilidad de colisión seguirá siendo &quot;y&quot;.

Esto significa que &quot;a igual número de iteraciones hash&quot;, la probabilidad de colisión es la misma se aplique la función hash 1 ó 100 veces.

Obviamente, si yo tengo que romper una clave que se iteró 100 veces, y para considerar mis posibilidades de encontrar una colisión considero las posibilidades que tengo de conseguir el mismo hash después de iterar 1, 2, 3, 4, ... hasta 100 veces, entonces sí tengo una probabilidad muchísimo mayor, claro está. Porque para una entrada no estoy considerando una salida, sino 100 (una para cada número de iteraciones).

Pero es que esto último no vale. Porque para &quot;romper&quot; una clave, necesito una entrada que me dé exactamente el mismo resultado hash después de que la aplicación lo haya procesado para compararlo con la clave almacenada. Y si esta aplicación itera la función de hash 100 veces, sólo me valen las colisiones a exactamente 100 iteraciones, no a 1, ni 2, ni 3... ni 99.

De modo que no, iterar la función hash no disminuye la seguridad ni la aumenta si sólo consideramos las probabilidades de colisión, pero aumenta la seguridad de la aplicación porque aplicar una función hash es computacionalmente complejo, y esto hace que cualquier ataque por fuerza bruta requiera muchísimo (realmente muchísimo) más tiempo de computación para romper una clave iterada 100 veces que una clave iterada sólo una vez.

Como fundamento de lo que digo, os recomiendo que leáis el estándar PKCS #5 publicado por RSA sobre Password-Based Encryption, en el que, en el apartado donde habla de cómo generar claves de cifrado desde passwords textuales (lo que se hace siempre mediante la aplicación de un hash), explica por qué se aplica una iteración de la función Hash (apartado 4.2 de la versión 2.1 del estándar).</description>
		<content:encoded><![CDATA[<p>Hola,</p>
<p>Quisiera aclarar que la teoría de que la iteración en el hashing reduzca el nivel de seguridad es incorrecta, aunque sí es cierto que causa cierta discusión en muchos foros. Y me explico:</p>
<p>1. Una función de hash da como resultado una determinada cantidad fija de bytes, por ejemplo, 64. Y los resultados de esa función de hash se supone que están uniformemente distribuidos entre los posibles valores de esos 64 bytes.</p>
<p>2. El hecho de que el tamaño del resultado sea &#8220;x&#8221;, significa que tenemos unas probabilidades &#8220;y&#8221; de que tengamos una colisión entre dos entradas a la función de hash. Y ese &#8220;y&#8221; depende directamente de &#8220;x&#8221;: a más tamaño, menos probabilidades (siempre que la función hash esté bien hecha y distribuya uniformemente sus resultados, claro).</p>
<p>3. Si aplicamos la función hash una segunda vez, el resultado seguirán siendo &#8220;x&#8221; bytes, exactamente el mismo tamaño,  y por tanto la probabilidad de colisión seguirá siendo &#8220;y&#8221;.</p>
<p>Esto significa que &#8220;a igual número de iteraciones hash&#8221;, la probabilidad de colisión es la misma se aplique la función hash 1 ó 100 veces.</p>
<p>Obviamente, si yo tengo que romper una clave que se iteró 100 veces, y para considerar mis posibilidades de encontrar una colisión considero las posibilidades que tengo de conseguir el mismo hash después de iterar 1, 2, 3, 4, &#8230; hasta 100 veces, entonces sí tengo una probabilidad muchísimo mayor, claro está. Porque para una entrada no estoy considerando una salida, sino 100 (una para cada número de iteraciones).</p>
<p>Pero es que esto último no vale. Porque para &#8220;romper&#8221; una clave, necesito una entrada que me dé exactamente el mismo resultado hash después de que la aplicación lo haya procesado para compararlo con la clave almacenada. Y si esta aplicación itera la función de hash 100 veces, sólo me valen las colisiones a exactamente 100 iteraciones, no a 1, ni 2, ni 3&#8230; ni 99.</p>
<p>De modo que no, iterar la función hash no disminuye la seguridad ni la aumenta si sólo consideramos las probabilidades de colisión, pero aumenta la seguridad de la aplicación porque aplicar una función hash es computacionalmente complejo, y esto hace que cualquier ataque por fuerza bruta requiera muchísimo (realmente muchísimo) más tiempo de computación para romper una clave iterada 100 veces que una clave iterada sólo una vez.</p>
<p>Como fundamento de lo que digo, os recomiendo que leáis el estándar PKCS #5 publicado por RSA sobre Password-Based Encryption, en el que, en el apartado donde habla de cómo generar claves de cifrado desde passwords textuales (lo que se hace siempre mediante la aplicación de un hash), explica por qué se aplica una iteración de la función Hash (apartado 4.2 de la versión 2.1 del estándar).</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: castarco</title>
		<link>http://blog.4bits.es/como-proteger-las-contrasenas-de-los-usuarios/#comment-454</link>
		<dc:creator>castarco</dc:creator>
		<pubDate>Wed, 25 Nov 2009 11:03:06 +0000</pubDate>
		<guid isPermaLink="false">http://blog.4bits.es/?p=396#comment-454</guid>
		<description>Perdon por lo de &quot;las 200 veces concatenadas&quot; xD, me he expresado como un libro cerrado.

Me refería a que si se aplica reiteradamente una función hash sobre un dato esto no tiene porqué traducirse en tiempos muchos más altos para realizar el cómputo, pues conociendo el código y los fundamentos matemáticos de ésta, se puede &quot;simplificar&quot; el código para que con muchas menos instrucciones realice un cálculo equivalente a la composición reiterada de la función (si el numero de interaciones es conocido y fijo, en todo caso, incluso siendo variable se pueden hacer diversas simplificaciones que ayuden en la reducción de tiempos).</description>
		<content:encoded><![CDATA[<p>Perdon por lo de &#8220;las 200 veces concatenadas&#8221; xD, me he expresado como un libro cerrado.</p>
<p>Me refería a que si se aplica reiteradamente una función hash sobre un dato esto no tiene porqué traducirse en tiempos muchos más altos para realizar el cómputo, pues conociendo el código y los fundamentos matemáticos de ésta, se puede &#8220;simplificar&#8221; el código para que con muchas menos instrucciones realice un cálculo equivalente a la composición reiterada de la función (si el numero de interaciones es conocido y fijo, en todo caso, incluso siendo variable se pueden hacer diversas simplificaciones que ayuden en la reducción de tiempos).</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Fran</title>
		<link>http://blog.4bits.es/como-proteger-las-contrasenas-de-los-usuarios/#comment-453</link>
		<dc:creator>Fran</dc:creator>
		<pubDate>Wed, 25 Nov 2009 10:54:18 +0000</pubDate>
		<guid isPermaLink="false">http://blog.4bits.es/?p=396#comment-453</guid>
		<description>&lt;strong&gt;Lek&lt;/strong&gt; pues lo has entendido mal, mira el artículo original que tiene un dibujo muy majo explicándolo.</description>
		<content:encoded><![CDATA[<p><strong>Lek</strong> pues lo has entendido mal, mira el artículo original que tiene un dibujo muy majo explicándolo.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Lek</title>
		<link>http://blog.4bits.es/como-proteger-las-contrasenas-de-los-usuarios/#comment-452</link>
		<dc:creator>Lek</dc:creator>
		<pubDate>Wed, 25 Nov 2009 10:51:25 +0000</pubDate>
		<guid isPermaLink="false">http://blog.4bits.es/?p=396#comment-452</guid>
		<description>&lt;b&gt;Castarco&lt;/b&gt;, lo que yo he entendido de ejecutar el hash 1000 veces es aplicarlo... sobre la misma cadena inicial. Es decir, no se reduce la seguridad, simplemente se aumenta artificialmente el tiempo de respuesta al realizar ejecuciones &quot;de más&quot;.

Efectivamente, no aumenta la seguridad, porque el resultado ha de ser las 1000 veces el mismo, sólo aumenta el tiempo de respuesta. Y ese tiempo, que para una petición es prácticamente inapreciable, puede ser determinante para que un bot que esté &quot;probando suerte&quot; tarde meses &quot;de más&quot; en dar con la contraseña. Así lo he entendido yo, vamos...</description>
		<content:encoded><![CDATA[<p><b>Castarco</b>, lo que yo he entendido de ejecutar el hash 1000 veces es aplicarlo&#8230; sobre la misma cadena inicial. Es decir, no se reduce la seguridad, simplemente se aumenta artificialmente el tiempo de respuesta al realizar ejecuciones &#8220;de más&#8221;.</p>
<p>Efectivamente, no aumenta la seguridad, porque el resultado ha de ser las 1000 veces el mismo, sólo aumenta el tiempo de respuesta. Y ese tiempo, que para una petición es prácticamente inapreciable, puede ser determinante para que un bot que esté &#8220;probando suerte&#8221; tarde meses &#8220;de más&#8221; en dar con la contraseña. Así lo he entendido yo, vamos&#8230;</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Fran</title>
		<link>http://blog.4bits.es/como-proteger-las-contrasenas-de-los-usuarios/#comment-451</link>
		<dc:creator>Fran</dc:creator>
		<pubDate>Wed, 25 Nov 2009 10:48:47 +0000</pubDate>
		<guid isPermaLink="false">http://blog.4bits.es/?p=396#comment-451</guid>
		<description>&lt;strong&gt;castarco&lt;/strong&gt; no estoy muy puesto en el tema por lo que no me puedo posicionar sobre la validez de tu comentario, pero no puedo negar que tu explicación tiene cierta lógica. Como comenté al principio del post, esto no es más que una mera traducción, estaría encantado si &lt;strong&gt;Daniel&lt;/strong&gt; pudiera dar su opinión sobre tu comentario o sobre por qué él cree que sí es bueno realizar las iteraciones.

¡Ah! Tu último comentario no lo entiendo, ¿a qué te refieres con lo de las 200 veces concatenadas?</description>
		<content:encoded><![CDATA[<p><strong>castarco</strong> no estoy muy puesto en el tema por lo que no me puedo posicionar sobre la validez de tu comentario, pero no puedo negar que tu explicación tiene cierta lógica. Como comenté al principio del post, esto no es más que una mera traducción, estaría encantado si <strong>Daniel</strong> pudiera dar su opinión sobre tu comentario o sobre por qué él cree que sí es bueno realizar las iteraciones.</p>
<p>¡Ah! Tu último comentario no lo entiendo, ¿a qué te refieres con lo de las 200 veces concatenadas?</p>
]]></content:encoded>
	</item>
</channel>
</rss>
