如何将哈希密码插入数据库?

时间:2015-12-15 12:51:31

标签: php

我如何能够将散列密码插入数据库而不是明文?

(我尝试用' SHA2('?',256')')替换'?&#39 ;.

还要包括一些解释,谢谢!

$query= $con->prepare("INSERT INTO `useracct` (`email`, `password`, `name`) VALUES (?,?)");
$email = $_POST["email"];
$psswd = $_POST["passd"];
$name = $_POST["name"];

$query->bind_param('bb', $email, $psswd, $name);
if ($query->execute()) {
  echo "Query executed.";
}else{
  echo "Query error.";
}

6 个答案:

答案 0 :(得分:4)

您可以尝试:

$query= $con->prepare("INSERT INTO `useracct` (`email`, `password`, `name`) VALUES (?,?,?)");
$email = $_POST["email"];
$psswd = PASSWORD_HASH($_POST["passd"], PASSWORD_DEFAULT);
$name = $_POST["name"];

$query->bind_param('bbb', $email, $psswd, $name);
if ($query->execute()) {
  echo "Query executed.";
} else{
  echo "Query error.";
}

我使用PHP的PASSWORD_HASH函数来散列密码,PHP 5.5及更高版本支持此功能。更多信息:http://php.net/manual/en/ref.password.php

另一种散列密码的方法是PHP的crypt()函数,从PHP 4开始支持。更多信息可以在这里找到:http://php.net/manual/en/function.crypt.php

答案 1 :(得分:0)

替换下面的

$query->bind_param('bb', $email, $psswd, $name);

$query->bind_param('bbb', $email, $psswd, $name);

由于您使用的是三个变量,因此您还应使用三种数据类型。

答案 2 :(得分:0)

$query= $con->prepare("INSERT INTO `useracct` (`email`, `password`, `name`) VALUES (?,?,?)"); //missing one parameter here
$email = $_POST["email"];
$psswd = $_POST["passd"]; 
$hash = password_hash($password, PASSWORD_DEFAULT); 
$name = $_POST["name"];
$query->execute([$email, $hash, $name]);

答案 3 :(得分:0)

使用 PASSWORD_HASH 进行哈希

$query= $con->prepare("INSERT INTO `useracct` (`email`, `password`, `name`) VALUES (?,?,?)");
$email = $_POST["email"];
$psswd = $_POST["passd"];
$name = $_POST["name"];

$query->bind_param('bbb', $email, PASSWORD_HASH($psswd, PASSWORD_DEFAULT), $name);
if ($query->execute()) {
  echo "Query executed.";
}else{
  echo "Query error.";
}

验证用途

// See the password_hash() example to see where this came from.
$hash = '$2y$07$BCryptRequires22Chrcte/VlQH0piJtjXl.0t1XkA8pw9dMXTpOq';

if (password_verify('rasmuslerdorf', $hash)) {
    echo 'Password is valid!';
} else {
    echo 'Invalid password.';
}

答案 4 :(得分:0)

    $(function () {
    var data = [
       { "id" : "ajson1", "parent" : "#", "text" : "Simple root node" },
       { "id" : "ajson2", "parent" : "#", "text" : "Root node 2" },
       { "id" : "ajson3", "parent" : "ajson2", "text" : "Child 1" },
       { "id" : "ajson4", "parent" : "ajson2", "text" : "Child 2" },
    ];
    $("#jstree").jstree({
     "core" : {
       "check_callback" : true,

        "data": data
     },
    "plugins" : [ "contextmenu",  "dnd"],

        contextmenu: {
            items: function ($node) {
                return {
                    createItem: {
                        separator_before: false,
                        separator_after: false,
                        label: "Создать",
                        submenu: {
                            create: {
                                separator_before: false,
                                separator_after: false,
                                label: "Создать на текущем уровне",
                                action: function() {
                                    Create($node.parent);
                                }
                            },
                            createChild: {
                                separator_before: false,
                                separator_after: false,
                                label: "Создать потомка",
                                action: function() {
                                    Create($node.id);
                                }
                            }
                        }
                    },
                    editItem: {
                        separator_before: false,
                        separator_after: false,
                        label: "Редактировать",
                        action: function() {
                            Edit($node.id);
                        }
                    },
                    deleteItem: {
                        separator_before: false,
                        separator_after: false,
                        label: "Удалить",
                        action: function() {
                            Delete($node.id);
                        }
                    },
                    detailGraphItem: {
                        separator_before: false,
                        separator_after: false,
                        label: "Перейти к графу",
                        action: function() {
                            DetailGraph($node.id);
                        }
                    }
                }
            }
        }

  }).on('create_node.jstree', function(e, data) {
    console.log('saved');
});
$("#sam").on("click",function() {
     $('#jstree').jstree().create_node('#' ,  { "id" : "ajson5", "text" : "newly added" }, "last", function(){
    alert("done");
 });
});
});

像这样使用,在查询中使用$psswd = $_POST["passd"]; $psswd1 =password_hash("passwd"); 代替$psswd1

答案 5 :(得分:-1)

这有多个答案,但我觉得它们涵盖如何,但不是为什么。我将尝试省略有关数据库处理程序或加密函数的详细信息,因为它们会随着时间的推移而发生变化。

其他答案演示的要点是你想在PHP中创建哈希,而不是在MySQL中。这样做的原因是如果你在MySQL中创建哈希,那么PHP需要向MySQL发送明文密码,这只是攻击者可以利用的另一个向量。

然后将密码保存为任何其他字符串。哈希密码的方法有多种,通常你需要存储哈希密码和盐。

例如:

$salt = bin2hex(random_bytes(16));
$passwordHash = sha1('123456' . $salt);

然后您的查询将会显示如下内容:

INSERT INTO ... (..., password, salt) VALUES (..., $passwordHash, $salt)

这有助于在攻击者知道密码哈希值时找不到密码;存储普通哈希值的问题是它容易受到彩虹表攻击的影响,常见的字符串已经映射到它们的哈希值,因此可以通过哈希值搜索原始字符串。

编辑:请参阅Jay Blanchard的评论,了解使用5.5中内置于PHP中的函数的更新方法。