最近我一直试图在我在互联网上偶然发现的登录脚本中实现我自己的安全性.在努力学习如何制作我自己的脚本为每个用户生成一个盐之后,我偶然发现了password_hash.
根据我的理解(基于本页的阅读:http://php.net/manual/en/faq.passwords.php),当您使用password_hash时,已经在行中生成了salt.这是真的?
我的另一个问题是,含有2种盐是不是很聪明?一个直接在文件中,一个在DB中?这样,如果有人在数据库中泄露了你的盐,你仍然直接在文件中?我在这里读到,存储盐绝不是一个明智的想法,但它总是让我困惑的是人们的意思.
更新:请注意,在不安全的HTTP和加密的HTTPS页面之间切换的每个网站都不可避免地容易出现SSL剥离.请考虑在整个站点使用HTTPS,虽然这既不能阻止SSL-strip,但至少这样可以让用户安全地调用站点,如果他在意的话.对于需要切换的站点,此方法可能仍是最佳选择.
这是一种常见的情况,即网站包含敏感数据的页面,只能使用HTTPS协议1访问,而其他页面应使用非关键数据访问.
我找到了一个解决方案,允许在安全和非安全页面之间切换,同时保持会话,并想要询问有关该概念中的缺陷的任何提示.你可以在这里找到整篇文章: 使用SSL安全会话cookie (当然我也很高兴听到,这是安全的).
问题
HTTPS确保客户端和服务器之间没有人可以窃听我们的通信并防止中间人攻击.不幸的是,这不适用于session-cookie,它也被发送到未加密的请求.
PHP使用参数$ secure提供函数session_set_cookie_params(...).这就是我们所需要的,但是当我们切换到不安全的页面时,它会让我们忘记我们的会话.
身份验证Cookie
身份验证cookie的想法是,当用户输入密码(增加其访问权限)时,我们会在不安全的会话cookie之外创建第二个cookie,并确保只有加密的HTTPS页面才能访问它.
https://www.example.com/login.php
<?php
session_start();
// regenerate session id to make session fixation more difficult
session_regenerate_id(true);
// generate random code for the authentication cookie and store it in the session
$authCode = md5(uniqid(mt_rand(), true));
$_SESSION['authentication'] = $authCode;
// create authentication cookie, and restrict it to HTTPS pages
setcookie('authentication', $authCode, 0, '/', '', true, true);
print('<h1>login</h1>');
...
?>
Run Code Online (Sandbox Code Playgroud)
现在,每个页面(HTTPS和HTTP)都可以读取不安全的会话cookie,但是包含敏感信息的页面可以检查安全身份验证cookie.
https://www.example.com/secret.php
<?php
session_start();
// check that the …Run Code Online (Sandbox Code Playgroud) 访问 Google-Drive 时,访问令牌可能会过期,我们可以使用刷新令牌来获取新的访问令牌。不过,刷新令牌本身停止工作或过期的可能原因有很多,请参阅:
https://developers.google.com/identity/protocols/OAuth2#expiration
所以我的问题是,如果刷新令牌在 6 个月后过期会发生什么,我如何检测它?刷新访问令牌的请求是否因403 禁止而失败,或者是否返回包含错误消息的 JSON,或者其他内容?
不幸的是很难找到这方面的任何信息,要测试它必须等待 6 个月......
解决方案:
感谢 Gary Archers 的回答,我可以使用无效的刷新令牌来产生这种情况,这是我得到的响应,也许它可以帮助其他人:
HTTP-status-code: 400
JSON:
{
"error": "invalid_grant",
"error_description": "Bad Request"
}
Run Code Online (Sandbox Code Playgroud) 我认为如何在数据库中存储密码的建议存在矛盾.我们对密码进行哈希并将其存储在DB中,当用户尝试登录时,我们以相同的方式对其输入字符串进行哈希并与数据库进行比较.没关系.但是有建议通过添加随机盐来强化该哈希值.这里是问题:所以我们失去了整个比较点,因为在存储在DB中的第一个哈希值和登录时的盐之间的盐值会有所不同吗?如果将盐储存在Db中,那么腌制的好处是什么?
php ×2
c# ×1
cryptography ×1
encryption ×1
google-oauth ×1
hash ×1
https ×1
oauth ×1
oauth-2.0 ×1
onedrive ×1
salt ×1
sha ×1
ssl ×1