python保持登录状态_“保持登录状态”-最佳方法
小编典典
好的,让我直言不讳:如果您为此目的将用户数据或从用户数据派生的任何内容放入cookie,则表示您做错了。
那里。我说了。现在我们可以继续实际的答案了。
您问哈希用户数据有什么问题吗?好吧,它可归结为暴露表面和安全性。
想象一下您是攻击者。您会在会话中看到为“记住我”设置的加密cookie。宽度为32个字符。啧啧。那可能是MD5 …
我们还要想象一下,他们知道您使用的算法。例如:
md5(salt+username+ip+salt)
现在,攻击者所需要做的就是强行加“盐”(这实际上不是盐,但稍后会更多),他现在可以使用其IP地址的任何用户名生成他想要的所有伪造令牌!但是强行撒盐很难,对吗?绝对。但是现代的GPU非常擅长于此。并且除非您在其中使用足够的随机性(使其足够大),否则它将很快下降,并随即成为城堡的关键。
简而言之,唯一保护您的是盐,它并没有像您想的那样真正保护您。
可是等等!
所有这些都假定攻击者知道该算法!如果这是秘密且令人困惑,那么您就安全了,对吗? 错误 。这种思路有一个名字:“ 通过模糊实现安全” ,
永远不要 依赖它。
更好的方法
更好的方法是永远不要让用户的信息离开服务器,除了ID。
用户登录时,生成一个大的(128至256位)随机令牌。将其添加到将令牌映射到用户标识的数据库表中,然后将其发送到cookie中的客户端。
如果攻击者猜测另一个用户的随机令牌怎么办?
好吧,让我们在这里做一些数学运算。我们正在生成一个128位随机令牌。这意味着有:
possibilities = 2^128
possibilities = 3.4 * 10^38
现在,为了展示这个数字有多么荒谬,让我们想象一下互联网上的每台服务器(今天的数字是5000万)试图以每秒10亿的速度暴力破解该数字。实际上,您的服务器会在这样的负载下融化,但让我们来解决这个问题。
guesses_per_second = servers * guesses
guesses_per_second = 50,000,000 * 1,000,000,000
guesses_per_second = 50,000,000,000,000,000
因此,每秒50万亿次猜测。快!对?
time_to_guess = possibilities / guesses_per_second
time_to_guess = 3.4e38 / 50,000,000,000,000,000
time_to_guess = 6,800,000,000,000,000,000,000
6.8秒
让我们尝试将其归结为更友好的数字。
215,626,585,489,599 years
甚至更好:
47917 times the age of the universe
是的,这是宇宙年龄的47917倍…
基本上,它不会被破解。
所以总结一下:
我建议的更好的方法是将cookie分为三个部分存储。
function onLogin($user) {
$token = GenerateRandomToken(); // generate a token, should be 128 - 256 bit
storeTokenForUser($user, $token);
$cookie = $user . ':' . $token;
$mac = hash_hmac('sha256', $cookie, SECRET_KEY);
$cookie .= ':' . $mac;
setcookie('rememberme', $cookie);
}
然后,进行验证:
function rememberMe() {
$cookie = isset($_COOKIE['rememberme']) ? $_COOKIE['rememberme'] : '';
if ($cookie) {
list ($user, $token, $mac) = explode(':', $cookie);
if (!hash_equals(hash_hmac('sha256', $user . ':' . $token, SECRET_KEY), $mac)) {
return false;
}
$usertoken = fetchTokenByUserName($user);
if (hash_equals($usertoken, $token)) {
logUserIn($user);
}
}
}
注意:不要使用令牌或用户和令牌的组合来查找数据库中的记录。始终确保根据用户来获取记录,并使用时序安全比较功能随后对获取的令牌进行比较。有关定时攻击的更多信息。
现在, 非常
重要的一点是SECRET_KEY成为一个密码秘密(由类似东西的东西生成/dev/urandom和/或从高熵输入中得出)。另外,还GenerateRandomToken()需要成为一个强大的随机源(mt_rand()还不够强大。请使用一个库,例如RandomLib或random_compat,或mcrypt_create_iv()与一起使用DEV_URANDOM)…
这hash_equals()是为了防止定时攻击。如果使用PHP
5.6以下的PHP版本,hash_equals()则不支持该功能。在这种情况下,您可以替换hash_equals()为timingSafeCompare函数:
/**
* A timing safe equals comparison
*
* To prevent leaking length information, it is important
* that user input is always used as the second parameter.
*
* @param string $safe The internal (safe) value to be checked
* @param string $user The user submitted (unsafe) value
*
* @return boolean True if the two strings are identical.
*/
function timingSafeCompare($safe, $user) {
if (function_exists('hash_equals')) {
return hash_equals($safe, $user); // PHP 5.6
}
// Prevent issues if string length is 0
$safe .= chr(0);
$user .= chr(0);
// mbstring.func_overload can make strlen() return invalid numbers
// when operating on raw binary strings; force an 8bit charset here:
if (function_exists('mb_strlen')) {
$safeLen = mb_strlen($safe, '8bit');
$userLen = mb_strlen($user, '8bit');
} else {
$safeLen = strlen($safe);
$userLen = strlen($user);
}
// Set the result to the difference between the lengths
$result = $safeLen - $userLen;
// Note that we ALWAYS iterate over the user-supplied length
// This is to prevent leaking length information
for ($i = 0; $i < $userLen; $i++) {
// Using % here is a trick to prevent notices
// It's safe, since if the lengths are different
// $result is already non-0
$result |= (ord($safe[$i % $safeLen]) ^ ord($user[$i]));
}
// They are only identical strings if $result is exactly 0...
return $result === 0;
}
2020-05-26
python保持登录状态_“保持登录状态”-最佳方法相关推荐
- python中常见的三种选择结构_在Python中,实现多分支选择结构的最佳方法是
在Python中,实现多分支选择结构的最佳方法是 答:if-elif-else 绘制建筑平面图时,被剖切的墙用 线绘制,定位轴线用 线绘制 答:粗实 细点画 智慧职教: 下列关于书写住院病历的叙述不正 ...
- python用户名密码登录退出_用户登录登出
一.功能需求分析 1.登录功能分析 1.1登录流程 1.2功能(一个请求为一个功能) -登录页面 -登录功能 -登出功能 二.登录页面 1.接口设计 1.1.接口说明 类目 说明 请求方式 GET u ...
- 微信登录画面_微信登录界面的地球变了_微信登录界面首变真相
细心的小伙伴发现在启动微信的时候,那个经典的一个小人剪影面对着地球的画面开始发生了一些变化,似乎云层变得更为清晰细致了.微信登录界面6年来首变化,那么为何改变来的如此突然呢,下面小编就分享给大家! 手 ...
- java第三方登录接口_第三方登录接入-qq,weibo-java
开发之前 需求:网站接入qq,sina微博登录,本文最后付效果图: 说明:大部分网站本身是需要用户概念的,很多操作依附于用户,而qq或微博作为一种登录方式指向用户而已,我参考了一下其他网站的做法, 一 ...
- 服务器查看gpu状态_服务器 201 状态
生产环境常见的HTTP状态码列表 生产环境常见的HTTP状态码列表(List of HTTP status codes) 说明:求精不求多,有舍才有得 不一样的思维不一样的精彩. 200 - OK,服 ...
- java 登录下线_单机登录实现思路(强制下线其他用户)
主流的网站都是限制用户单点登录的,为什么要实现单点登录? 1.避免单账号多用户操作占用大量数据库连接,减轻webserver的压力: 2.安全防范,强制下线非法用户: 传统的web服务器(如tomca ...
- python 登录新浪微博_模拟登录新浪微博(Python)
PC 登录新浪微博时, 在客户端用js预先对用户名.密码都进行了加密, 而且在POST之前会GET 一组参数,这也将作为POST_DATA 的一部分. 这样, 就不能用通常的那种简单方法来模拟POST ...
- 微信登录画面_微信登录界面改版,美炸了!
今天哎妹问小伙伴,更新微信新版本了吗?小伙伴淡定的看了我一眼说,没有啊,咋的了.新版的微信登录的时候,地球气象云图会动了啊!真的假的?我去看看去. 看一眼新旧版对比图.↓↓↓ 旧版(左)与新版(右) ...
- 仙剑奇侠传四服务器维护,《仙剑奇侠传四》无法登录怎么办_无法登录解决办法_3DM手游...
<仙剑奇侠传四>手游进不去怎么办?有些小伙伴玩游戏会遇到黑屏闪退进不了游戏的问题,那么为什么会出现这种状况呢?有什么解决办法吗?下面就和小编一起来了解下仙剑奇侠传4手游黑屏闪退解决办法吧. ...
最新文章
- c语言计算器实训任务案例,C/C++经典实例之模拟计算器示例代码
- C++对象模型2——编译器生成构造函数的几种情况
- 332. 重新安排行程(回溯算法)
- Javascript常用的设计模式详解
- 消息驱动 微服务器,消息驱动的微服务-Spring Cloud Stream整合RocketMQ
- maven scope使用和理解
- 修改命令有趣的Linux命令
- 下轮“双一流”将有高校下车?教育部最新说法来了!
- js中采用词法作用域
- 线性代数知识框架梳理
- 用连接数据库的方式读取excel
- Apple Compressor 4.4.4 中文特别版 Mac 电影视频后期制作工具
- Python数据爬虫学习笔记(19)Scrapy天善智能网课信息爬虫
- UVM中超时退出set_timeout函数
- 小程序打包体积优化策略
- 网络号,网络标识,广播地址,有效主机范围计算
- python 爬取豆瓣的美剧
- 发布3天获推荐10w+,视频号内容出现新玩法?
- 字符串专题-LeetCode:剑指 Offer 58 - II. 左旋转字符串、LeetCode 459.重复的子字符串、 代码思路和注意点
- 电脑图片去水印方法-电脑图片上面的水印怎么去除
热门文章
- java成绩管理系统论文总结,JAVA论文成绩管理系统课程设计
- matlab simulink_运用MATLAB和Simulink开发自动驾驶控制系统
- python configuration_Python(2.7.6) 标准日志模块 - Logging Configuration
- 【超坑人的面试题】switch没有break
- 机器人运动规划调研(pending)
- 2.2.2 物理层设备(中继器、集线器)
- japidocs怎么设置参数必填_JApiDocs 动态生成接口文档,并解析java 源码中的注释...
- linux ar 命令详解
- 数据库 / 事务的 ACID
- Cpp 对象模型探索 / 对象访问成员变量的原理