2014-01-16 48 views
-2

这是我的注册代码:,我不知道如何使用盐

<?php 

session_start(); //Must Start a session. 

require "config.php"; //Connection Script, include in every file! 

//Check to see if the user is logged in. 
//'isset' check to see if a variables has been 'set' 
if(isset($_SESSION['username'])){ 
header("location: members.php"); 
} 

//Check to see if the user click the button 
if(isset($_POST['submit'])) 
{ 
//Variables from the table 
$user = $_POST['user']; 
$pass = $_POST['pass']; 
$rpass = $_POST['rpass']; 
$email = $_POST['email']; 

//Prevent MySQL Injections 
$user = stripslashes($user); 
$pass = stripslashes($pass); 
$rpass = stripslashes($rpass); 
$email = stripslashes($email); 

$user = mysqli_real_escape_string($con, $user); 
$pass = mysqli_real_escape_string($con, $pass); 
$rpass = mysqli_real_escape_string($con, $rpass); 
$email = mysqli_real_escape_string($con, $email); 


//Check to see if the user left any space empty! 
if($user == "" | $pass == "" | $rpass == "" | $email == "") 
{ 
    echo "Alstublieft, vul alle vakjes in!"; 
} 

else 
{ 
    //Check too see if the user's Passwords Matches! 
    if($pass != $rpass) 
    { 
    echo "Passworden komen niet overeen! Probeer het opnieuw"; 
    } 

    //CHECK TO SEE IF THE USERNAME IS TAKEN, IF NOT THEN ADD USERNAME AND PASSWORD INTOT HE DB 
    else 
    { 
    //Query the DB 
    $query = mysqli_query($con,"SELECT * FROM users WHERE username = '$user'") or die("Kan het niet in de tabel zetten!"); 

    //Count the number of rows. If a row exist, then the username exist! 
    $row = mysqli_num_rows($query); 
    if($row == 1) 
    { 
     echo "Sorry, maar die username is al in gebruik! Probeer het opnieuw."; 
    } 

    //ADD THE USERNAME TO THE DB 
    else 
    { 
     $add = mysqli_query($con,"INSERT INTO users (id, username, password, email) VALUES (null, '$user' , '$pass', '$email') ") or die("Kan niet toevoegen!"); 
     echo "Gelukt! <a href='login.php'> Klik hier </a>om in te loggen!"; 
    } 


    }  

    } 

} 
?> 

但我怎么在它使用的盐? 我知道这是一种额外的安全措施,但我不知道如何使用它。 我在网上看了一遍,并尝试了一些代码,但每次都不起作用。

+0

使用'password_hash()'代替 –

+4

你通常只是把它浇在你需要咸的东西。 – Shoe

+2

你甚至知道什么是盐吗? –

回答

-1

你真正需要做的,当你想使用的盐是:

$passwordForDB = md5('your_salt_string_here'.$pass); 

当你做登记。

,然后在登录脚本简单地做:

$password = md5('your_salt_string_here'.$_POST['pass']); 

if ($passwordFromDB = $password) { 
echo 'Hi User!'; 
} 

这就是我们真的叫盐,它只是混合加密的数据,如生成密钥或密码散列

PHP还为您提供了功能

password_hash() 

我建议你在文档中检查它。您也可以使用盐以及将您的salt字符串与要散列的密码连接起来

+1

1)那不是盐,那是胡椒粉。 2)不要再推荐MD5,它不适合这项任务。 – deceze

+2

-1一个MD5散列可以计算出每秒810亿次,所以你可以蛮横地强制它琐碎的http://hashcat.net/oclhashcat/ –

0

要创建密码散列,请使用crypt()函数。你可以指定一个盐作为可选参数:

$hashed_password = crypt($password, "mysalt"); 

$hashed_password现在包含密码的加密哈希。提供salt,而不是让系统为你自动生成一个salt,它将自PHP 5.6起生成一个E_NOTICE。指定自己的盐更安全。

密码的加密哈希现在包含盐,在做比较时可用作盐。所以验证用户时,如果$password包含由用户指定的密码,你可以这样比较一下:

if(crypt($password, $hashed_password) == $hashed_password) { 
    // Password matches 
} 
+0

你的例子有点误导,它会产生一个不安全的散列,而不是使用慢速键像BCrypt这样的衍生函数。函数[password_hash](http://www.php.net/manual/en/function.password-hash.php)为你生成一个安全的盐,所以不要在那里传递自己的盐,很容易做出错误。 – martinstoeckli

2

使用盐之前,您应该考虑存储散列形式的密码。这意味着有人正在查看您的数据库无法看到密码纯文本。盐对纯文本密码没有帮助。盐可以防止所谓的“彩虹表攻击”散列密码。

为了您的方便,password_hash()已经用随机生成的salt完全散列密码。只需将结果放入数据库即可。

要检查用户提供的密码与存储在数据库中的一个,使用password_verify()

+0

我使用了这个函数password_hash(),但每次都会产生不同的散列值。我如何在登录时进行身份验证? – spacemonkey

+0

阅读我的帖子到最后:**“要检查用户提供的密码是否与存储在数据库中的密码匹配,请使用password_verify()”** *或*阅读官方的PHP文档,其中password_verify()是偶数从http://de2.php.net/manual/en/function.password-hash.php#refsect1-function.password-hash-returnvalues链接 – Alexander