php加密sql

php加密sql,php,mysql,security,encryption,hash,Php,Mysql,Security,Encryption,Hash,我想要一个用户可以更改密码的表单。我能够加密密码,但是当从数据库中选择密码(原始密码为“test”)时,它无法识别密码 这是在db中对密码进行加密时。我正在检查表单中键入的密码是否与数据库中的密码匹配: SELECT * from table where password = md5('$typed_password') 这就是它的加密方式: UPDATE table set field = md5('$typed_password' ) “我的选择”如何工作,以便当用户以某种形式键入它时,

我想要一个用户可以更改密码的表单。我能够加密密码,但是当从数据库中选择密码(原始密码为“test”)时,它无法识别密码

这是在db中对密码进行加密时。我正在检查表单中键入的密码是否与数据库中的密码匹配:

SELECT * from table where password = md5('$typed_password')
这就是它的加密方式:

UPDATE table set field = md5('$typed_password' )
“我的选择”如何工作,以便当用户以某种形式键入它时,可以识别原始文件?

首先:MD5是一种加密方法,不一定是一种加密方法。散列只能在一个方向上执行,不能反转。(这是件好事)

然而,MD5在加密方面被破坏(不再被认为是安全的);您应该使用另一个哈希函数(最好是Bcrypt哈希或至少是SHA256)

查看代码,我发现有几个地方出错:

  • 您的密码不正确
  • 我真的希望
    $typed\u password
    得到正确的消毒,否则您将面临失败
  • 您尝试从表中选择具有相同密码的所有用户
  • 最简单(可能也是最好)的密码处理方法是使用标准库:并确保使用
    CRYPT\u BLOWFISH
    算法

    require('PasswordHash.php');
    
    $pwdHasher = new PasswordHash(8, FALSE);
    
    // $hash is what you would store in your database
    $hash = $pwdHasher->HashPassword( $password );
    
    // $hash would be the $hash stored in your database for this user
    $checked = $pwdHasher->CheckPassword($password, $hash);
    if ($checked) {
        echo 'password correct';
    } else {
        echo 'wrong credentials';
    }
    
    存储/检查/更新查询应绑定到用户的Id:

    // Insert query
    $query = "INSERT INTO users VALUES({$userId}, '{$username}', '{$hash}')";
    
    // Select query
    $query = "SELECT hash FROM users WHERE userId = {$userId}";
    
    // Update query
    $query = "UPDATE users SET hash = '{$hash}' WHERE userId = {$userId}";
    
    然后,您应该使用,而不是直接将变量值传递到查询中


    我意识到这是一次大量的信息,但如果你不想让你的脚本被几乎所有的程序员破解,那么了解这一点至关重要。

    为什么不用PHP加密密码,然后插入已经加密的密码。
    选择相同

    因此:

    与更新类似

    (为什么不插入
    ?)

    我有点离题,讲了很多。小道消息:

    一旦你对密码感到满意,他们就会选择先用PHP加密,然后存储。下面的密码加密功能也不是我的想法,但解决了一些问题。PHP中的加密可以防止共享服务器上的用户截获您未加密的密码。为每个用户添加不会更改的内容(我使用电子邮件,因为这是我站点的用户名)并添加散列(SALT是我为每个站点更改的一个短常量字符串),可以提高对攻击的抵抗力。因为SALT位于密码中,密码可以是任意长度,所以几乎不可能用彩虹表来攻击它。另外,这也意味着人们不能更改他们的电子邮件,而你也不能在不使每个人的密码无效的情况下更改SALT

    function password_crypt($email,$toHash) {
       $password = str_split($toHash,(strlen($toHash)/2)+1);
       return hash('sha256', $email.$password[0].SALT.$password[1]); 
    }
    
    因此,在第一次输入用户密码时,使用伪代码:

    define(SALT,'blah');
    $hashed_password = password_crypt($email,$password);
    INSERT INTO users (email,hashed_password) VALUES ($email,$hashed_password);
    
    然后在伪代码中检查后续登录:

    define(SALT,'blah');
    $user_hashed_password = password_crypt($_POST['username'],$_POST['password']);
    SELECT email FROM users WHERE email = ? AND hashed_password = $user_hashed_password LIMIT 1
    

    如果返回一行,请登录有效。

    如果确定,请详细说明第1点和第3点。我不太明白你的意思。谢谢你提供的所有信息,我会调查的。我这样做的原因是,如果用户重新登录到系统中,他们将使用在表单中键入的密码登录。只有将此密码转换回原始格式,才能识别此密码。我的想法正确吗?如果我错了,请纠正我,我现在还没有读入加密哈希函数。这是有效的,没有通过哈希知道密码是什么。您可以对原始密码进行散列,然后再次对其进行散列,并比较散列而不是密码。
    $typed\u password
    不需要进行清理,因为它仍然是散列的。在sql注入
    md5(“$typed\u password”)
    中,如果$typed\u password设置为:
    x')和1=1——
    将很好地破坏系统。您仍然使用特定的密码选择每个用户,密码哈希不会被加密,哈希函数(md5)也会被加密破坏。@jacco。虽然这是真的,但他想说的是,为什么不让php而不是mysql来完成这项工作呢?他不必使用md5。PHP支持34种其他哈希算法,并且自5.1.2以来一直在使用。谢谢你的建议,我会仔细阅读并尝试一下。再次感谢所有人salt应该为每个哈希密码更改。每个站点使用常量值是不正确的。我猜你从未读过它。它会根据每个哈希密码进行更改。我用了两种盐。一个是针对每个站点进行更改以防止跨站点彩虹,另一个是针对每个用户进行更改。salt应该是随机的,以便有效,而不是从某种与用户相关的数据中派生出来。使用随机salt可以确保哈希值对于每个存储的哈希有效地不同,无论是在您自己的系统上还是跨系统。这还可以确保电子邮件更改不会使密码无效。简而言之:推荐/使用经验证的库,因为失败的可能性太多了。好吧,我被说服了。:)好的散列,小尺寸,可定义的计算成本和向后兼容性,如果我打开它。
    define(SALT,'blah');
    $user_hashed_password = password_crypt($_POST['username'],$_POST['password']);
    SELECT email FROM users WHERE email = ? AND hashed_password = $user_hashed_password LIMIT 1