security - 'exposed' 如何在 session 中存储密码?

标签 security session hash passwords session-variables

我正在使用 Python 和 Flask 制作一个网站,并且想知道一些对我来说相当重要的事情。

过去,作为一个没有受过教育的程序员,我总是在 session 中保存未加密的用户密码,以便可以根据请求重新验证用户名和密码。目前我正在制作我的第一个严肃的网站,所以我也想做得更好。

我知道有多种方法可以嗅探 session 变量,例如通过以某种方式获取另一个人的 session ID。我想知道最好以什么形式存储密码,以便对有权访问 session 数据的人隐藏密码。

到目前为止我想到的选项:

  • 未加密:从逻辑上讲,这是最糟糕的选择。
  • 哈希:例如,将 sha256(password) 保存到 session 中。这也不是一个好的选择,因为破解者可以使用字典表来检索未加密的密码。
  • 加盐和哈希:例如,将 sha256(password+hash) 保存到 session 中。这是三个选项中最安全的一个,但它将是数据库条目的副本,对我来说这似乎不是一个好主意。破解者可以将自己的密码与自己的哈希值进行比较,并可能弄清楚如何为整个数据库创建盐和哈希值。我不确定这是否是一个合理的担忧,但我想 Stackoverflow 上知识渊博的用户能够告诉我。 ;)
  • 加盐和散列,数据库保存递归散列字符串:本质上,这似乎是一个不错的选择,但我读到,递归散列密码总是一个坏主意。<

那么,推荐其中哪一个?也许还有我没想到的第五个?请注意,此变量需要用于验证用户的凭据,因此我们不能仅使用不同的盐对其进行哈希处理,等等。

最佳答案

为什么您需要在 session 中存储用户的密码?我看不出有什么特别的需要,它只是无缘无故地造成了潜在的安全风险。

相反,只需存储用户名以及可能的一个表明用户已通过身份验证的标志。当然,您应该在用户注销时清除该标志(和/或只是删除整个 session 数据),以便以某种方式访问​​旧 session cookie 的攻击者无法在注销后恢复 session 。

您可能还想在 session 中存储“上次访问”时间戳,以便让旧的过时 session 超时。或者,您可以依赖 session 框架的内置 session 过期行为,但拥有完全由应用程序直接控制的备份机制可能仍然是一个好主意。

诗。显然,无论你做什么,请确保你的 session 标识符是使用加密安全随机数生成器生成的(例如 Crypto.Random.random ),并且它们足够长以至于无法猜测(至少 64 位 = 16 位十六进制数字,尽管 128 位更好)。如果由于某种原因,您不能这样做,另一种方法是自己生成这样一个随机 token ,将其存储在 session 和 cookie 中,然后在使用任何实际 session 数据之前验证 session 和 cookie token 是否匹配。

关于security - 'exposed' 如何在 session 中存储密码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18231101/

相关文章:

c# - 如何将方法参数传递给方法的属性值?

c# - 使用 https 和验证的 WCF 安全身份验证

security - 如何修复某些 Java 代码中的 "Path Manipulation Vulnerability"?

arrays - 从添加新键的数组创建散列

linux - 是否有可能突破受限(自定义) shell ?

php - 为什么在数据库中保存session是好的save?

PHP 在 WHERE 子句中使用 $_SESSION ['user' ] 插入 MySQL 数据库

hibernate - 多个数据源导致 HibernateException?

mysql - 在 MySQL 中存储散列密码

perl - 无法解码!无效的 Base58 字符!