如何使我的PHP文件正确地从数据库调用密码?

如何使我的PHP文件正确地从数据库调用密码?,php,mysql,encryption,Php,Mysql,Encryption,我目前正在一个网站上工作,它有一个注册PHP文件,可以将数据发送到数据库。为了安全起见,我设置了一个密码加密文件,对用户输入的密码进行加密,这样就不可能在数据库中找到密码。不幸的是,当用户试图从登录PHP文件连接到数据库时,它会拒绝他们登录,因为代码连接到数据库密码,但它不会从其加密代码中“清理”密码,并且服务器无法识别密码。我将在下面提供我的代码: Signup.php $p = $_POST['p']; $cryptpass = crypt($p); include_once ("p

我目前正在一个网站上工作,它有一个注册PHP文件,可以将数据发送到数据库。为了安全起见,我设置了一个密码加密文件,对用户输入的密码进行加密,这样就不可能在数据库中找到密码。不幸的是,当用户试图从登录PHP文件连接到数据库时,它会拒绝他们登录,因为代码连接到数据库密码,但它不会从其加密代码中“清理”密码,并且服务器无法识别密码。我将在下面提供我的代码:

Signup.php

$p = $_POST['p'];    
$cryptpass = crypt($p);
include_once ("php_includes/randStrGen.php");
$p_hash = randStrGen(20)."$cryptpass".randStrGen(20);
Login.PHP

$p = md5($_POST['p']);
如何更改上面提供的Login.PHP行,以便将密码从其加密值净化为用户实际知道并首先输入的密码


p、 s.$p=用户输入的密码

除非您也将加密密码保存在数据库中,否则不要将加密密码与随机字符连接起来,否则-您将永远无法将用户输入与保存的加密密码进行比较。只需使用:

$p_hash = $cryptpass;
并且在Login.php脚本中不要使用
md5($\u POST['p'])
这是不同的哈希方法,但也使用
crypt()
函数:

$p = crypt($_POST['p']);

好的,一旦您从用户那里获得了密码,您将希望在插入数据库时对其进行加密。这需要一段额外的数据,称为“salt”。 盐是独一无二的,你可以决定你想要什么。但是你需要它来加密和解密,所以重要的是你不要丢失它!我将它保存在自己的文件中,并在需要时使用include。下面是PHP

 $key_salt = 'lettersandnumbers';
现在是密码加密 假设你在变量中有用户名和密码,比如

 $user_id = "usersId";
 $password = "usersPassword";
这是将它们放入数据库的方法。。。 使用以下数据创建一个变量

 $insertdata = sprintf("INSERT INTO $table (user_id, password,) VALUES ('%s', AES_ENCRYPT('%s', '$key_salt'))", $user_id, $password);
 mysql_query($insertdata);
请注意
AES\u ENCRYPT('%s','$key\u salt')
这就是进行加密的原因,并查看它如何使用
$key\u salt
以及
'%s'
(即
$password

这些因素的结合使它几乎不可能破裂

这将解密密码并将其放入一个变量中,然后您可以使用它执行您想要的操作

 $results = mysql_query("
    SELECT AES_DECRYPT(password, '$key_salt') as password FROM $table where AES_DECRYPT(password, '$key_salt')='$password'");
 $row = mysql_fetch_array($results);
 $decryptedpassword = $row['password'];

我将在这里添加第二个答案,当涉及到从数据库中插入或提取的任何用户输入时,它更像是一个安全防护。当您
MySql
时,您希望清理任何用户输入,以防止数据库注入,这是入侵数据库的最简单方法

这是一个很棒的卫生脚本。首先制作一个单独的PHP文件,并将此代码复制/粘贴到其中

<?php
// Sanitize User Input
function sanitize($data){

    // apply stripslashes if magic_quotes_gpc is enabled
    if(get_magic_quotes_gpc()){ 
        $data = stripslashes($data);
    }
    // a mySQL connection is required before using this function
    $data = mysql_real_escape_string($data); 

    return $data;
}
?>
要清理此输入,请执行以下操作

 $password = sanitize($password);
这有助于通过删除与修改或显示数据库信息相关的某些字符来防止MySql注入


希望这有帮助

你应该更多地了解你的密码加密方法…加密和解密时有一些标准。好的。从你所看到的,我显然不是专家。你还有别的推荐方法吗?是的…给我几分钟好的。非常感谢大家,我给你们的答案让你们能够将密码解密回原来的可读格式。如果你只想加密,而不想解密,那么你可以在插入数据库之前对密码进行加密和散列。当用户输入密码时,它会被脚本加密,加密的密码会存储在数据库中。我不确定这是否是最好的方法,但我对PHP还不太熟悉,我还没有达到像HTML和CSS那样的“跳出框框思考阶段”。你知道一套预先制作的、稳定的注册和登录PHP文件集吗?实际上,我总是自己写注册和登录程序,所以我不知道有任何预先制作的、准备好的插件文件适合你。好的。我不是很擅长PHP,但我只是想创建一个允许用户注册、激活帐户、登录和注销的网站。我已经使所有这些成为可能,除了在部分签名。当用户想要登录时,我的密码加密系统无法工作。当用户想要登录时,我需要找到一种解密密码的方法。好的。那么,如果我当前的加密文件名为“RandStrGen.php”,那么我会用它来代替“lettersandNumber”吗?那是我的盐锉。除此之外,我什么都懂。旁注:不应该“加密”,而应该“散列”密码。正确的是,
$key\u salt
只是一个变量,您可以创建它并将其放入自己的单独文件中。然后将该文件包含在您要加密或解密的任何页面上。@Fred ii-这是一个有待讨论的问题,我们可以在这里坐上很长一段时间来回讨论。王晓云在2005年发表了一篇针对散列的有效碰撞攻击,现在它的强度被认为大大低于它的设计强度——因此在密码术语中它是“坏的”。我发现这篇文章非常有趣@维迪辛兹伯特福!很抱歉反应太晚,非常感谢。我真的很感谢你抽出时间。
 $password = $_POST["password"];
 $password = sanitize($password);