2013-07-09 37 views
2

所以基本上我在登記表加密的口令,象這樣:MySQL的SHA()不工作

$query = "INSERT INTO users(first_name, last_name, email, password, 
         username) VALUES ('$fn', '$ln', '$em', SHA('$pw1'), '$un')"; 

現在的密碼散列,但是當我嘗試在我的登錄腳本使用它它不」 t想要工作和功能mysql_num_rows返回0.

<?php 
       ob_start(); 
        //If login button is pressed 
        if(isset($_POST['submitted'])){ 
         //Username clean up 
         if(preg_match('%^[a-zA-Z0-9_-]{6,20}$%', stripslashes(trim($_POST['username'])))){ 
          $u = escape_data($_POST['username']); 
         } else { 
          $u = FALSE; 
          echo '<p><font color="red" size="+1">Please enter valid username</font></p>'; 
         } 

         //Password clean up 
         if(preg_match('%^[a-zA-Z0-9_-]{6,20}$%', stripslashes(trim($_POST['password'])))){ 
          $p = escape_data($_POST['password']); 
         } else { 
          $p = FALSE; 
          echo '<p><font color="red" size="+1">Please enter valid password</font></p>'; 
         } 

         //Check if both matched 
         if($u && $p){ 
          $query = "SELECT * FROM users WHERE username='$u' AND password=SHA('$p')"; 
          $result = mysql_query($query); 
          $count = mysql_num_rows($result); 
          $row = mysql_fetch_array($result, MYSQL_NUM); 
          if($count != 0){ 
           $_SESSION['username'] = $row[1]; 
           $_SESSION['password'] = $row[3]; 
           header("Location: login_confirmed.php"); 
          } else { 
           echo "Wrong username or password!"; 
          } 
         } 
        } 
        ob_end_flush(); 
       ?> 
+1

什麼是密碼字段的類型? –

+0

你檢查過數據庫中的插入值和檢索值嗎? –

+4

警告:SHA不是加密算法!這是一個哈希算法! –

回答

1

這可能是因爲你的密碼字段類型。你的密碼字段是VARCHAR?多久了?在我看來,SHA正在生成比字段允許的字符串更長的字符串,因此當它被存儲時會被截斷,並且在您重新生成它時進行檢查時它會匹配。

MySQL documentation表示您需要40個字符來存儲SHA的輸出。

如 RFC 3174(安全散列算法)中所述,計算字符串的SHA-1 160位校驗和。該值以十六進制數字形式返回爲 的字符串,如果參數爲NULL,則返回NULL。用於此功能的可能 之一是作爲散列鍵。

+0

令人驚歎的,它的工作。我有varchar(30)設置表。我不知道。非常感謝你!太棒了。 – user2564336

+0

爲什麼你會有varchar(30)呢?你知道什麼是變化的,它們是如何工作的? –

+0

我想,密碼通常約爲30個字符,但我忘了SHA函數使字符串長40個字符。 – user2564336