我是密码学的初学者,并希望以非常简单的术语来理解什么是密码“盐”,何时可能需要使用它以及为什么或不应该使用它。任何人都可以给我一个非常简单明了的(入门级)解释吗?

#1 楼

使用盐的原因是人们倾向于选择相同的密码,而不是随意选择。许多使用过的密码都是短的实词,以使其易于记忆,但这也容易受到攻击。

您可能知道,密码通常不以明文形式存储,而是散列。如果您不确定哈希函数的用途,请先阅读该内容。

现在,攻击者可以做的只是简单地生成一组常用密码及其对应的哈希值。如果使用通用密码,则将站点存储在表中的哈希值进行比较,可以将密码泄露给攻击者。采用通用密码。其目的是使基于计算前的攻击毫无用处。如果您的密码与唯一的盐一起存储,则任何针对未加盐密码散列或针对具有不同盐的帐户的预先计算的密码哈希表都不会帮助破解您的帐户密码。长期随机生成的盐(使用/dev/urandom)预计是全球唯一的。因此,可以使用盐来使预计算攻击完全无效。

将盐和密码结合起来的最简单方法是简单地将它们连接起来,即存储的哈希值是Hash(salt||password)。现在,普通密码password1变成了神奇的密码,例如6$dK,3gCA%Jpassword1,不太可能在密码破解者的表中找到。一旦攻击者有了数据库并想要找到密码,他就需要为每种盐分别生成预先计算的表,这是一项昂贵的操作。

防止离线密码破解的另一种方法是执行密码扩展。使得密码哈希值对任何人的计算速度都变慢,包括登录服务和密码破解程序。一种用于扩展密码的方法是通过多次遍历哈希函数(即存储Hash(Hash(Hash(Hash…(Hash(salt||password)))…))来实现的。

另一个与盐腌有关的常见观念称为胡椒。即,将另一个随机值连接到密码,使得存储的值为Hash(pepper||salt||password)。胡椒粉就根本不储存了。登录服务器和密码破解程序都需要暴力破解未知的Pepper值,从而减慢双方的密码哈希比较。

从2013年到2015年,举办了密码哈希竞赛,以寻求更好的密码扩展算法。赢家是Argon2算法。建议程序员使用Argon2而不是实现自己的算法。

评论


$ \ begingroup $
因此,从本质上讲,当数据库中仅存储一个或两个密码时,使用salt实际上是无用的吗?据我了解,这仅在数据库中存储的密码数量不小的情况下才有用。
$ \ endgroup $
– AbhinavChoudhury
2014年7月15日在12:26

$ \ begingroup $
@AbhinavChoudhury:不,它可以防御彩虹表-即针对特定哈希值预先计算的表。例如:输入密码“ password1”。如果不加盐,则将HASH(“ password1”)存储在数据库中。现在,如果攻击者获得了您的记录,并且已经针对所有9个字符的密码预先计算了HASH(*),则他可以恢复该密码。如果改为对密码加盐,则HASH('somesaltforyou'||'password1')将不在攻击者的彩虹表中(因为它超过9个字符)。
$ \ endgroup $
– QuadrExAtt
2015年2月25日在9:17



#2 楼


您能帮助我了解什么是加密的“盐”吗?散列函数,以使密码的散列输出更难以破解。


我什么时候需要使用它?


为什么或不应该使用它?


由于以下原因,您应始终在哈希函数中使用盐值。

通常,人们选择弱密码,这确实是事实,确实存在数十亿字节的公开彩虹表,其中充斥着代表它们的哈希值。因此,当有人在您的服务上创建一个帐户并选择一个密码来保护其身份时,您通常可以打赌他们选择的密码将是1)通用,2)不安全和3)可在查找表中交叉引用。 >
例如,通过MD5进行哈希处理时,密码Nowayin1为6f367d65bc74b88e21fb9959487ffa3a,显然不是一个好选择。即使看起来不错(不是这样),但密码的MD5哈希出现在开放数据库中的事实使它毫无用处。

但这只是128位MD5。诸如SHA1(160位)甚至Whirlpool(512位)之类的更强大的东西呢?

