2013-04-16 177 views
0

我似乎已经尝试了各种方式让我的日志工作,但是当我尝试登录时,它停在用户密码处并且从不提取它。我在我的注册表中使用了sha1,在插入数据库时​​很好。用户登录的php md5密码

$username = $_POST['username']; 
$password = md5($_POST['password']); 

$result = mysql_query("SELECT * FROM users WHERE username = '$username' "); 



while ($row = mysql_fetch_array($result)) 
{ 
    if($username == $row['username']) 
    { 
     if($password == $row['password']) 
     { 
      header("location: profile.php"); 
     } 
     else  
      echo 'pass problem'; 
    } 
    else 

     echo 'username issue '; 


} 
+2

请请请不要使用MD5使用https://github.com/ircmaxell/password_compat – iConnor

+0

您可能需要阅读:http://stackoverflow.com/问题/ 401656/secure-hash-and-salt-for-php-passwords – Baba

+5

所以你'sha1()'在注册时输入密码,而在登录时输入'md5()'密码? – Wiseguy

回答

2

这么多的问题...

  1. md5是不安全的。使用盐+键+密码。
  2. mysql_功能已弃用。使用mysqli_PDO
  3. 没有卫生设施。使用预准备语句和绑定参数。
  4. 不要SELECT *。只获取你需要的列。
  5. 你想要多少成绩来回报
  6. 无需一个while循环的结果添加LIMIT
  7. 密码是如何存储在数据库中的?很明显,md5的密码与您的列不匹配。

实际问题

如果用户的密码被存储为sha1再对比md5不能混淆加密类型。

+0

我也想过一样..从哪里开始? – Jonast92

+1

'salt + key + password.'仍然是错误的 – Baba

+1

Salting +哈希+拉伸。 – Jonast92

1

我建议使用PHPass库来保护您的密码,因为md5和shai以及其他加密算法并不安全。

PHPass需要

  1. 加密的照顾。
  2. 腌制。
  3. 拉伸。

而且该方法尚未破解(暴力强制不能被视为PHPass的破解)。

你可以从这里得到它:http://www.openwall.com/phpass/

这很容易凑一旦你设置代码:

$hash = PasswordHash($iteration_count_log2, $portable_hashes) 

然后你就可以从数据库读取存储的哈希,和通过功能相匹配的登录密码哈希与现有的哈希

$auth = CheckPassword($incomingPasswordNotHashed, $hashFromDatabase); 

我喜欢更简单的做这样的事情做出一个哈希:

// Usage: $hash = PHPhass($password); 
// Pre:  $password is of type string, 
//   indicating the password which 
//   the user want's to hash. 
// Post: $hash is the hashed password. 
function PHPhass($password) 
{ 
    $unHashed = $password; 
    require '../phpass/PasswordHash.php'; 
    header('Content-type: text/plain'); 
    $t_hasher = new PasswordHash(12, FALSE); // Define the iterations once. 
    $hash = $t_hasher->HashPassword($unHashed); 
    unset($t_hasher); 
    return $hash; 
} 

而且这样做是为了匹配散列和非散列密码:

// Usage: $check = PHPhassMatch($password, $hash) 
// Pre:  $password is of type string, 
//   indicating a user's passwordd 
//   $hash is a hashed password. 
// Post: $check is true if $password's hash 
//   value is equal to $hash. 
function PHPhassMatch($password, $hash) 
{ 
    $unHashed = $password; 
    $theHashed = $hash; 
    require '../phpass/PasswordHash.php'; 
    header('Content-type: text/plain'); 
    $t_hasher = new PasswordHash(8, FALSE); 
    $check = $t_hasher->CheckPassword($unHashed, $theHashed); 
    unset($t_hasher); 
    return $check; 
} 

此外,像新鲜提到:

  • 不要使用mysql_ *,因为它的弃用,我建议使用PDO或mysqli。
  • 使用预准备语句来防止sql注入。
  • 不要以为张贴变量张贴,检查它们是否与isset()函数

你提到shai1存在,你肯定是在数据库中的密码不SHA1,但你对匹配MD5?

+1

一些注意事项:1.它是SHA,而不是shai。 2.有序列表中的项目顺序不正确:先是盐,然后是散列。 3.加密和散列之间有区别,你不想加密密码,你想散列它。如果暴力强制不能被认为是这个类的破解,不要使用它!使用当前可用的云和GPU,暴力强制应被视为严重威胁。我没有看过这个类,但适当的拉伸量完全取决于你需要的哈希值。例如,我想散列一个密码需要100毫秒。 –

+0

我知道散列和加密之间的区别,但是您指出它是为了让其他人阅读。不过实话说? @PelletenCate从哪里开始......如果用户创建了一个错误的密码,并且没有哈希可以改变这个密码,那么你总是可以强制密码,所以不要说如果一个库不能保证你不受恶作剧的攻击,那么就不要说它是坏的,没有办法可以让你免于暴力破坏为了一个好的密码。此外,图书馆的设计使你永远不会超过72次,但你可以定制它,我认为12是标准的。无论如何,我认为你应该阅读更多关于这个话题。 – Jonast92

+0

@ Jonast92:true。字典密码永远不会安全。但随着sha1 + salt甚至8个字符的随机密码(a-zA-Z0-9 + chars,总共94个字符)将快速下降。但是,对于BCrypt,同一个品牌的6个字符*随机密码将会持续相当长的时间。另外,我不确定你从哪里得到* 72次*,但这根本不是真的。 phpass(你链接的那个)使用bcrypt。成本是2^n的数字。所以12的成本表示2^12或4096的成本。另外,你作为例子显示的API(phphass等)不是来自phpass。我不知道他们是什么...... – ircmaxell

0

如果您使用sha1插入新密码,您也必须使用sha1进行密码比较。如果您将md5字​​符串与sha1字符串进行比较,则不起作用。所以,你必须这样做:

$password = sha1($_POST['password']);