Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/198.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 在android上加密密码并存储在DB中_Php_Android_Mysql_Encryption_Passwords - Fatal编程技术网

Php 在android上加密密码并存储在DB中

Php 在android上加密密码并存储在DB中,php,android,mysql,encryption,passwords,Php,Android,Mysql,Encryption,Passwords,我已经为android建立了一个完整的注册/登录系统,一切都是通过无线和服务器端数据库进行的,问题是现在我的密码被直接保存到数据库中(没有加密),我搜索了大量的网站、软件帖子和线程,但实际上没有任何帮助 我读过关于md5和sha1、河豚和bcrypt的书,但无法理解这种晶相图的正确实现 连接是使用php请求进行的。注册码如下: if($_SERVER['REQUEST_METHOD']=='POST'){ $username = $_POST['username']; $password =

我已经为android建立了一个完整的注册/登录系统,一切都是通过无线和服务器端数据库进行的,问题是现在我的密码被直接保存到数据库中(没有加密),我搜索了大量的网站、软件帖子和线程,但实际上没有任何帮助

我读过关于md5和sha1、河豚和bcrypt的书,但无法理解这种晶相图的正确实现

连接是使用php请求进行的。注册码如下:

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';
 }
 }

除了飞地,一切都很好。有人能给我指点迷津吗?我了解到它需要两个方面,一个来自客户端(android应用程序),一个来自php服务器端,所以它是这样的,在DB中存储密码时,使用任何散列或加密,如bcrypt、md5、sha1,并将其存储在数据库中。 当用户想要登录时,再次使用相同的散列或加密机制将数据库中存储的值与用户传递的值进行比较。 如果是,则成功登录

那么现在,

您对insert的查询将显示如下内容:

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

然后使用Bcrypt

示例如所示

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

要加密密码,可以使用函数。 在您的注册码中,在插入查询之前添加以下内容:

$options = [
'cost' => 12,
];
$password = password_hash($password, PASSWORD_BCRYPT, $options);
这将使用BCRYPT算法对注册时通过POST数组接收到的密码进行加密。 BCRYPT算法生成60个字符的散列(将输入字符串切割为70个字符),因此,在数据库中,需要有一个字符(60)密码字段来存储散列后的密码

不过,您也可以在$options中添加自己的salt,如php文档中所述

强烈建议您不要为此函数生成自己的salt。如果您未指定安全盐,它将自动为您创建安全盐。 如上所述,在PHP7.0中提供salt选项将生成一个弃用警告。在未来的PHP版本中,可能会删除对手动提供salt的支持

现在数据库中已经有了加密密码,在登录脚本中,您需要从数据库中检索哈希密码,然后使用函数将其与输入的密码进行比较:

$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)";

你会找到关于PasWordDHASH()和PaseWordVIEFIFY()的所有信息,但请考虑:

  • 当通过POST数组发送到服务器时,密码在登录和注册时仍然易受攻击。因此,您应该安装一个证书,以便使用HTTPS协议对从服务器流向客户机和viceversa的数据进行加密(查看apache下的configure ssl)
  • 您没有对输入采取任何预防措施,因此,您的代码容易受到攻击。我建议当您有未经测试的数据时,使用或准备好的语句来查询数据库

  • 我已经试过了,但是md5太弱了,我想要一个更好的加密方法。。你知道吗?
    password\u hash
    是一个正确的选项,它与“md5”和“sha1”从来没有任何关系。我也读过关于bcrypy的文章,我的问题是:如何将用户输入的密码与数据库中的密码(已加密)相匹配?我成功地加密了密码并将其存储在DB中,但如何验证密码以登录@Narutoi试图立即实现这一点,密码部分和验证正在工作,但它总是给出无效的用户名-并且它总是打印“登录”回音@sebastianoi在登录代码中忘记了not运算符,对此表示抱歉。现在应该很好了,非常感谢,效果很好!从早上开始就在寻找匹配他们的方法。。你能告诉我我是否能证明这种安全性吗?(你提到)我应该使用mysqli,我已经在使用mysqli了。还有appache下的ssl,还有什么我可以补充的吗@sebastiano我对ssl知之甚少(但我只是一名学生),而且我从未实现过它,因为证书不像我知道的那么免费。顺便说一句,您可以添加准备好的语句(您使用的是mysqli,但不是准备好的语句),这将阻止几乎所有的注入攻击。查看mysqli的准备语句教程,这是一个简单的概念:)很棒的概念,已经实现了!简单但有效,我甚至没有在查询中引入变量,我喜欢它!听起来你好像很困惑。加密是双向的,加密哈希是单向的。调用MD5或bcrypt加密是错误的,可能是绊倒您的原因之一。
    $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)";