基本 php/db 密码加密
Basic php/db password encryption
已经为我的 android 应用程序的 login/register 功能设置了两个简单的 php 文件。
我想知道一个简单的方法来获取 save/write mysql 数据库的加密密码。目前它只写密码的纯文本。
register.php 的代码是:
$username = $_POST["username"];
$email = $_POST["email"];
$password = $_POST["password"];
$statement = mysqli_prepare($con, "INSERT INTO User (username, email, password) VALUES (?, ?, ?)" );
mysqli_stmt_bind_param($statement, "sss", $username, $email, $password);
mysqli_stmt_execute($statement);
mysqli_stmt_close($statement);
mysqli_close($con);
登录代码是:
$password = $_POST["password"];
$username = $_POST["username"];
$statement = mysqli_prepare($con, "SELECT * FROM User WHERE username = ? AND password = ?");
mysqli_stmt_bind_param($statement, "ss", $username, $password);
mysqli_stmt_execute($statement);
mysqli_stmt_store_result($statement);
mysqli_stmt_bind_result($statement, $userID, $username, $email, $password);
$user = array();
while(mysqli_stmt_fetch($statement)) {
$user[username] = $username;
$user[email] = $email;
$user[password] = $password;
}
echo json_encode($user);
mysqli_stmt_close($statement);
mysqli_close($con);
我知道的非常简单的问题,但只是我自己学习。谢谢
编辑:
根据 Jamesking56 的 link/ 回复,我得出了这个结果,但现在它根本不写入数据库:
$username = $_POST["username"];
$email = $_POST["email"];
$password = $_POST["password"];
$passwordHash = password_hash($password, PASSWORD_DEFAULT);
$statement = mysqli_prepare($con, "INSERT INTO User (username, email, password) VALUES (?, ?, ?)" );
mysqli_stmt_bind_param($statement, "sss", $username, $email, $passwordHash);
mysqli_stmt_execute($statement);
mysqli_stmt_close($statement);
mysqli_close($con);
如果您使用的是 PHP 5.5 或更高版本,则有一些内置的密码散列函数称为 password_hash()
和 password_verify()
。
切勿单独使用 MD5 或 SHA1 进行密码哈希处理,因为它们可以通过使用彩虹表来逆转。
您应该使用带有您定义的秘密的散列机制,它会为您的应用程序提供唯一的散列。您创建的 'secret' 绝不能通过 VCS 共享。
可以在这里找到一篇关于此的好文章:http://www.phptherightway.com/#password_hashing
对于使用低于 5.5 的 PHP 版本的任何人,您可以使用 crypt()
:
http://php.net/manual/en/function.crypt.php
PHP 2015 年 9 月 14 日起将不再支持 5.4,因此请考虑升级到 5.5。
已经为我的 android 应用程序的 login/register 功能设置了两个简单的 php 文件。
我想知道一个简单的方法来获取 save/write mysql 数据库的加密密码。目前它只写密码的纯文本。
register.php 的代码是:
$username = $_POST["username"];
$email = $_POST["email"];
$password = $_POST["password"];
$statement = mysqli_prepare($con, "INSERT INTO User (username, email, password) VALUES (?, ?, ?)" );
mysqli_stmt_bind_param($statement, "sss", $username, $email, $password);
mysqli_stmt_execute($statement);
mysqli_stmt_close($statement);
mysqli_close($con);
登录代码是:
$password = $_POST["password"];
$username = $_POST["username"];
$statement = mysqli_prepare($con, "SELECT * FROM User WHERE username = ? AND password = ?");
mysqli_stmt_bind_param($statement, "ss", $username, $password);
mysqli_stmt_execute($statement);
mysqli_stmt_store_result($statement);
mysqli_stmt_bind_result($statement, $userID, $username, $email, $password);
$user = array();
while(mysqli_stmt_fetch($statement)) {
$user[username] = $username;
$user[email] = $email;
$user[password] = $password;
}
echo json_encode($user);
mysqli_stmt_close($statement);
mysqli_close($con);
我知道的非常简单的问题,但只是我自己学习。谢谢
编辑:
根据 Jamesking56 的 link/ 回复,我得出了这个结果,但现在它根本不写入数据库:
$username = $_POST["username"];
$email = $_POST["email"];
$password = $_POST["password"];
$passwordHash = password_hash($password, PASSWORD_DEFAULT);
$statement = mysqli_prepare($con, "INSERT INTO User (username, email, password) VALUES (?, ?, ?)" );
mysqli_stmt_bind_param($statement, "sss", $username, $email, $passwordHash);
mysqli_stmt_execute($statement);
mysqli_stmt_close($statement);
mysqli_close($con);
如果您使用的是 PHP 5.5 或更高版本,则有一些内置的密码散列函数称为 password_hash()
和 password_verify()
。
切勿单独使用 MD5 或 SHA1 进行密码哈希处理,因为它们可以通过使用彩虹表来逆转。
您应该使用带有您定义的秘密的散列机制,它会为您的应用程序提供唯一的散列。您创建的 'secret' 绝不能通过 VCS 共享。
可以在这里找到一篇关于此的好文章:http://www.phptherightway.com/#password_hashing
对于使用低于 5.5 的 PHP 版本的任何人,您可以使用 crypt()
:
http://php.net/manual/en/function.crypt.php
PHP 2015 年 9 月 14 日起将不再支持 5.4,因此请考虑升级到 5.5。