如何通过Web散列和加密密码?

时间:2013-01-24 20:43:48

标签: mysql encryption hash cryptography

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

注册

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

    1. 客户端将用户名和密码发送到服务器(https)
    2. 服务器抓取用户名和密码,从数据库中查找散列的psw和salt
    3. 使用salt哈希密码,base64编码结果
    4. 将密码与数据库中的散列psw进行比较
    5. 如果匹配,请对用户进行身份验证
    6. 我正在实施我的系统作为我的假设,一切似乎都有效。但是我不确定base64编码部分。将密码和salt从二进制编码为字符串的目的是什么,我可以跳过这一步吗?如果我假设的过程是错误的,那么正确的步骤是什么?

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

2 个答案:

答案 0 :(得分:3)

一般的想法没问题,但我有一些评论:

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

因此该方案包含以下问题:

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

答案 1 :(得分:0)

您需要了解盐的含义。它只是为了使用彩虹表来对抗可能的暴力攻击。这意味着一些坏人将以高计算能力尝试所有可能产生的哈希值。然后尝试从这种哈希中提取纯文本 因此盐就是为了确保即使有这样的攻击,返回的纯文本也不正确。

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

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

但是当盐腌它时会像“Ilovestackoverflow” - > “IO * ves5tacmkove3rflow”。 当这是哈希“Io * ves5tacmkove3rflow” - > “dfgdfgdf”

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

简而言之......你可以跳过这个,除非你确实需要这样的保护。