当前位置: 首页 > 知识库问答 >
问题:

密码哈希盐是如何工作的

吴单鹗
2023-03-14

我认为我理解散列和加盐密码,但似乎我有一些误解。我在nodejs为我的网站创建一个用户帐户系统。

我的理解是,当用户创建密码时,我们会生成一个随机盐,将其附加到密码中,然后散列该字符串。我们还可以添加一个工作因子以使散列工作缓慢并防御蛮力攻击。我们将盐与散列一起存储在我们的数据库中,为了验证登录尝试,我们使用存储的盐和尝试的密码重复上述过程(在服务器上),并检查散列是否匹配。

nodejs中的bcrypt模块似乎与我对哈希的解释不一致。这是来自于http://codetheory.in/using-the-node-js-bcrypt-module-to-hash-and-safely-store-passwords/

var salt = bcrypt.genSaltSync(10);
var hash = bcrypt.hashSync("my password", salt);

首先,为什么功因子应用于salt而不是hash?如果有人使用暴力进行攻击,他们会运行哈希函数,对吗?散列不是我们需要的函数吗?

我也对使用bcrypt进行验证感到困惑:

bcrypt.compareSync("my password", hash);

即使两个用户选择相同的密码,我们也需要哈希值是唯一的,这就是盐的要点吗?那么我们为什么不这样做呢?

bcrypt.compareSync("my password"+salt, hash);

共有2个答案

秦才
2023-03-14
匿名用户

< code>salt包含轮数,因此< code>bcrypt.hash(Sync)函数知道它要进行多少轮。所以< code>hash不是一个简单的hash,而是一个内嵌了< code>salt的容器。

邴宏大
2023-03-14

SALT是2次数(从4到31) - 函数的迭代工作循环,创建哈希。bcrypt取盐,乘以2本身的盐时间。并取此值来实现解码函数到我们的字符串的总次数。它是 bcrypt 函数中循环的“圆度”。每次当你这样做时:

bcrypt.hashSync("my password", salt)

< code>bcrypt创建新的“随机”字符串,每次使用相同的输入字符串和使用相同的< code>salt我们得到不同的输出字符串,这是工作bcrypt函数的关键思想,总结果我们将保存到我们的库。然后我们使用:

bcrypt.compareSync("my password", hash);

和<code>compareSync<code>计算是否从字符串“my password”创建了哈希。如果我们进入函数compareSync中,在字符串(“我的密码”)中添加salt,我们将更改开始的字符串,并且决不会以这种方式接受true。因为bcrypt将比较散列,就像这样创建的:

bcrypt.hashSync("my password"+salt, salt);

这就是我们应该使用这种结构的方式:

>

  • 在创建用户数据时创建哈希:var盐=bcrypt.genSaltSync(10); var哈希=bcrypt.hashSync("my code",盐);
  • hash保存到db
  • 登录过程中的下一步身份验证用户,如:

    bcrypt。compareSync(“我的密码”,哈希)

    没有任何或参数。

  •  类似资料:
    • 我正在为Web应用程序制作登录系统。要将密码存储在数据库中,我正在使用sha256加密密码,如下所示: 在数据库中,我存储了用户、用户密码和用于散列和验证用户登录的salt。现在,我正在向用户发送包含您的密码的电子邮件,但是当用户收到电子邮件时,由于存储在sha256加密密码中,用户收到的是一个长字符串,而不是用户应该知道的密码。 我的问题是,我可以通过任何方法向您发送实际的用户密码和非密码加密,

    • 问题内容: 目前,据说MD5部分不安全。考虑到这一点,我想知道使用哪种机制进行密码保护。 这个问题,“双重哈希”密码是否比仅哈希一次密码安全? 建议多次散列可能是一个好主意,而如何对单个文件实施密码保护?建议使用盐。 我正在使用PHP。我想要一个安全,快速的密码加密系统。将密码哈希一百万次可能更安全,但也更慢。如何在速度和安全性之间取得良好的平衡?另外,我希望结果具有恒定数量的字符。 哈希机制必须

    • 如果用户创建了一个新密码,并通过哈希算法存储在数据库中,则在用户登录时可以将其与用户输入的密码进行匹配。输入到登录屏幕的密码将被哈希化,然后检查它是否与存储的哈希匹配。如果是,则允许用户访问。 然而,如今,密码是经过哈希和盐处理的。因此,当用户第一次注册密码时,它会经过一个散列,然后会被加密10000次以上。这个salt与后端代码生成的关键字相同,还是每次salt都随机生成? 当用户输入密码登录时

    • 我记得读过一个方案,其中检查密码的过程是这样的: 给定数据库中的(哈希、盐)值, 用salt哈希密码以检查哈希, 使用旧哈希作为salt的哈希密码, 在数据库中存储(新哈希,也称为旧哈希) 我找不到原始来源无论如何,我不明白 > < li> 使用旧哈希作为salt的优势是什么(与使用随机salt相反), 这种方案的优点是什么(进一步使彩虹表攻击复杂化?),以及 如果有优势,如何使用PHPass应用

    • 问题内容: 我正在建立一个网站,并试图决定如何加密用户密码以将其存储在SQL数据库中。 我意识到使用简单的md5(password)是非常不安全的。我正在考虑使用sha512(password.salt),并且我一直在研究生成有用盐的最佳方法。我阅读了许多文章,指出盐应尽可能地随机以增加哈希值的熵,这似乎是个好主意。但: 您需要将随机盐与哈希一起存储 鉴于攻击者以某种方式可以访问您的哈希密码(并试

    • 问题内容: 来自github: 哈希密码: 要检查密码: 从上面看,比较中如何不包含盐值?我在这里想念什么? 问题答案: 盐合并到哈希中(以纯文本形式)。比较功能只是将盐从哈希表中提取出来,然后使用它来哈希密码并执行比较。