【问题标题】:Am I misunderstanding what a hash salt is?我误解了什么是哈希盐吗?
【发布时间】:2011-01-11 18:39:27
【问题描述】:

我正在努力将哈希摘要生成功能添加到我们的代码库中。我想将字符串用作哈希盐,以便可以将预先知道的密钥/密码短语添加到需要哈希的任何内容之前。我误解了这个概念吗?

【问题讨论】:

  • 你用什么语言写的?
  • 我正在用 Java 写这篇文章

标签: hash salt


【解决方案1】:

您完全理解了这个概念。只需确保每次添加的盐都是可重复的。

【讨论】:

    【解决方案2】:

    如果我对您的理解正确,那么听起来您是对的。该过程的伪代码如下所示:

    string saltedValue = plainTextValue + saltString;
    // or string saltedalue = saltString + plainTextValue;
    
    Hash(saltedValue);
    

    Salt 只是为试图获取您的信息的人们增加了另一层复杂性。

    【讨论】:

      【解决方案3】:

      如果每个加密短语的盐不同,那就更好了,因为每个盐都需要自己的彩虹表。

      【讨论】:

        【解决方案4】:

        盐是添加到加密函数输入的随机元素,目的是在每次调用时以不同的方式影响处理和输出。与“密钥”相反,盐并不意味着保密。

        一个世纪前,用于加密或身份验证的加密方法是“秘密”的。然后,随着计算机的出现,人们意识到将方法完全保密是很困难的,因为这意味着要对软件本身保密。定期写入磁盘或体现为某些专用硬件的内容难以保密。因此,研究人员将“方法”分为两个不同的概念:算法(公开并成为软件和硬件)和密钥(算法的参数,目前仅在处理期间在易失性 RAM 中)。密钥集中秘密,是纯数据。当密钥存储在人类的大脑中时,它通常被称为“密码”,因为人类更擅长记住单词而不是位。

        然后密钥本身随后被拆分。事实证明,为了获得适当的密码安全性,我们需要两件事:机密参数和可变参数。基本上,为不同的用途重复使用相同的密钥往往会造成麻烦。它经常泄露信息。在某些情况下(尤其是流密码,也用于散列密码),它会泄漏太多并导致成功的攻击。因此,通常需要可变性,每次加密方法运行时都会发生变化。现在好的部分是大多数时候,可变性和秘密不需要合并。也就是说,我们可以将机密变量分开。所以key被拆分成:

        • 密钥,通常称为“密钥”;
        • 一个可变元素,通常随机选择,根据算法类型称为“盐”或“IV”(作为“初始值”)。

        只有密钥需要保密。变量元素需要所有相关方都知道,但它可以是公开的。这是一种祝福,因为共享密钥很困难;用于分发此类秘​​密的系统会发现容纳每次算法运行时都会发生变化的可变部分的成本很高。

        在存储散列密码的上下文中,上面的解释变成如下:

        • “重用密钥”是指两个用户碰巧选择了相同的密码。如果密码只是简单地散列,那么两个用户将获得相同的散列值,这将显示出来。这是泄漏。
        • 同样,如果没有哈希,攻击者可以使用预先计算的表进行快速查找;他还可以同时攻击数千个密码。这仍然使用相同的泄漏,只是以某种方式证明了为什么这种泄漏是不好的。
        • 加盐意味着将一些可变数据添加到散列函数输入中。那个可变数据就是盐。盐的重点是两个不同的用户应该尽可能多地使用不同的盐。但是密码验证者需要能够从密码中重新计算出相同的哈希值,因此他们必须能够访问盐。

        由于验证者必须可以访问盐但不需要保密,因此习惯上将盐值与哈希值一起存储。例如,在 Linux 系统上,我可能会使用这个命令:

        openssl passwd -1 -salt "zap" "blah"
        

        这会计算一个散列密码,使用散列函数 MD5,适合在 /etc/password/etc/shadow 文件中使用,用于密码 "blah" 和盐 "zap"(这里,我明确选择盐,但在实际条件下应随机选择)。那么输出是:

        $1$zap$t3KZajBWMA7dVxwut6y921
        

        其中美元符号用作分隔符。初始 "1" 标识散列方法 (MD5)。盐就在那里,以明文表示。最后一部分是哈希函数输出。

        有一个规范(某处)关于如何将盐和密码作为输入发送到散列函数(至少在 glibc 源代码中,可能在其他地方)。

        编辑:在“登录名和密码”用户身份验证系统中,“登录名”可以充当可通过的盐(两个不同的用户将有不同的登录名),但这不会捕获给定用户更改密码的情况(新密码是否与旧密码相同会泄漏)。

        【讨论】:

        • “salt,与“key”相反,并不意味着保密。” - 使用众所周知的单向哈希,如 MD5 或 SHA-1,您必须对盐保密,否则暴力反转您的哈希会容易得多。
        • 如果盐是机密的,它不是盐而是密钥的一部分。现在碰巧在哈希密码设置中,盐完成了它的工作(它可以防止从相同的密码和并行攻击中泄漏)但这还不够好,因为人类在选择和记住好的密码方面很可怜。因此,习惯上尝试保持整个输出“受保护”(/etc/shadow 不公开可读);额外的安全性来自隐藏哈希输出,而不是隐藏盐。无论哪种方式,验证者都必须仍然可以访问盐和哈希输出。
        【解决方案5】:

        值得一提的是,即使每个密码使用的盐值应该不同,但绝对不能根据密码本身计算盐值!这种事情的实际结果是完全使您的安全失效。

        【讨论】:

          猜你喜欢
          • 2011-05-27
          • 2013-03-24
          • 1970-01-01
          • 2011-08-10
          • 2012-01-08
          • 2012-08-21
          • 1970-01-01
          • 2023-03-21
          • 1970-01-01
          相关资源
          最近更新 更多