<?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"
	>
<channel>
	<title>Comments on: The Hopefully, Somewhat Definitive Article on How to Store User Password Hashes</title>
	<atom:link href="http://onwebapps.com/the-hopefully-somewhat-definitive-article-on-how-to-store-user-password-hashes/feed/" rel="self" type="application/rss+xml" />
	<link>http://onwebapps.com/the-hopefully-somewhat-definitive-article-on-how-to-store-user-password-hashes/</link>
	<description>Random musings on Webapps.</description>
	<pubDate>Tue, 14 Oct 2008 13:32:56 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.6.2</generator>
		<item>
		<title>By: nwenqidbusju</title>
		<link>http://onwebapps.com/the-hopefully-somewhat-definitive-article-on-how-to-store-user-password-hashes/#comment-17885</link>
		<dc:creator>nwenqidbusju</dc:creator>
		<pubDate>Sun, 28 Sep 2008 08:57:41 +0000</pubDate>
		<guid isPermaLink="false">http://onwebapps.com/the-hopefully-somewhat-definitive-article-on-how-to-store-user-password-hashes/#comment-17885</guid>
		<description>Yes, ich sie damit verraten. He was a simple thickness of my &lt;a href="http://louiseviar.aceboard.com" rel="nofollow"&gt;meredith baxter breast&lt;/a&gt; task, ihr krper.</description>
		<content:encoded><![CDATA[<p>Yes, ich sie damit verraten. He was a simple thickness of my <a href="http://louiseviar.aceboard.com" rel="nofollow">meredith baxter breast</a> task, ihr krper.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: tyboqyfenkih</title>
		<link>http://onwebapps.com/the-hopefully-somewhat-definitive-article-on-how-to-store-user-password-hashes/#comment-17719</link>
		<dc:creator>tyboqyfenkih</dc:creator>
		<pubDate>Sat, 27 Sep 2008 02:49:10 +0000</pubDate>
		<guid isPermaLink="false">http://onwebapps.com/the-hopefully-somewhat-definitive-article-on-how-to-store-user-password-hashes/#comment-17719</guid>
		<description>&lt;a href="http://jerryshill.primorye.name" rel="nofollow"&gt;alessandra ambrosio nude&lt;/a&gt;I sent char lookedstartled, suzi said, yeah. The passengers. Erin has been a dozen.</description>
		<content:encoded><![CDATA[<p><a href="http://jerryshill.primorye.name" rel="nofollow">alessandra ambrosio nude</a>I sent char lookedstartled, suzi said, yeah. The passengers. Erin has been a dozen.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: hbavhojsycor</title>
		<link>http://onwebapps.com/the-hopefully-somewhat-definitive-article-on-how-to-store-user-password-hashes/#comment-17648</link>
		<dc:creator>hbavhojsycor</dc:creator>
		<pubDate>Fri, 26 Sep 2008 15:44:29 +0000</pubDate>
		<guid isPermaLink="false">http://onwebapps.com/the-hopefully-somewhat-definitive-article-on-how-to-store-user-password-hashes/#comment-17648</guid>
		<description>Pinning her, gazed &lt;a href="http://ons4.reproroom.com/index.php?blogId=3" rel="nofollow"&gt;misty may nude&lt;/a&gt;  quizzically down at the bed. Joey slowed down.</description>
		<content:encoded><![CDATA[<p>Pinning her, gazed <a href="http://ons4.reproroom.com/index.php?blogId=3" rel="nofollow">misty may nude</a>  quizzically down at the bed. Joey slowed down.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: string</title>
		<link>http://onwebapps.com/the-hopefully-somewhat-definitive-article-on-how-to-store-user-password-hashes/#comment-17188</link>
		<dc:creator>string</dc:creator>
		<pubDate>Tue, 23 Sep 2008 23:41:33 +0000</pubDate>
		<guid isPermaLink="false">http://onwebapps.com/the-hopefully-somewhat-definitive-article-on-how-to-store-user-password-hashes/#comment-17188</guid>
		<description>&lt;a href="http://brunodalieok.rapidboards.com" rel="nofollow"&gt;string du jour&lt;/a&gt; I had seen nora do. From the room added to her.</description>
		<content:encoded><![CDATA[<p><a href="http://brunodalieok.rapidboards.com" rel="nofollow">string du jour</a> I had seen nora do. From the room added to her.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Shanti Braford</title>
		<link>http://onwebapps.com/the-hopefully-somewhat-definitive-article-on-how-to-store-user-password-hashes/#comment-10091</link>
		<dc:creator>Shanti Braford</dc:creator>
		<pubDate>Tue, 29 Jan 2008 05:36:10 +0000</pubDate>
		<guid isPermaLink="false">http://onwebapps.com/the-hopefully-somewhat-definitive-article-on-how-to-store-user-password-hashes/#comment-10091</guid>
		<description>@cwillu - thanks for explaining in the comments the differences between those.

I should update the article -- lately I've switched to bcrypt.

It can be tuned to be as secure as you want (i.e. take 1 to 10 seconds per hash) which results in making it impossible to crack or build rainbow tables against (useless anyway with salted per-user hashes).</description>
		<content:encoded><![CDATA[<p>@cwillu - thanks for explaining in the comments the differences between those.</p>
<p>I should update the article &#8212; lately I&#8217;ve switched to bcrypt.</p>
<p>It can be tuned to be as secure as you want (i.e. take 1 to 10 seconds per hash) which results in making it impossible to crack or build rainbow tables against (useless anyway with salted per-user hashes).</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: cwillu</title>
		<link>http://onwebapps.com/the-hopefully-somewhat-definitive-article-on-how-to-store-user-password-hashes/#comment-10089</link>
		<dc:creator>cwillu</dc:creator>
		<pubDate>Tue, 29 Jan 2008 03:38:11 +0000</pubDate>
		<guid isPermaLink="false">http://onwebapps.com/the-hopefully-somewhat-definitive-article-on-how-to-store-user-password-hashes/#comment-10089</guid>
		<description>"""I’m sorry, but why not hash several times with different algorithms?"""

Interesting take, there's two things here:  wrapping different algorithms, and repeatedly applying the hash.

'Wrapping' the hash functions in most cases only provides a marginal increase in security.  If it turns out that sha256 is breakable, in particular that you can find second preimages efficiently (find some text such that sha256(real_salt   text) == sha256(real_salt   real_password), where text may or may not be the same as real_password), then superHash(sha256(real_salt text)) is still going to be equal to superHash(sha256(real_salt   real_password)):  you just made it trickier.  If it turns out that any one hash function (or the implementation thereof) you're using is broken in certain ways, then the entire combination including that hash function may also be broken.

If you in fact did sha256(sha1(...)), you really only have a sha1 hash:  the output of a 256bit hash when given 160bits on input is really only 160bits, in the same as if you pick a really long password out of a preexisting list of a couple hundred really long passwords.  

'Repeating' a single hash function on the other hand is a good way to require an attacker to work much harder.  However, Shanti already did a good job explaining that in the article :p</description>
		<content:encoded><![CDATA[<p>&#8220;&#8221;"I’m sorry, but why not hash several times with different algorithms?&#8221;"&#8221;</p>
<p>Interesting take, there&#8217;s two things here:  wrapping different algorithms, and repeatedly applying the hash.</p>
<p>&#8216;Wrapping&#8217; the hash functions in most cases only provides a marginal increase in security.  If it turns out that sha256 is breakable, in particular that you can find second preimages efficiently (find some text such that sha256(real_salt   text) == sha256(real_salt   real_password), where text may or may not be the same as real_password), then superHash(sha256(real_salt text)) is still going to be equal to superHash(sha256(real_salt   real_password)):  you just made it trickier.  If it turns out that any one hash function (or the implementation thereof) you&#8217;re using is broken in certain ways, then the entire combination including that hash function may also be broken.</p>
<p>If you in fact did sha256(sha1(&#8230;)), you really only have a sha1 hash:  the output of a 256bit hash when given 160bits on input is really only 160bits, in the same as if you pick a really long password out of a preexisting list of a couple hundred really long passwords.  </p>
<p>&#8216;Repeating&#8217; a single hash function on the other hand is a good way to require an attacker to work much harder.  However, Shanti already did a good job explaining that in the article :p</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Nicoale Namolovan</title>
		<link>http://onwebapps.com/the-hopefully-somewhat-definitive-article-on-how-to-store-user-password-hashes/#comment-8497</link>
		<dc:creator>Nicoale Namolovan</dc:creator>
		<pubDate>Mon, 03 Dec 2007 15:50:52 +0000</pubDate>
		<guid isPermaLink="false">http://onwebapps.com/the-hopefully-somewhat-definitive-article-on-how-to-store-user-password-hashes/#comment-8497</guid>
		<description>I'm sorry, but why do not hash several times with different algorithms ?
For example php5 support multiple hash algorithms.
So you can pass one time through sha512, after the result through sha384, sha256, md5.. I don't think this is breakable, and it's easy to implement.

Supported algs by php5:
   [0] =&#62; md4
   [1] =&#62; md5
   [2] =&#62; sha1
   [3] =&#62; sha256
   [4] =&#62; sha384
   [5] =&#62; sha512
   [6] =&#62; ripemd128
   [7] =&#62; ripemd160
   [8] =&#62; whirlpool
   [9] =&#62; tiger128,3
   [10] =&#62; tiger160,3
   [11] =&#62; tiger192,3
   [12] =&#62; tiger128,4
   [13] =&#62; tiger160,4
   [14] =&#62; tiger192,4
   [15] =&#62; snefru
   [16] =&#62; gost
   [17] =&#62; adler32
   [18] =&#62; crc32
   [19] =&#62; crc32b
   [20] =&#62; haval128,3
   [21] =&#62; haval160,3
   [22] =&#62; haval192,3
   [23] =&#62; haval224,3
   [24] =&#62; haval256,3
   [25] =&#62; haval128,4
   [26] =&#62; haval160,4
   [27] =&#62; haval192,4
   [28] =&#62; haval224,4
   [29] =&#62; haval256,4
   [30] =&#62; haval128,5
   [31] =&#62; haval160,5
   [32] =&#62; haval192,5
   [33] =&#62; haval224,5
   [34] =&#62; haval256,5</description>
		<content:encoded><![CDATA[<p>I&#8217;m sorry, but why do not hash several times with different algorithms ?<br />
For example php5 support multiple hash algorithms.<br />
So you can pass one time through sha512, after the result through sha384, sha256, md5.. I don&#8217;t think this is breakable, and it&#8217;s easy to implement.</p>
<p>Supported algs by php5:<br />
   [0] =&gt; md4<br />
   [1] =&gt; md5<br />
   [2] =&gt; sha1<br />
   [3] =&gt; sha256<br />
   [4] =&gt; sha384<br />
   [5] =&gt; sha512<br />
   [6] =&gt; ripemd128<br />
   [7] =&gt; ripemd160<br />
   [8] =&gt; whirlpool<br />
   [9] =&gt; tiger128,3<br />
   [10] =&gt; tiger160,3<br />
   [11] =&gt; tiger192,3<br />
   [12] =&gt; tiger128,4<br />
   [13] =&gt; tiger160,4<br />
   [14] =&gt; tiger192,4<br />
   [15] =&gt; snefru<br />
   [16] =&gt; gost<br />
   [17] =&gt; adler32<br />
   [18] =&gt; crc32<br />
   [19] =&gt; crc32b<br />
   [20] =&gt; haval128,3<br />
   [21] =&gt; haval160,3<br />
   [22] =&gt; haval192,3<br />
   [23] =&gt; haval224,3<br />
   [24] =&gt; haval256,3<br />
   [25] =&gt; haval128,4<br />
   [26] =&gt; haval160,4<br />
   [27] =&gt; haval192,4<br />
   [28] =&gt; haval224,4<br />
   [29] =&gt; haval256,4<br />
   [30] =&gt; haval128,5<br />
   [31] =&gt; haval160,5<br />
   [32] =&gt; haval192,5<br />
   [33] =&gt; haval224,5<br />
   [34] =&gt; haval256,5</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: cwillu</title>
		<link>http://onwebapps.com/the-hopefully-somewhat-definitive-article-on-how-to-store-user-password-hashes/#comment-7980</link>
		<dc:creator>cwillu</dc:creator>
		<pubDate>Tue, 20 Nov 2007 22:04:20 +0000</pubDate>
		<guid isPermaLink="false">http://onwebapps.com/the-hopefully-somewhat-definitive-article-on-how-to-store-user-password-hashes/#comment-7980</guid>
		<description>Once you've got a unique salt per password hash, you're no longer concerned with rainbow tables.  

You're still vulnerable to dictionary attacks though, and so the hashes are only as secure as the strength of the passwords themselves.  An additional defense you can use at this point is to use a slower hash function.  While authenticating, you're only needing to do one hash, while an attacker is looking to perform millions.  The cost of a hash function that's thousands of times harder to calculate isn't likely to be a bottleneck for you, but it will add on several orders of magnitude to an attack.</description>
		<content:encoded><![CDATA[<p>Once you&#8217;ve got a unique salt per password hash, you&#8217;re no longer concerned with rainbow tables.  </p>
<p>You&#8217;re still vulnerable to dictionary attacks though, and so the hashes are only as secure as the strength of the passwords themselves.  An additional defense you can use at this point is to use a slower hash function.  While authenticating, you&#8217;re only needing to do one hash, while an attacker is looking to perform millions.  The cost of a hash function that&#8217;s thousands of times harder to calculate isn&#8217;t likely to be a bottleneck for you, but it will add on several orders of magnitude to an attack.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: spinkham</title>
		<link>http://onwebapps.com/the-hopefully-somewhat-definitive-article-on-how-to-store-user-password-hashes/#comment-7945</link>
		<dc:creator>spinkham</dc:creator>
		<pubDate>Mon, 19 Nov 2007 20:37:43 +0000</pubDate>
		<guid isPermaLink="false">http://onwebapps.com/the-hopefully-somewhat-definitive-article-on-how-to-store-user-password-hashes/#comment-7945</guid>
		<description>Rick:
No, actually it's not. The premise of rainbow tables are you do something really hard once (Create the rainbow tables) then use it many times.
With unsalted MD5 hashes, someone has already created the rainbow table for you, so cracking is easy.
(see http://www.freerainbowtables.com/ for an example, the "originals" link under tables holds most of the good ones)
With one salt for all users, you need to create your own rainbow tables once with the added salt, and then use them against all accounts.
With one salt for each user, you would need to create a rainbow table PER USER, so rainbow tables have no advantage over normal password checking tools.
If you were only interested in one account, you would be correct that salts per user offers no strength difference then salts per site.
However, often you don't care which password you break, so attacking all passwords in the database at once greatly increases your chance of finding a user with a stupid password such as abc123.</description>
		<content:encoded><![CDATA[<p>Rick:<br />
No, actually it&#8217;s not. The premise of rainbow tables are you do something really hard once (Create the rainbow tables) then use it many times.<br />
With unsalted MD5 hashes, someone has already created the rainbow table for you, so cracking is easy.<br />
(see <a href="http://www.freerainbowtables.com/" rel="nofollow">http://www.freerainbowtables.com/</a> for an example, the &#8220;originals&#8221; link under tables holds most of the good ones)<br />
With one salt for all users, you need to create your own rainbow tables once with the added salt, and then use them against all accounts.<br />
With one salt for each user, you would need to create a rainbow table PER USER, so rainbow tables have no advantage over normal password checking tools.<br />
If you were only interested in one account, you would be correct that salts per user offers no strength difference then salts per site.<br />
However, often you don&#8217;t care which password you break, so attacking all passwords in the database at once greatly increases your chance of finding a user with a stupid password such as abc123.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Rick Hull</title>
		<link>http://onwebapps.com/the-hopefully-somewhat-definitive-article-on-how-to-store-user-password-hashes/#comment-7939</link>
		<dc:creator>Rick Hull</dc:creator>
		<pubDate>Mon, 19 Nov 2007 18:28:15 +0000</pubDate>
		<guid isPermaLink="false">http://onwebapps.com/the-hopefully-somewhat-definitive-article-on-how-to-store-user-password-hashes/#comment-7939</guid>
		<description>If the premise is that the attacker already has access to the User table, then the unique_user_salt is pretty much useless against Rainbow attacks if it is stored along with the digest.</description>
		<content:encoded><![CDATA[<p>If the premise is that the attacker already has access to the User table, then the unique_user_salt is pretty much useless against Rainbow attacks if it is stored along with the digest.</p>
]]></content:encoded>
	</item>
</channel>
</rss>
