It’s Here: PHP + Password + Salt Tutorial
Well, I’ve finally gotten to it! Here’s that long promised tutorial for you guys! I hope it helps. I won’t do a lot of explaining in the post seeing as most of it I think I made pretty clear in the code itself but I’ll explain the function of each document
I’ve also prepare the whole tutorial in a convenient download link for those who wish to just download it. This may be the most efficient way to look at the code until I fix the wordpress theme to actually include a worthwhile PHP code in post function XD. This looks ugly no doubt. So you can download that at:
PHP Password+Salt Encryption Tutorial – Files Download (Also will be provided at the end of the post!)
First, here’s the config.php. This basically starts our session (so users can log in – it’s the first file included in the operative page: only index so it carries over. Would also need to be the first file included in all other documents unless they begin with “session_start();” as well).
<?php
// Start our sessions
session_start();
// Just some definitions of DB info
define("DATABASE","YOUR_TABLE");
define("DBUSER","YOUR_USERNAME");
define("DBPASS","YOUR_PASSWORD");
define("DBHOST","localhost");
// Script security
define("IS_SCRIPT",true);
?>
Next, we have our index.php. No true functionality in this script, it’s basically just a simple file to make all the functions work.
<?php /** * Salt Encryption Tutorial by Dennis McWherter * * (C) 2009 Dennis McWherter. All Rights Reserved. * * This is where all of our functions are. Yes a lot of these * Some of this stuff is extra nonsense, but makes life a lot * more difficult for hackers. * */ require_once("config.php"); require_once("functions.php");$login = new Login;if(!isset($_GET['page'])){ $_GET['page'] = "index"; }switch($_GET['page']){ default: if(!$_SESSION['username']){print "<form name="login" method="post" action="?page=login"> <p>User: <input type="text" name="user" /></p> <p>Pass: <input type="password" name="pass" /></p> <p><input type="submit" value="login" /></p> <p>Register</p></form>"; exit; } else {print "Hello ".$_SESSION['username'].",<br /><br />Welcome to a random test site! <br /><br />Your password is safe here<br /><br />logout"; exit; } break; case 'register': if(!isset($_POST['user']) OR !isset($_POST['pass'])){ print "<p>All fields are required! (If they are not filled out, you will be returned to this page!)</p><br /><br />
<form name="reg" method="post" action="?page=register"> <p>User: <input type=text" name="user" /></p> <p>Pass: <input type="password" name="pass" /></p> <p><input type="submit" value="register" /></p> </form>"; exit;} else { if(!$login->register($_POST['user'],$_POST['pass'])){ print "Login failed: Username already in use!"; exit; } else { print "Login successful! You can now login!";exit; } } break; case 'login': if(!isset($_POST['user']) OR !isset($_POST['pass'])){ $_GET['page'] = "index"; } else {$login->login($_POST['user'],$_POST['pass']); } break; case 'logout': if(!isset($_SESSION['username'])){ print "User is not logged in!"; } else {if(session_destroy()){ print "User logged out successfully!"; } else { print "User could not be logged out!"; } } break;} ?>
Now, here’s the extensive script which does it all! It is more or less thoroughly documented, so no worries there. Should be pretty well explained. Here goes:
<?php /** * Salt Encryption Tutorial by Dennis McWherter * * (C) 2009 Dennis McWherter. All Rights Reserved. * * This is where all of our functions are. Yes a lot of these * Some of this stuff is extra nonsense, but makes life a lot * more difficult for hackers. * */ // Script securityif(!defined("IS_SCRIPT")){ print "Unauthorized access"; exit; }
class Login {/** * Constructor* */ function __construct(){ mysql_connect(DBHOST,DBUSER,DBPASS); mysql_select_db(DATABASE); }
/** * Register function* */ function register($user,$pass){ // Simple checks.. umm. Yeah let's make sure user doesn't exist XD $check = mysql_query("SELECT * FROM users WHERE user='".mysql_escape_string($user)."'"); if(mysql_num_rows($check) != 0){ return false; }
// Let's begin with making our first and second salt character set // This is our first set of possible salt characters. Shuffle so always different all aspects $set1 = str_shuffle("!@#$%^&*()_+=-';:,<.>126AaBbJjKkLlSdDsQwWeErqRtTyY"); // Second set. Same thing, different characters though$set2 = str_shuffle("1234567890`~ZxzxCcVvBb?[]{}pP");
// Now the loops to actually make the salt characters // We'll be using the rand(); function give us random chars from the shuffled sets // The for loops are fairly simple. // Salt1 = 12 char // Salt2 = 10 char for($i=0;$i<12;$i++){ $salt1 .= $set1[rand() % strlen($set1)-.04]; }for($i=0;$i<10;$i++){ $salt2 .= $set2[rand() % strlen($set2)-.07]; }// Now let's generate a pattern. We'll have only about 4 combinations. // For time sake we'll only do a few simple ones. $part[1] = "{salt1}"; $part[2] = "{salt2}"; $part[3] = "{pass}"; $psort = array_rand($part,3); $pattern = $part[$psort[0]].".".$part[$psort[1]].".".$part[$psort[2]];// Now for pass $grep = array("/{salt1}/","/{salt2}/","/{pass}/"); // Identify pattern $repl = array($salt1,$salt2,$pass); // Make pattern real// Now replace the pattern with actual values XD $sendpass = preg_replace($grep,$repl,$pattern);// Send all to DB $query = "INSERT INTO users (`id`,`user`,`password`,`salt1`,`salt2`,`pattern`) VALUES (NULL, '".mysql_escape_string($user)."', '".md5($sendpass)."', '".mysql_escape_string($salt1)."', '".mysql_escape_string($salt2)."', '".mysql_escape_string($pattern)."')"; if(!mysql_query($query)){print "DB Connection failed: ".mysql_error(); return false; } return true; }/** * Login Function * */ function login($user,$pass){ // Grab info by username since usernames are unique anyway... $query = "SELECT * FROM users WHERE user='".mysql_escape_string($user)."' LIMIT 1;"; if(!mysql_query($query)){print "DB Connection Failed: ".mysql_error(); return false; } $info = mysql_fetch_assoc(mysql_query($query));// Use the grep and replace arrays again to replace information from pattern! $grep = array("/{salt1}/","/{salt2}/","/{pass}/"); // Identify pattern $repl = array($info['salt1'],$info['salt2'],$pass); // Make pattern real$pwd = preg_replace($grep,$repl,$info['pattern']); // Generate password how it should be.// Now let's make sure the user is properly identifying! if(md5($pwd) != $info['password']){ print "Incorrect password!"; unset($info); return false; }// All checks out... Let's create session data and give a success msg.. We're just about done // anyway![]()
$_SESSION['username'] = $user; print "You've logged in successfully! Please return home";// Delete all info in the $info var unset($info); return true; } } ?>
Oh yeah, and can’t forget the database structure! Run this query to duplicate the database
CREATE TABLE `users` (
`id` BIGINT( 10 ) NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`user` VARCHAR( 32 ) NOT NULL ,
`password` VARCHAR( 32 ) NOT NULL ,
`salt1` VARCHAR( 12 ) NOT NULL ,
`salt2` VARCHAR( 10 ) NOT NULL ,
`pattern` VARCHAR( 22 ) NOT NULL
) ENGINE = MYISAM ;
Regards,
Dennis M.
Again, that download link is: PHP Password+Salt Encryption Tutorial – Files Download
FANTASTIC!
Hi, cool post. I have been wondering about this topic,so thanks for writing.
I’m glad that after surfing the web for uch a long time I have found out this information. I’m really lucky.
Hello. I think the article is really interesting. I am even interested in reading more. How soon will you update your blog?
Great topic. Now i can say thank you
+1
Very goood!!!
Thanks for post
I want to say – thank you for this
nice job men:)
Thx
thank you soooooo much for this
Thanks so much! I’ve looked everywhere for this! You’re amazing!
Thank you very much, bookmarked this website! thanks!!!!
Thanx man =)
Totally Awsome!
thank you bro
This site is the BEST!!!
Thanks a million!
It is a pity, that I can not participate in discussion now. I do not own the necessary information. But this theme me very much interests.
thanks a lot man…..