让我的网站更安全,我使用password_hash是否正确?

时间:2015-03-01 13:18:40

标签: php

我有一个非常小的网站,最近我一直试图让它更安全,我曾经用纯文本存储我的密码。

我认为我做得对,但作为一个爱好"程序员我想确保所以我问你,专业人士

当用户注册时,我执行:password_hash($their_password, PASSWORD_DEFAULT)并将其存储在“密码”中。 users表中的列。 根据php.net,我使用PASSWORD_DEFAULT似乎是最好的。

  

请注意,此常量旨在随着时间的推移而改变,因为新的和更强大的算法被添加到PHP中。"

听起来不错!

登录部分(非常简单):

if (count($_POST) > 0) {

$username = trim($_POST['username']);
$password = trim($_POST['password']);

$query = $db->prepare("SELECT password FROM users WHERE username = ?");
$query->execute(array($username));
$row = $query->fetch();

if (password_verify($password, $row['password'])) {
    echo "Correct password";
    // create session...
} else {
    // wrong password
}

也许我应该先检查一下用户名是否存在,但除此之外你怎么想?

2 个答案:

答案 0 :(得分:2)

您似乎完全理解了文档以及如何构建所需的代码。你甚至暂时使用明文密码也感到羞耻,但你决定使用正确的方法(即不是md5 me 一个愚蠢的人 (我真的需要更新我的密码保存系统...) )很棒。

我能看到的唯一问题是有些人的密码可能以空格开头或结尾。这样的密码会丢失它们的前导/尾随空格,实际上用户可能会惊慌地发现它们可以用两个空格登录,或者没有空格!因此,最好删除trim次调用;)

答案 1 :(得分:-3)

你好:)我也是一个爱好者,我想我可以指出你正确的方向,尽管不太了解魔术是如何发生的。 1)用户输入密码,程序使用某种方法加密,并保存加密密码。 2)bam。 NOBODY可以看到原件是什么 - 甚至不是输入它的用户。在登录时,重复该操作,并且“用户登录的任何密码”密码都由相同的进程加密,然后将其与加密的已保存密码进行比较。如果它们是相同的未加密原件,它们应匹配。

为了提高安全性,有时会在加密过程中“添加”称为“盐”的东西,以使其更难破解密码。不知怎的,有人拿到你的加密代码和加密的密码列表,并试图通过逆向工程代码来恢复这个过程?那么,现在那个人有额外的工作来找到你的“盐”...(它可能是一个保存在你的服务器中的字符串,一个聪明的“玩月份日期”技巧等等...许多选项) 。这是我记得的内容。很多指示可以帮助您入门。还有更多:

我用这个:几年前从互联网的某个地方获得的

 function encryptTheString($password, $salt, $iter_count=4096, $keylen=64,         $hash_alg= 'sha256' ) 
 {
     // Compute the length of hash alg output.
     // Some folks use a static variable and save the value of the hash len.
     // Considering we are doing 1000s hmacs, doing one more won't hurt.
     $hashlen = strlen(hash($hash_alg, null, true));

     // compute number of blocks need to make $keylen number of bytes
     $numblocks = ceil($keylen / $hashlen);

     // blocks are appended to this
     $output = '';
     for ($i = 1; $i <= $numblocks; ++$i) {
         $block = hash_hmac($hash_alg, $salt . pack('N', $i), $password, true);
         $ib = $block;
         for ($j = 1; $j < $iter_count; ++$j) {
             $block = hash_hmac($hash_alg, $block, $password, true);
             $ib ^= $block;
         }
         $output .= $ib;
     }

     // extract the right number of output bytes
     return substr($output, 0, $keylen);
 }

这样的电话
$ePassword=ANDYETpbkdf2($password,"111111111122222222223333333333444444444455555555566666666661234");

完全没问题:)给sha256一个读数,以便进一步启蒙。