【问题标题】:How to hash and encrypt password over the web?如何通过网络散列和加密密码?
【发布时间】:2013-01-08 17:48:00
【问题描述】:

我正在处理一个宠物项目,我想添加用户注册支持。经过一番研究,我决定在我的数据库中保存散列密码和盐,而不是原始密码。但是,我对步骤是什么以及顺序感到困惑。以下是我的假设:

注册

  1. 客户端将用户名和密码发送到服务器 (https)
  2. 服务器抓取密码,生成随机盐
  3. Base64 编码盐
  4. 使用 stringify salt 对密码进行哈希处理
  5. Base64 编码密码
  6. 将密码和盐保存到数据库中

登录

  1. 客户端将用户名和密码发送到服务器 (https)
  2. 服务器获取用户名和密码,从数据库中查找散列 psw 和 salt
  3. 使用盐的哈希密码,base64编码结果
  4. 将密码与数据库中的散列 psw 进行比较
  5. 如果匹配,则验证用户身份

我正在实施我的系统作为我的假设,并且一切似乎都有效。但是我不确定 base64 编码部分。将密码和盐从二进制编码为字符串的目的是什么,我可以跳过这一步吗?如果我假设的过程是错误的,正确的步骤是什么?

P.S 我使用 express.js 作为服务器,mysql 作为数据库

【问题讨论】:

  • Base64 编码散列密码通常是为了更容易存储,特别是如果散列函数输出二进制。如果您有一个可以处理原始二进制文件的良好持久性方法,那么编码是无关紧要的。
  • @Joe 谢谢乔!所以一切都井井有条?

标签: mysql encryption hash cryptography


【解决方案1】:

您需要了解盐的含义。它是一种使用彩虹表对可能的蛮力攻击设置障碍的方法。这意味着一些坏人会用高计算能力尝试所有可能生成的哈希值。然后尝试从此类哈希中提取纯文本。
因此,盐可以确保即使受到这种攻击,返回的纯文本也不是正确的。

例如: 用户名:“Xavier_Ex” 密码:“Ilovestackoverflow”

这样的密码将被散列为“sfhj87s&^f”。现在彩虹表也可以说 "sfhj87s&^f" -> Ilovestackoverflow... bleh,你的密码被破解了。

但是当加盐时它会像“Ilovestackoverflow”->“Io*ves5tacmkove3rflow”。 当这是散列时“Io*ves5tacmkove3rflow”->“dfgdfgdf”

使用“dfgdfgdf”将返回“Io*ves5tacmkove3rflow”的彩虹表..您的密码仍然是秘密的。

简而言之.. 除非您确实需要此类保护,否则您可以跳过此步骤。

【讨论】:

  • 你不应该跳过加盐,除非有技术原因你不能 - 彩虹表非常流行破解
  • @blackmath 首先感谢您的回答,但如果您仔细阅读我的问题,我并不是在问盐。是的,我了解盐的用途,但我要问的是 base64 编码盐和密码的步骤。
  • 这个答案似乎从根本上误解了盐如何保护密码......盐是公共信息,通常存储在密码的散列旁边,只是附加到密码的末尾。每个用户的唯一盐值通过确保每个密码都需要独立暴力破解来防止攻击者
  • @Xavier_Ex 此步骤仅确保数据在与数据库的可能事务期间保持不变而不被修改。如果服务器和后端数据库之间有可靠的介质,则可以跳过它。如果您的数据库存储是分布式的并且例如存在正常的一致性问题,那么您需要执行此步骤。
【解决方案2】:

大体思路还可以,但我有几点意见:

  • 不应使用散列,而应使用 PBKDF,即基于密码的密钥派生函数。最好使用标准化版本,即 PBKDF2。除了盐,您还应该选择多次迭代来阻止攻击。
  • 确保您始终对用户名和密码使用相同的字符编码。
  • 加密算法应基于二进制输入和输出。
  • 在将二进制数据存储或加载到文本演示文稿时,应分别使用 Base 64 编码/解码。

所以该方案包含以下问题:

  • 使用哈希而不是 PBKDF。
  • 使用 base 64 编码的 salt 作为哈希的输入。

【讨论】:

  • 感谢您指出这些,是的,我使用的是 PBKDF2,但我认为它是一个哈希函数:P(不是吗???)
  • 好吧,我猜你可以调用一个设置了迭代计数的 PBKDF 并加盐一个哈希函数,但最好将它称为一个基于密码的密钥派生函数以避免混淆。大多数人会假设 MD5 或 SHA-1 或类似的。
猜你喜欢
  • 1970-01-01
  • 2011-02-18
  • 2011-06-02
  • 2011-06-23
  • 2018-01-20
  • 1970-01-01
  • 2015-02-17
  • 2010-09-24
  • 2012-12-06
相关资源
最近更新 更多