Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用加密功能加密mysql数据库中的安全密码_Php_Mysql_Encryption - Fatal编程技术网

Php 使用加密功能加密mysql数据库中的安全密码

Php 使用加密功能加密mysql数据库中的安全密码,php,mysql,encryption,Php,Mysql,Encryption,我想加密密码以防止SQL注入和其他攻击,我在PHP中使用了加密函数,但我不知道如何使用它来加密密码 我希望对用户表中的每个密码进行加密,以便连接到数据库并使用查询,但它不起作用 有人能帮我吗 ecnription.php 事实上,密码加密与mysql注入没有任何共同之处。你应该(必须!)分开做这些事情 密码加密(或在本例中为哈希)将使可能访问您数据库的黑客无法使用您的用户密码。散列函数是一种方法-您可以从密码创建散列,但不能从散列创建密码。从散列中获取密码的唯一方法是对每个可能的字符组合进行散列

我想加密密码以防止SQL注入和其他攻击,我在PHP中使用了加密函数,但我不知道如何使用它来加密密码

我希望对用户表中的每个密码进行加密,以便连接到数据库并使用查询,但它不起作用

有人能帮我吗

ecnription.php
事实上,密码加密与mysql注入没有任何共同之处。你应该(必须!)分开做这些事情

密码加密(或在本例中为哈希)将使可能访问您数据库的黑客无法使用您的用户密码。散列函数是一种方法-您可以从密码创建散列,但不能从散列创建密码。从散列中获取密码的唯一方法是对每个可能的字符组合进行散列,并检查该散列是否等于db中的值。大多数uf用户在php中使用简单的md5()或sha256()函数。事实上,它是有效的,但这些函数的问题在于它们的简单性。创建这些文件是为了计算文件的校验和,所以它们一定很快。这就是为什么暴力变得更容易。为了避免被野蛮强迫,您可以:

a) 添加“salt”并继续使用md5/sha256。Salt是散列之前添加到用户密码中的随机字符串。您必须在数据库中创建附加列,例如“密码”附近。每个用户应随机获得至少32个字符长的盐。“密码”字段是使用md5(salt.users\u密码)创建的。如果您想在登录时检查密码-从数据库获取密码和salt字段,从post获取用户密码,并将:md5(salt.user\u password\u from\u post)与数据库中的“password”进行比较。即使用户的密码很短,由于盐的原因,它也会变得很长很复杂。要破解/暴力破解所有8个字符的密码,您只需要~80^8个哈希,但要暴力破解盐渍8个字符的密码,您需要~80^40,这是80^32倍长

b) 使用河豚算法 河豚是从Begging密码到crypt密码创建的。您还必须使用salt,但您还可以指定“cost”参数,该参数指示哈希的复杂程度。更复杂=每次密码检查时cpu使用量更多,但也更安全。用河豚鱼保护密码,16字节的盐和至少10个成本被认为是安全的

为了避免被sql注入,您应该转义传递给查询的每个参数。 mysql\u real\u escape\u string()将成为您的朋友

$Query = sprintf("SELECT UserId, Password, Salt FROM Users WHERE Username='%s'", mysql_real_escape_string($_POST['Username']));
mysql_query($Query);
如果

$_POST['Username'] = "'; DROP TABLE Users; --"
不转义的查询将变成:

"SELECT UserId, Password, Salt FROM Users WHERE Username=''; DROP TABLE Users; --'
通过此查询,任何用户都可以毫无问题地销毁您的数据库。使用mysql\u real\u escape\u字符串,查询将看起来像loke:

"SELECT UserId, Password, Salt FROM Users WHERE Username='\'; DROP TABLE Users; --'
现在您的数据库是安全的

检查密码的完整代码(数据库中应包含用户名(128)、密码(32)和salt(32)):

防止SQL注入使用,而不是加密!正确地说,您也不加密存储密码,而是将其散列。最好的办法是。
"SELECT UserId, Password, Salt FROM Users WHERE Username='\'; DROP TABLE Users; --'
function CheckPassword($Username, $Password)
{
    list($Count) = mysql_fetch_array(mysql_query(sprintf("SELECT COUNT(*) FROM Users WHERE Username='%s'", mysql_real_escape_string($Username))));
    if(!$Count)
        return false; //No such user
    list($Password_Db, $Salt) = mysql_fetch_array(mysql_query(sprintf("SELECT Password, Salt FROM Users WHERE Username='%s'", mysql_real_escape_string($Username))));
    if(md5($Salt . $Password) == $Password_Db)
        return true;
    return false;
}