con md5 es suficiente oseria mejor aun con hash

Es suficiente encriptar la contraseña con md5 o seria bueno utilizar hash también para fortalecer la contraseña o hay métodos mas avanzados y nuevos a estas si alguien sabe algo del tema me gustaría aprender si tenéis algo de tiempo.


En la contraseña la puse así.


Registro.php

 
<?php 
/*Registro de usuarios.*/ 
//Iniciamos la conexión. 
include("conexion.php"); 
//Validamos que el formulario fue enviado correctamente. 
if(isset($_POST['registro'])) { 
//Validamos que todos los campos esten llenos correctamente. 
if(($_POST['nick'] != '') && ($_POST['mail'] != '') && ($_POST['pass'] != '') && ($_POST['pass1'] != ''))  
{if($_POST['pass'] != $_POST['pass1']) { 
//mensaje de error. 
echo "<br /><b><span style='color: red;'>Las contrase&ntilde;as no coinciden...</span></b>"; 
header('refresh:3;registro.php'); 
} else { 
//Cuando todo este correcto empezaremos a enviar los datos de las variabres procedentes del form al la base de datos, solo despues de validar toda la estructura. //Utilizamos la función limpiar para que lo que pongan los usuarios quede en texto plano y no en código. 
$date = time();//Dia mes año, hora minutos. 
$nick = limpiar($_POST['nick']);//Usuario. 
$mail = limpiar($_POST['mail']);//Email. 
$pass = md5(md5(limpiar($_POST['pass']))); //Encriptamos la contraseña con md5 de una sola via. 
$ipuser = ipreal($_SERVER['REMOTE_ADDR']);//ip. //Encriptamos las preguntas de seguridad con md5. 
$pre = md5(md5(limpiar($_POST['pre']))); 
$pre1 = md5(md5(limpiar($_POST['pre1']))); 
$pre2 = md5(md5(limpiar($_POST['pre2'])));         //Comprobamos si el usuario existe o no para registrarlo. 
$info_user = mysql_query("SELECT nick FROM usuarios WHERE nick='$nick'"); 
//Condición para registrarlo recorrido por un array. 
if($user = @mysql_fetch_array($info_user)) { 
//Si esta registrado mostramos este mensaje. 
echo "<br /><b><span style='color: red;'>El nombre de usuario ya esta registrado...</span></b>"; 
header('refresh:4;registro.php'); 
mysql_free_result($info_user); //Liberamos la memoria del query y los datos existentes. 
} else { 
//Pasamos la primera condición if valida. 
//Utilizamos la función validar email, nick y pass para que sea correcto en caracteres forma etc. 
//Estas funciones utilizan mas mensajes de error si no son validas procedentes de las funciones. 
if(validar_nick($_POST['nick'])) { 
if(validar_pass($_POST['pass'])) { 
if(validar_email($_POST['mail'])) { 
//Con insert insertaremos los datos del form en la base de datos. 
mysql_query("INSERT INTO usuarios (fecha,nick,mail,pass,ip,pre,pre1,pre2) values ('$date','$nick','$mail','$pass','$ipuser','$pre','$pre1','$pre2')"); 
//Mostramos el mensaje de registro correcto.echo '<br /><b><span style="color: green;">Te has registrado correctamente, ahora podras iniciar sesi&oacute;n como usuario registrado...</span></b>'; 
//Refrescamos la url y lo enviamos al index para que inicie sesión. 
header("refresh:4;index.php"); 
} 
} 
} 
} 
} 
} else { 
//Mensaje de error.echo '<br /><b><span style="color: red;">Deber&aacute;s llenar todos los campos...</span></b>'; 
header('refresh:4;registro.php'); 
} 
} 
//si se validó todo el formulario pasamos a registrarlo en la bd. 
//Form de registro. 
?> 
<!DOCTYPE html> 
<html lang="es"> 
<head> 
<meta charset="utf-8" /> 
<meta name="robots" content="noindex,nofollow"><title>Registro de Usuarios</title> 
</head> 
<body bgcolor="#FFFFF0"> 
<br><b>Registro Web</b> 
<div align="center"> 
<form action="registro.php" method="post" onsubmit="return validar()" /> 
<span style="color: green;"> M&iacute;nimo 6 car&aacute;cteres.</span> 
<div><label><b><span style="color: red;">*</span> Usuario:</b></label><br /> 
<input type='text' name='nick' /></div> 
<span style="color: green;"> El E-mail debe ser valido.</span> 
<div><label><b><span style="color: red;">*</span> E-mail:</b></label><br /> 
<input type='text' name='mail' /></div> 
<span style="color: green;"> M&iacute;nimo 6 car&aacute;cteres.</span> 
<div><label><b><span style="color: red;">*</span> Contrase&ntilde;a:</b></label><br /> 
<input type="password" name='pass'" /></div> 
<span style="color: green;"> M&iacute;nimo 6 car&aacute;cteres.</span><div><label><b><span style="color: red;">*</span> Confirmar Contrase&ntilde;a:</b></label><br /> 
<input type="password" name='pass1' /></div> 
<div><br><b>Preguntas de seguridad no las olvides las reservaremos en caso de detectar algun tipo de intento de suprantacion de identidad de tu cuenta.</b><br><br></div> 
<div><label><b><span style="color: red;">*</span> Que es lo que mas te gusta:</b></label><br /> 
<input type="text" name='pre' /></div> 
<div><label><b><span style="color: red;">*</span> Cual fue el mejor a&ntilde;o de tu vida:</b></label><br /
<input type="text" name='pre1' /></div> 
<div><label><b><span style="color: red;">*</span> Algo que solo sepas tu:</b></label><br /> 
<input type="text" name='pre2' /></div> 
<input type="submit" name="registro" style="width:100px;" tabindex="6" value="Registrarse" /><input type="reset" name="Limpiar" style="width:100px;" tabindex="6" value="Limpiar" /> 
</form> 
<b><a href="index.php">Identificarse</a></b></div>    </body> 
</html> 
Hola:

