<HTML> <!-- Formulario de Login-->
<input name="token" id="token" type="hidden" value='<?= md5(time()); ?>'>
</HTML>
<?PHP /*Página de inicio de sesión */
/* Si las credenciales de usuario se validan se abre una sesión y */
/* se agrega el token a la variable $_SESSION .*/
$token = crypt($_POST['token']);
$_SESSION["token"] = $token;
?>
令牌可以存储在数据库、用户表中并在安全文件中进行比较,令牌的特性是每个用户和每个会话都是唯一的
<?PHP /*Página de control */
....
$result = $stm->fetch(PDO::FETCH_ASSOC);
$token= $result['Token'];
if ($_SESSION["token"] != $token ) {
header("Location: login.php");
exit();
}
?>
我找到了一个 Stackoverflow 英文答案,它回答了Secure hash and salt for PHP passwords问题。
投票最多的答案是您不应该使用 SHA1、MD5 或 SHA256 进行哈希,因为现代破解者每秒可以超过 1800 亿次哈希,因此破解它并不难。
而投票第二多的建议不要自己写机制,而是使用 PHP 函数
password_hash()
。示例password_hash()
:BCRYPT 算法将创建一个最多 72 个字符的字符串,每次加密时都不同,因此要检查输入的密码是否正确,我们必须使用以下函数
password_verify()
:最好的选择(根据 PHP 手册)是使用password_hash()加密密钥,然后使用password_verify()从数据库中检索它
尽管包含您自己的 $salt 的选项包含在 password_hash() 函数中,但建议不要使用盐并将其留给 PHP,它会自动生成一个盐,并且比我们可以包含的任何类型的盐安全得多以我们自己发生的任何方式。事实上,在 PHP 手册的各个部分中,强烈要求不要使用自己的 salt 作为转储到此函数的键,因为这会削弱其强度。(事实上,在 PHP 7 版本中,这个选项已经被认为是过时的并且会在运行时抛出一个错误)。
至于可以添加的“成本”参数,它是一种附属的安全措施,但必须根据使用该功能的服务器来考虑,因为服务器上的工作量是创建更强密钥的哈希.
建议的代码是:
一般来说,12 的成本是相当安全的,并且产生的服务器工作负载是可以容忍的(作为一般规则,在某些情况下,需要执行各种测试来评估“函数在交互式系统上花费的时间少于 100 毫秒。 “-SIC-)。如果未指示包含所述成本的数组(它必须是是或包含在数组中),则其值为 10 作为默认值。
验证从数据库检索到的密钥与用户输入的密钥的示例如下:
与往常一样,如果您需要更多信息,最好访问源代码:PHP.NET - Password_hash() 函数
补充 Carlos Quiroga 的回答,一个很好的可能性是使用基于用户密码的动态盐。例如:
但是,将密码安全地保存在数据库中并不是唯一需要担心的事情,因为您必须涵盖可能攻击的不同弱点。一种可能性是在登录页面上使用随机创建的安全令牌来防止 CSRF 类型的攻击。这将是一个非常简短和简单的示例,但说明了这个想法是什么:
令牌可以存储在数据库、用户表中并在安全文件中进行比较,令牌的特性是每个用户和每个会话都是唯一的
这样,您就有了一个加密的用户密码和一个其他人都不知道的动态密码。
尝试:
看看这个链接:
http://www.solingest.com/blog/store-passwords-in-mysql
有什么问题
SHA-2
?也许你的意思是这个家庭SHA-1
很脆弱(没错) 推荐的最小值是SHA256
. 但它越好,您将拥有更好的安全性。事实上,它被认为SHA512
是Salt
非常安全的。测试
md5($var);
很安全,你可以在这里阅读更多http://php.net/manual/es/function.md5.php
我突然想到,您可以记录一个零块或另一个字符并使用 php mcrypt 模块对其进行加密,当用户输入密码时,程序只需检查该块是否保留在原始字符中