2016-03-27 131 views
1

我已经为Android创建了一个完整的工作注册/登录系统,一切都在空中和服务器端数据库,问题是,现在我的密码正在直接保存到数据库(没有ecnryption),我搜索了大量的网站和SoF的帖子和线程,但没有任何实际上帮助我。加密密码并存储在数据库中android

我也读到了MD5和SHA1,河豚和bcrypt,但使用PHP请求无法理解这样的crytography的正确执行..

连接而成。寄存器代码如下:

if($_SERVER['REQUEST_METHOD']=='POST'){ 
$username = $_POST['username']; 
$password = $_POST['password']; 
$email = $_POST['email']; 
$Firstname = $_POST['fname']; 
$Lastname = $_POST['lname']; 
$Date = $_POST['Date']; 

require_once('db_config.php'); 




    $check_username_email = "SELECT * FROM Users WHERE Username ='$username' AND Email = '$email'"; 

$check_u_e = mysqli_fetch_array(mysqli_query($db,$check_username_email)); 

$check_username = "SELECT * FROM Users WHERE Username ='$username'"; 

$check_u = mysqli_fetch_array(mysqli_query($db,$check_username)); 

$check_email = "SELECT * FROM Users WHERE Email ='$email'"; 

$check_e = mysqli_fetch_array(mysqli_query($db,$check_email)); 

if(isset($check_u_e)){ 

echo 'Username AND Email already exist, please change them Both.'; 

} 

else if(isset($check_u)){ 

echo 'Username already exists, please change it.'; 

} 

else if (isset($check_e)){ 

echo 'Email already exists, please change it.'; 

} else{ 

$sql = "INSERT INTO Users(Email,Username,Bio,Password,Fname,Lname,Regiser_Date) VALUES ('$email','$username',NULL,'$password','$Firstname','$Lastname','$Date')"; 

if(mysqli_query($db,$sql)){ 

echo "You have been successfully Registered"; 

} else{ 

echo "Sorry, something went wrong - Try again."; 

} 
} 
}else{ 

echo 'Server error - Please try again later.'; 
mysqli_close($db); 
} 

和我的登录是在这里:

if($_SERVER['REQUEST_METHOD']=='POST'){ 
$username = $_POST['username']; 
$password = $_POST['password']; 

require_once('db_config.php'); 


$sql = "SELECT * FROM Users WHERE Username = '$username' AND Password = '$password'"; 

$result = mysqli_query($db,$sql); 

$check = mysqli_fetch_array($result); 

if(isset($check)){ 
echo 'Logged In'; 
} 
    else{ 
echo 'Failed to login'; 
} 
} 

一切都很好,除了encrytion。有人可以通过这个指导我吗?我读它需要双方,一个来自客户端(Android应用程序)和一个来自PHP服务器端

+0

听起来你对[加密术语]感到困惑(https://paragonie.com/blog/2015/08/you-wouldnt-base64-a-password-cryptography-decoded)。加密是双向的,加密哈希是单向的。调用MD5或bcrypt加密是错误的,可能是导致你绊倒的一部分。 –

回答

2

要加密,您可以使用password_hash功能的密码。 在您的注册代码添加以下插入查询之前:

$options = [ 
'cost' => 12, 
]; 
$password = password_hash($password, PASSWORD_BCRYPT, $options); 

这将加密密码recived使用BCRYPT算法上注册throught POST阵列。 BCRYPT算法生成60个字符散列(将输入字符串剪切为70个字符),因此,在数据库中,需要有一个CHAR(60)密码字段来存储散列的密码。

您还可以在$选择添加自己的盐然而,如PHP文件中写道

强烈建议您不要生成自己的这个功能的盐。如果你没有指定,它会自动为你创建一个安全的salt。 如上所述,在PHP 7.0中提供salt选项将生成弃用警告。手动提供盐的支持可能会在未来的PHP版本中被删除。

现在你已经在数据库中的加密的密码,在登录脚本,您需要从数据库retrive哈希密码,然后将其与password_verify()功能比较输入的密码:

$sql = "SELECT password FROM Users WHERE Username = '$username'"; 
$result = mysqli_query($db,$sql); 
if(!$row = mysqli_fetch_assoc($result)){ 
echo "failed to login(invalid username)"; 
die(); 
//login failed->add code to redirect to login page 
} 
if(password_verify($password, $row['password'])){ 
//password match the stored hash 
echo "logged in"; 
//sucessfully logged->retrive all additional data you need, save session, redirect to homepage etc... 
} 
else echo "failed to log in(invalid password)"; 

你会发现约password_hash所有信息()和password_verify()here但认为:

  1. 密码仍然在登录和注册脆弱的本质是当通过POST数组绑定到服务器。出于这个原因,你应该安装一个证书,以便使用HTTPS协议来加密从服务器流向客户端的数据,反之亦然(在apache下看一看here的配置SSL)
  2. 你没有采取任何预防措施输入如此,您的代码易受到injections的影响。我建议使用mysqliPDO准备好的语句用于查询数据库,当您有未经处理的数据时。
+0

我试图实现此目的,密码部分和验证正在工作,但它总是给出无效的用户名 - 它总是打印“登录”回声。 @sebastiano –

+1

我在登录代码中忘记了一个非操作符,对此很抱歉。现在应该没事吧 –

+0

谢谢你,这太棒了!一直在寻找一种方法来匹配他们自上午以来..你能告诉我,如果我能证明这个安全更多? (你提到)我应该使用mysqli,即时消息已经使用mysqli。和App下的ssl,还有什么我可以添加? @sebastiano –

0

所以它会是这样,而在DB中存储密码,使用任何哈希或encrption像bcrypt,MD5,SHA1和将其存储在数据库中。 当用户想要登录时,再次使用相同的哈希或加密机制比较它,数据库中存储的值与用户传递的值相匹配。 如果是,则成功登录。

所以现在,

您查询的插入会chnage这样的事情,

$sql = "INSERT INTO Users(Email,Username,Bio,Password,Fname,Lname,Regiser_Date) VALUES ('$email','$username',NULL,'md5($password)','$Firstname','$Lastname','$Date')"; 

而且

$sql = "SELECT * FROM Users WHERE Username = '$username' AND Password = 'md5($password)'"; 

然后用Bcrypt,

一个例子在

所示
$options = [ 
    'cost' => 12, 
]; 
echo password_hash("password", PASSWORD_BCRYPT, $options)."\n"; 

http://php.net/manual/en/function.password-hash.php

+0

我已经试过了,但md5太弱了,我想要一个更好的加密方法..你有什么想法吗? –

+0

'password_hash'是一个正确的选项,它从来没有任何关系,“md5”和“sha1” – Axalix

+0

我也读了关于bcrypy,我的问题是:我如何匹配用户输入的密码与密码(已加密)在DB内部?我成功地加密了密码并存储在数据库中,但是如何验证它们才能登录@Naruto –

相关问题