Hash 我是不是误解了杂烩盐是什么?

Hash 我是不是误解了杂烩盐是什么?,hash,salt,Hash,Salt,我正在为我们的代码库添加哈希摘要生成功能。我想使用一个字符串作为散列盐,这样就可以在需要散列的任何内容之前添加一个已知的密钥/密码短语。我误解了这个概念吗?你完全理解这个概念。只要确保预先准备好的盐每次都可以重复使用。如果我理解正确,听起来你做得对。进程的psuedocode类似于: string saltedValue = plainTextValue + saltString; // or string saltedalue = saltString + plainTextValue; H

我正在为我们的代码库添加哈希摘要生成功能。我想使用一个字符串作为散列盐,这样就可以在需要散列的任何内容之前添加一个已知的密钥/密码短语。我误解了这个概念吗?

你完全理解这个概念。只要确保预先准备好的盐每次都可以重复使用。

如果我理解正确,听起来你做得对。进程的psuedocode类似于:

string saltedValue = plainTextValue + saltString;
// or string saltedalue = saltString + plainTextValue;

Hash(saltedValue);

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

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

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

一个世纪前,用于加密或身份验证的加密方法是“秘密的”。然后,随着计算机的出现,人们意识到对一种方法完全保密是困难的,因为这意味着对软件本身保密。定期写入磁盘或具体化为某些专用硬件的东西在保密方面有困难。因此,研究人员将“方法”分为两个截然不同的概念:算法(是公共的,成为软件和硬件)和密钥(算法的一个参数,仅在处理过程中出现在易失性RAM中)。密钥集中了秘密,是纯数据。当钥匙储存在人的大脑中时,它通常被称为“密码”,因为人比比特更善于记忆单词

后来钥匙本身就被拆开了。事实证明,为了正确的加密安全性,我们需要两件事:一个机密参数和一个可变参数。基本上,重复使用同一个密钥进行不同的使用会带来麻烦;它经常泄露信息。在某些情况下(尤其是流密码,但也用于散列密码),它泄漏太多并导致成功的攻击。因此,常常需要可变性,这种可变性在每次加密方法运行时都会发生变化。现在好的方面是,大多数时候,可变性和秘密不需要合并。也就是说,我们可以将机密从变量中分离出来。因此,密钥分为:

  • 密钥,通常称为“密钥”
  • 一种可变元素,通常随机选择,根据算法类型称为“salt”或“IV”(作为“初始值”)
只有钥匙需要保密。变量元素需要所有相关方都知道,但它可以是公共的。这是一种祝福,因为共享密钥很困难;用于分发此类秘密的系统会发现,容纳每次算法运行时都会发生变化的可变部分的成本很高

在存储哈希密码的上下文中,上面的解释如下:

  • “重用密钥”意味着两个用户碰巧选择了相同的密码。如果密码只是散列,那么两个用户将获得相同的散列值,这将显示。这是漏水处
  • 类似地,如果没有散列,攻击者可以使用预计算的表进行快速查找;他还可以同时攻击数千个密码。这仍然使用相同的泄漏,只是在某种程度上证明了该泄漏的严重性
  • salt意味着向hash函数输入中添加一些变量数据。变量数据就是盐。盐的要点是两个不同的用户应该尽可能多地使用不同的盐。但是密码验证器需要能够从密码中重新计算相同的散列,因此他们必须能够访问salt
由于salt必须可供验证者访问,但不需要保密,因此通常将salt值与散列值一起存储。例如,在Linux系统上,我可以使用以下命令:

openssl passwd -1 -salt "zap" "blah"
这将使用哈希函数MD5计算一个哈希密码,该密码适合在
/etc/password
/etc/shadow
文件中使用,用于密码
“blah”
和salt
“zap”
(这里,我明确选择salt,但在实际条件下,它应该随机选择)。然后输出为:

$1$zap$t3KZajBWMA7dVxwut6y921
其中美元符号用作分隔符。首字母
“1”
标识哈希方法(MD5)。盐在那里,用明文表示法。最后一部分是散列函数输出

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


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

值得一提的是,即使每个密码使用的salt都应该不同,您的salt也不应该从密码本身计算出来!这类事情的实际结果是完全使您的安全性失效。

您是用什么语言编写的?我是用Java编写的“与“密钥”相反,salt并不意味着保密。”-对于众所周知的单向散列,如MD5或SHA-1,您必须对salt保密,否则暴力破解您的散列会变得更容易。如果salt是保密的,则它不是salt,而是密钥的一部分。现在,在密码设置的散列中,salt完成了它的工作(它可以防止相同密码和并行攻击的泄漏),但这还不够好,因为人类在选择和记住密码方面很可怜