我正在开发一个网络应用程序,需要在中间件中访问用户的加盐哈希电子邮件。对我来说,最简单的方法就是使用 cookie。由于这是一个加盐的 sha256 哈希值,即使 cookie 被盗,黑客也无法通过比较识别出实际的电子邮件。这使得实施这样的系统安全吗?
我仍然不太理解你的设计,但接受你提出的问题和评论:
这是一个加盐的 sha256 哈希值
每个用户的盐是否唯一、加密随机、足够的熵(理想情况下为 128 位或更多)并且对所有用户保密?
即使 cookie 被盗,黑客也无法通过比较找出实际的电子邮件
这一说法的真实性很大程度上取决于上述问题。一般来说,电子邮件地址的熵并不多,而且——特别是如果用户的其他信息已知的话——很容易被暴力破解。由于 SHA2 哈希值非常快且易于并行化,因此从相对较低的熵池(如有效且真实的电子邮件地址)中暴力破解它们非常容易。不过,足够安全的盐腌确实可以防止这种情况发生。
但是,这忽略了更重要的一点,让我担心你的整个威胁模型没有意义,你可能会犯一个重大的安全错误。 攻击者并不是试图窃取您的电子邮件地址!如果攻击者可以获取您的 cookie,他们几乎肯定可以窃取比您的电子邮件地址更有价值的信息。相反,如果您的系统的安全依赖于攻击者不知道其潜在受害者的电子邮件地址,那么您的系统就非常不安全!
如果这个散列电子邮件地址用于身份验证和做出授权决策,那么您最好希望您的加盐是极其安全的,因为它是每个有权访问该软件的人与冒充任意用户的能力之间的全部障碍!忘记一些模糊的“攻击者”,如果用户 Alice 知道用户 Bob 的电子邮件地址(她知道)并且可以猜测或暴力破解盐,她可以对 Bob 的电子邮件地址进行散列并将摘要放入 cookie 中以冒充他(到目前为止)至少就您的中间件而言)。
此外,使用固定的、难以更改的身份验证令牌是一种不好的做法。好的代币具有许多这些代币所缺乏的属性: