[Tutorial] How to salt passwords
#1

Introduction

In this tutorial I want to show you how to salt your passwords. You might think now: What is salting? Well it is actually quite simple. As you know: The hash of a password for a specific word is always the same. I want to give you a little example to explain this a little bit closer. In my case I am using the Whirlpool Plugin which can be downloaded here: https://sampforum.blast.hk/showthread.php?tid=65290

The hash of the word 'World' will always look like this:
Code:
377923742CCF58EB3B1765A9FC72E0D9F7BCC16D9A468FA4C083953506DFE03566D2D9179B86E07412A10B4D53FC7E9D9379B049EF30BB0B9BE1CF5D1BD22537
If somebody attacked your server now this person would be able to use a so called lookup table (or rainbow table). These tables basically contain all words from a dictionary in their hashed form. By using such a table they can crack your passwords quite easily. That's where salting comes in place.

This 'salt' is just a random string. There are however some points which are important for choosing a salt:
  • The longer the salt is, the better
  • Do NOT use the same salt for every password
  • Randomly generated salts would be the best choice

Coming back to the word 'World' from before, combined with a salt, the hashes would look like this:

Code:
Normal hash:
377923742CCF58EB3B1765A9FC72E0D9F7BCC16D9A468FA4C083953506DFE03566D2D9179B86E07412A10B4D53FC7E9D9379B049EF30BB0B9BE1CF5D1BD22537

Salted hash: 
E15DA50879CC1433DB63D7C5BC117A27D6626AD0A8F12687421A2BCEAD06FF860B7D2CDDA31DF44AF66A56CC8BE6B29C4CCBC02814303FAA3662E38D32CA2558

Salt:
bl4aEVF68q91j4LY3kQ6E5r4I8d933zJ071C61Y863Jb6a7c591O453K9Y66kq41
You will notice that the hashes are completely different, eventhough the word which got hashed was the same. Using a normal lookup table will now not help since the salt is totally random. This will force the person who attacks your server to create a new lookup table which requires quite some time.


Using Salted Hashes In Your Account System

It is really important that you store the salt in it's normal form (unhashed) in a player's account since you will need it when the player tries to login.


Registering:

You need to generate a random string for the salt. Then you want to combine the salt with your password (unhashed).

For a random string I used this function:

pawn Code:
// credits go to: RyDeR`
stock randomString(strDest[], strLen = 10)
{
    while(strLen--)
        strDest[strLen] = random(2) ? (random(26) + (random(2) ? 'a' : 'A')) : (random(10) + '0');
}
pawn Code:
new salt[64],string[128]; //declare some variables
randomString(salt,sizeof(salt)); //generate our 'salt'
//combine salt with password
strcat(string,salt); //your salt
strcat(string,"World"); //your password
It would be the best if your salt had the same lenght as the hashed password (output of the hash function), but 64 signs fits quite well I think.

Now we just need to hash the final string:

pawn Code:
WP_Hash(buf, sizeof(buf),string);
You can actually use any hash function for this. I will not closer explain how to use Whirlpool; you can read this up in the topic for it. Now we just have to save the hash + the salt in the player's account, like this:

pawn Code:
dini_Set("account.ini","Password", buf);
dini_Set("account.ini","Salt",salt);
Again it does not matter at all which way to save accounts you use. It is just important that you can always get the salt from the account. Remember: The salt does NOT need to be secret.


Login:

You just have to combine the password (again unhashed) with the salt which is stored in the account. Then hash the final string and compare it with the hashed password which is stored in the player's account (salted).
Reply


Messages In This Thread
How to salt passwords - by Giovanni - 13.06.2012, 12:25
Re: How to salt passwords - by Jonny5 - 13.06.2012, 12:37
Re: How to salt passwords - by Niko_boy - 14.06.2012, 08:02
Re: How to salt passwords - by Infinity - 14.06.2012, 08:24
AW: How to salt passwords - by Extremo - 14.06.2012, 09:05
Re: How to salt passwords - by Calgon - 14.06.2012, 09:08
AW: Re: How to salt passwords - by Extremo - 14.06.2012, 09:21
Re: AW: Re: How to salt passwords - by Calgon - 14.06.2012, 09:57
AW: Re: AW: Re: How to salt passwords - by Extremo - 14.06.2012, 11:27
Re: How to salt passwords - by iggy1 - 14.06.2012, 12:06

Forum Jump:


Users browsing this thread: 1 Guest(s)