Una de las formas (de las mejores) es utilizar un password encriptado y un salt. El salt es simplemente una cadena que se genera una sola vez al momento de guardar la contraseña y puede tener el largo que quieras (aunque dependerá del método de encriptación).

La base de datos que siempre creo es así:
# Puedes poner los campos que quieras aparte de los que hay
CREATE TABLE usuario (
  id INT(11) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
  nombre VARCHAR(200) NOT NULL,
  apodo VARCHAR(50) NOT NULL UNIQUE, # Si se intenta ingresar un apodo existente, el SGBD arrojará una excepción e interrumpirá el script.
  password VARCHAR(128) NOT NULL,
  salt VARCHAR(15) NOT NULL
);

Luego, justo antes de guardar la contraseña, la encriptas y generas el salt. Utiliza esta clase si quieres (la creé yo en base a lo que encontré en Internet - siempre escribo en inglés :P):

class.session.php
<?php
  class Session {
		
		private $Key						= '';
		private $CookieName			= '';
		private $CookieDuration	= '';
		
		/**
		 * 
		 * @param string $key - A password used to hash. It can be any string (a secure $key would be at least 15 characters length,
		 * would have numbers, letters and symbols. Defaults to '8+$=Fg52204 #{!,59+o' ).
		 */
		public function __construct( $key = '8+$=Fg52204 #{!,59+o' ) {
			$this->CookieName			= 'pgymSiteAuth';
			$this->CookieDuration = ( 60 * 60 ) * 24;
			
			if( ! is_string( $key ) ) {
				$this->Key = '8+$=Fg52204 #{!,59+o';
			} else {
				$this->Key = $key;
			}
		}
		
		public function hashPassword( $password, $salt = '' ) {
			
			if( empty( $salt ) || ! is_string( $salt ) )
				$salt = $this->makeSalt();
			
			$pass = $this->makeHash( $salt . $this->key . $password ) . $salt;
	
			return $pass;
		}
	
		/**
		 * 
		 * @param integer $length - The length of the string to return.
		 * @return string - Returns the salt.
		 */
		public function makeSalt( $length = 15, $algorithm = 'sha512' ) {
			$regex = '/(sha(1|256|384|512)|md5)/';
			
			if( ! is_numeric( $length ) )
				$length = 15;

			if( ! preg_match( $regex, $algorithm ) )
				$algorithm = 'sha512';
				
			$uid	= uniqid( rand(), true );
			$salt = hash( $algorithm, $uid . $this->key . microtime() );
			
			return substr( $salt, 0, $length );
		}
	
		/**
		 * 
		 * @param string $password - The password to be hashed.
		 * @param string $algorithm - The algorithm to be used. Defaults to sha512.
		 * @return string - Returns the hashed password.
		 */
		public function makeHash( $password, $algorithm = 'sha512' ) {
			$regex = '/(sha(1|256|384|512)|md5)/';
			
			if( ! preg_match( $regex, $algorithm ) )
				$algorithm = 'sha512';
			
			return hash( $algorithm, $password );
		}
	
		/**
		 * 
		 * @param string $user_name - The user name.
		 * @param string $profile - The profile of the user. 
		 * @param string $recordar - If the user wants to keep the session open. Defaults to off (an hour of session).
		 */
		public function generateSession( $user_name, $profile = '', $remember = 'off' ) {
			
			/*if( $remember == 'on' ) {
				$cvalue = "user_name=$user_name&profile=$profile";
				setcookie( $name, $cvalue, time() + $this->CookieDuration );
			} else {
				session_set_cookie_params( time() + ( 60 * 15 ) );
			}*/
			
			if( ! isset( $_SESSION['user_name'] ) )
				$_SESSION['user_name'] = $user_name;
			
			if( ! isset( $_SESSION['profile'] ) )
				$_SESSION['profile'] = $profile;
			
			if( ! isset( $_SESSION['valid'] ) )
				$_SESSION['valid'] = 1;
			
			session_regenerate_id();
		}
	
		/**
		 * @return boolean - True if the user is logged in; false otherwise.
		 */
		public function isLoggedIn() {
			/*if( isset( $_COOKIE[$this->cookieName] ) ) {
				
				parse_str( $_COOKIE[$this->cookieName], $params );
				$_SESSION['valid']			= 1;
				$_SESSION['profile']		= $params['profile'];
				$_SESSION['user_name']	= $params['user_name'];
			} else {
				$lastUrl = '';
				
				if( isset( $_SESSION['last'] ) )
					$lastUrl = $_SESSION['last'];
			}*/
			
			if( isset( $_SESSION['valid'] ) )
				return $_SESSION['valid'];
	
			return false;
		}
	
		/**
		 * 
		 * @return string - Returns the profile of the user.
		 */
		public function get_profile() {
			if( isset( $_SESSION['profile'] ) )
				return $_SESSION['profile'];
	
			return 'unset';
		}
	
		/**
		 * A simple function to end the session (logout).
		 */
		public function logout() {
			$_SESSION = array();
			session_destroy();
		}
	
		/**
		 * 
		 * @param string $str - The string to encode.
		 * @return mixed - Returns the encoded string or null if the parameter is not an string (or is empty).
		 */
		public static function encode_str( $str ) {
			if( empty( $str ) || ! is_string( $str ) ) {
				echo 'Invalid parameter.';
				return null;
			}
	
			return base64_encode( $str );
		}
	
		/**
		 * 
		 * @param string $str - The string to be decoded.
		 * @return mixed - Returns the decoded string or null if the parameter is empty or is not a string.
		 */
		public static function decode_str( $str ) {
			if( empty( $str ) || ! is_string( $str ) ) {
				print 'Invalid parameter.';
				return null;
			}
	
			return base64_decode( $str );
		}
	}
