我正在使用Python和Flask建立一个网站,并且想知道对我来说非常重要的事情。
过去,作为未受过教育的程序员,我总是在会话中保存未加密的用户密码,以便可以根据请求重新验证用户名和密码。目前我正在制作我的第一个认真的网站,所以我也想要做得更好。
我知道有办法嗅探会话变量,例如通过以某种方式获取另一个人的会话ID。我想知道以什么形式存储密码以便将其隐藏在有权访问会话数据的人身上。
到目前为止我想到的选项:
sha256(password)
保存到会话中。这也不是一个好的选择,因为破解者可以使用字典表来检索未加密的密码。sha256(password+hash)
保存到会话中。这是三个选项中最安全的选项,但它将是数据库条目的副本,对我来说这似乎不是一个好主意。一个破解者可以将他自己的密码与他自己的哈希值进行比较,并可能弄清楚如何为整个数据库创建盐和哈希值。我不确定这是否是一个有效的问题,但我想Stackoverflow上的知识渊博的用户将能够告诉我。 ;)那么,推荐哪一个?也许是第五个我没想到的?请注意,此变量需要用于验证用户的凭据,因此我们不能仅使用不同的哈希值对其进行哈希处理。
答案 0 :(得分:3)
为什么需要将用户密码存储在会话中?我看不出它有什么特别需要,它只是毫无理由地创造了潜在的安全风险。
相反,只需存储用户名,并可能存储一个标记用户已经过身份验证的标志。当然,您应该在用户注销时清除该标志(和/或只是擦除整个会话数据),以便以某种方式访问旧会话cookie的攻击者无法在注销后恢复会话。
您可能还希望在会话中存储“上次访问”时间戳,以便您可以让旧陈旧会话超时。或者您可以依赖会话框架的内置会话到期行为,但在您的应用程序的直接控制下完全备份机制仍然是个好主意。
聚苯乙烯。显然,你做的,确保你的会话标识符是使用加密安全的随机数生成器(例如Crypto.Random.random)生成的,并且它们足够长,可以被认为是不可思议的(至少64个) bits = 16个十六进制数字,尽管128位更好)。如果由于某种原因,你不能这样做,另一种方法是自己生成这样一个随机令牌,将两者存储在会话和cookie中,在使用任何实际会话数据之前验证会话和cookie令牌是否匹配。