我有一个非常小的网站,最近我一直试图让它更安全,我曾经用纯文本存储我的密码。
我认为我做得对,但作为一个爱好"程序员我想确保所以我问你,专业人士
当用户注册时,我执行: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
}
也许我应该先检查一下用户名是否存在,但除此之外你怎么想?
答案 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一个读数,以便进一步启蒙。