小编典典

好的,让我直言不讳:如果您为此目的将用户数据或从用户数据派生的任何内容放入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保持登录状态_“保持登录状态”-最佳方法相关推荐

  1. python中常见的三种选择结构_在Python中,实现多分支选择结构的最佳方法是

    在Python中,实现多分支选择结构的最佳方法是 答:if-elif-else 绘制建筑平面图时,被剖切的墙用 线绘制,定位轴线用 线绘制 答:粗实 细点画 智慧职教: 下列关于书写住院病历的叙述不正 ...

  2. python用户名密码登录退出_用户登录登出

    一.功能需求分析 1.登录功能分析 1.1登录流程 1.2功能(一个请求为一个功能) -登录页面 -登录功能 -登出功能 二.登录页面 1.接口设计 1.1.接口说明 类目 说明 请求方式 GET u ...

  3. 微信登录画面_微信登录界面的地球变了_微信登录界面首变真相

    细心的小伙伴发现在启动微信的时候,那个经典的一个小人剪影面对着地球的画面开始发生了一些变化,似乎云层变得更为清晰细致了.微信登录界面6年来首变化,那么为何改变来的如此突然呢,下面小编就分享给大家! 手 ...

  4. java第三方登录接口_第三方登录接入-qq,weibo-java

    开发之前 需求:网站接入qq,sina微博登录,本文最后付效果图: 说明:大部分网站本身是需要用户概念的,很多操作依附于用户,而qq或微博作为一种登录方式指向用户而已,我参考了一下其他网站的做法, 一 ...

  5. 服务器查看gpu状态_服务器 201 状态

    生产环境常见的HTTP状态码列表 生产环境常见的HTTP状态码列表(List of HTTP status codes) 说明:求精不求多,有舍才有得 不一样的思维不一样的精彩. 200 - OK,服 ...

  6. java 登录下线_单机登录实现思路(强制下线其他用户)

    主流的网站都是限制用户单点登录的,为什么要实现单点登录? 1.避免单账号多用户操作占用大量数据库连接,减轻webserver的压力: 2.安全防范,强制下线非法用户: 传统的web服务器(如tomca ...

  7. python 登录新浪微博_模拟登录新浪微博(Python)

    PC 登录新浪微博时, 在客户端用js预先对用户名.密码都进行了加密, 而且在POST之前会GET 一组参数,这也将作为POST_DATA 的一部分. 这样, 就不能用通常的那种简单方法来模拟POST ...

  8. 微信登录画面_微信登录界面改版,美炸了!

    今天哎妹问小伙伴,更新微信新版本了吗?小伙伴淡定的看了我一眼说,没有啊,咋的了.新版的微信登录的时候,地球气象云图会动了啊!真的假的?我去看看去. 看一眼新旧版对比图.↓↓↓ 旧版(左)与新版(右) ...

  9. 仙剑奇侠传四服务器维护,《仙剑奇侠传四》无法登录怎么办_无法登录解决办法_3DM手游...

    <仙剑奇侠传四>手游进不去怎么办?有些小伙伴玩游戏会遇到黑屏闪退进不了游戏的问题,那么为什么会出现这种状况呢?有什么解决办法吗?下面就和小编一起来了解下仙剑奇侠传4手游黑屏闪退解决办法吧. ...

最新文章

  1. c语言计算器实训任务案例,C/C++经典实例之模拟计算器示例代码
  2. C++对象模型2——编译器生成构造函数的几种情况
  3. 332. 重新安排行程(回溯算法)
  4. Javascript常用的设计模式详解
  5. 消息驱动 微服务器,消息驱动的微服务-Spring Cloud Stream整合RocketMQ
  6. maven scope使用和理解
  7. 修改命令有趣的Linux命令
  8. 下轮“双一流”将有高校下车?教育部最新说法来了!
  9. js中采用词法作用域
  10. 线性代数知识框架梳理
  11. 用连接数据库的方式读取excel
  12. Apple Compressor 4.4.4 中文特别版 Mac 电影视频后期制作工具
  13. Python数据爬虫学习笔记(19)Scrapy天善智能网课信息爬虫
  14. UVM中超时退出set_timeout函数
  15. 小程序打包体积优化策略
  16. 网络号,网络标识,广播地址,有效主机范围计算
  17. python 爬取豆瓣的美剧
  18. 发布3天获推荐10w+,视频号内容出现新玩法?
  19. 字符串专题-LeetCode:剑指 Offer 58 - II. 左旋转字符串、LeetCode 459.重复的子字符串、 代码思路和注意点
  20. 电脑图片去水印方法-电脑图片上面的水印怎么去除

热门文章

  1. java成绩管理系统论文总结,JAVA论文成绩管理系统课程设计
  2. matlab simulink_运用MATLAB和Simulink开发自动驾驶控制系统
  3. python configuration_Python(2.7.6) 标准日志模块 - Logging Configuration
  4. 【超坑人的面试题】switch没有break
  5. 机器人运动规划调研(pending)
  6. 2.2.2 物理层设备(中继器、集线器)
  7. japidocs怎么设置参数必填_JApiDocs 动态生成接口文档,并解析java 源码中的注释...
  8. linux ar 命令详解
  9. 数据库 / 事务的 ACID
  10. Cpp 对象模型探索 / 对象访问成员变量的原理