?>

  include 'class.session.php';
  $con = mysql_connect...;
  // Seleccionas base de datos, compruebas que no existe el usuario, etc.
  // Y llega el momento de guardar la contraseña:
  $s = new Session();
  // Los parámetros que acepta makeSalt son: largo y algoritmo. El largo se refiere al tamaño que tendrá la cadena devuelta y el algoritmo es la forma de encriptar (puede ser
  // md5, sha512 - utiliza 128 caracteres -, sha256 - utiliza 64 caracteres - o sha1 - utiliza 40 caracteres).
  $salt = $s->makeSalt() // Los valores por defecto son 15 y sha512 - el más seguro.
  $password = $s->hashPassword( $password, $salt );

  $query = "INSERT INTO usuario (password, salt) VALUES ('$password', '$salt')";
  mysql_query( $query );
?>


Ahora, cuando debas validar el login, debes hacer lo siguiente (utilizando la clase):

  include 'class.session.php';
  // Nuevamente, te conectas a la base de datos, validas y limpias los datos, etc.
  // Al momento de comparar es donde harás lo siguiente:
  $query = "SELECT * FROM usuario WHERE apodo = '$apodo'";
  $result = mysql_query( $query );
  $arr     = mysql_fetch_assoc( $result );
  $s       = new Session();
  $enc    = $s->hashPassword( $_POST['contrasena'], $arr['salt'] ); // Encriptas la clave ingresada con el salt guardado en la base de datos al momento del registro

  if( $enc == $arr['password'] ) { // Si son iguales, entonces la contraseña es válida
  } else { // La contraseña no es válida
  }

De esta forma la contraseña será segura.

Espero que te ayude :), saludos.
Gracias skaparate por toda la información que me ofreces, con toda esta información tengo suficiente de momento para continuar aprendiendo y hacer los scripts mas seguros.