同样的问题。是1e69e0a615e8cb813812ca797d75d4f08bdc2f56和1qazXSW @哈希与惠而浦0bf7545b784665d23b9c174ca03688a405f05b048e9d6c49bfc2721a1fa872bbd6576273d002e56d7c2a9c378efe607af36eea9d708a776e6f60ecb26e081cdf。

所有这些密码,以及数十亿更像是他们的根本问题,是事实他们常用的哈希已成为众矢之的。

密码盐会改变这种情况。

如果将随机值(盐)添加到用户选择的密码,则SHA1哈希1e69e0a615e8cb813812ca797d75d4f08bdc2f56将不再显示P @ $$ word作为用户密码,因为彩虹表中的哈希值将不再与之匹配。 br />
并不需要很多。例如,一个小的16位随机值将在查找表中产生每个哈希值的65,536个变量。因此,一个包含150亿个条目的数据库现在将需要超过9830亿个哈希来计入盐。但是,不要将您的帽子挂在盐渍的哈希表上,因为黑客不会浪费太多时间使用Rainbow表来计算您的密码。

他们将使用由五台服务器组成的25-GPU集群系统运行Hashcat,在不到六个小时的时间内,每个可以想到的包含八个大小写字母,数字和特殊字符的八个字符的密码,每秒可以燃烧3500亿个猜测哈希。 (那是在2012年。)

使散列运行速度变慢的诸如密钥拉伸之类的技术可用于抵消此类硬件的速度,从而使字典和蛮力攻击太慢而无法值得,但是硬件只会变得越来越快。该功能对FPGA,多核GPU和专用ASIC模块非常有弹性,这些功能可轻松破解未拉伸的密码短语。在Argon2的PHP7实现中,盐是为您内部处理的。

#3 楼

我将尝试回答您迄今为止被忽略的部分问题:


何时需要使用它以及为什么/不应该使用它。


简短的回答是,作为一个业余爱好者,您不应该在要求直接处理盐的级别上使用加密。

例如,bcrypt密码哈希算法在内部使用盐。但是,它并没有向使用它的开发人员透露这一事实-您只需将密码传递给bcrypt(并且可以选择将参数设置为生成散列所需的“ CPU工作量级别”),然后返回散列。当需要验证密码是否正确时,可以同时传递bcrypt密码和先前生成的哈希值。它会指出密码是否是用于生成哈希的密码。这是一个低层的实现细节,如果您发现自己需要某种程度的工作,那么您的抽象层就太低了。密码术很难正确完成,Internet上充斥着好意的开发人员完全不安全的本地密码哈希方案。

#4 楼

引用“考试参考编号70-486开发ASP.NET MVC 4 Web应用程序(MCSD):开发ASP.NET MVC 4 Web应用程序”,Pearson Education,William Penberthy,2013年9月15日:


盐析是一个增强文件加密和散列的过程,使它们更难以破解
。在对哈希值进行散列或加密之前,盐析会在输入文本的开头或结尾添加随机字符串。例如,当尝试破解密码列表时,
黑客必须先考虑一下salt以及可能的密码信息,然后才能破解该应用程序。如果为每个被加盐的值分配了不同的盐值,
创建用于密码破解程序的潜在密码值表的功能将变得难以处理。


#5 楼

盐是访问加密数据以及密码所需的随机数。

如果攻击者不知道密码,并试图通过蛮力攻击来猜测,那么他尝试的每个密码都必须尝试每个盐值。

因此,对于一位盐(0或1),以这种方式进行加密的难度增加了两倍。两位数的盐会使它变成四倍,三位数的盐就变成八倍,以此类推。您可以想象使用32位盐的加密来破解密码有多么困难!

评论


$ \ begingroup $
否。通常认为攻击者知道食盐。在这种情况下,超过一些低阈值,盐不能提高安全性。
$ \ endgroup $
–fgrieu♦
2012年3月7日20:24



$ \ begingroup $
“通常认为攻击者知道盐”->谁在假设这个?
$ \ endgroup $
–迈克
2012年3月8日14:45

$ \ begingroup $
@Mike:谁?有人说:“您应该始终假设攻击者知道盐分。”另一页上的人们说“盐是公开的”,后来说“盐是已知的,因为这是盐一词的行业标准用法”。另一个人说“盐是公共知识,或至少应被视为公共知识”。
$ \ endgroup $
–大卫·卡里(David Cary)
2014年6月11日下午4:49