盐的目的是什么?

use*_*949 8 security md5 salt

在Linux系统中,使用MD5哈希存储密码.为什么"盐"的使用可以更多地保护系统?特别是,我想说明以下两点

  1. 据说盐用散列以明文形式存储,然后当攻击者知道盐值时它如何防止攻击者.(攻击者可以是自己可以检查的系统管理员 /etc/shadow.
  2. 如果每次都随机生成盐,系统如何比较哈希以验证用户?

例如,用户A具有用户salt s1并生成h1; h1 = md5(password.s1);.下一次,它使用salt s2,系统必须生成不同的哈希值h2 = md5(password.s2).由于h1不等于h2,系统如何验证用户?

小智 13

MD5是一个你知道的哈希,所以如果你给它一个输入,比如'PASSWORD',你会得到一个独特的(希望 - 但是MD5现在有碰撞)输出,比如'3DE2AF ......'.

现在,正如你所知道的那样,直到有人认为是很难直接反转...等等,为什么我不能预先生成所有可能的哈希值组合,直到我可以反转哈希值.这被称为彩虹表.

salt的目的是将任意随机数据添加到正在散列的字符串中,这样就可以增加hash的输入长度.这意味着一般的彩虹表,只能反转输入到哈希的密码将无法正常工作.当然,彩虹表只是反向查找,你可以简单地生成一个彩虹表来补偿所有可能的密码+盐输出.这是长度增加的地方; 由于反转哈希的性质,为非常长的哈希输入生成反转的磁盘空间很快变得不可行.6-8个字符的字母数字彩虹表已经是几千兆字节; 增加长度和字符类,你开始以10GB的倍数说话.

当然,如果你正在用'密码'腌制而你用'密码'来表示你正在散布'PASSWORDPASSWORD',那就不那么安全了,所以盐的选择也很重要.理想情况下,您应该使用随机盐和每个散列字符串,但当然,您需要知道它是什么.一种常见的技术是从用户名或本案例独有的其他属性中导出salt.添加任意数据本身并不有用; 具有用户确定的盐数据现在增加了额外的复杂性,这意味着需要彩虹表以及对每个用户的专门搜索.你越难以实现这一点,就需要越多的计算能力.这就是战斗的地方.

但是,有一些现代技术.我不是专家,所以我不能告诉你这些是多么安全,但值得一提.这个概念是慢哈希.基本上,通过复合散列函数,您需要花费一些时间来计算每个散列.因此,每个用户检查密码的能力现在为您要检查的每个密码添加了恒定的时间量.如果你是暴力破解,那就是坏消息(tm).类似地,如果系统设计得很好,如果没有快捷方式(可能等同于弱点),那么为慢速哈希函数生成彩虹表也需要一段时间.

在此处编辑更多细节.请参阅crypt()第一个示例.@CodeInChaos引用了PBKDF2,它构成了PKCS#5的一部分.更新的发展是scrypt.

正如我所说,我不是专家密码分析师.在后一个例子中,我对其适用性没有特别的专业知识,我只是告诉你事情的发展方向.

编辑2澄清了我写的盐 - 我想我之前围绕磁盘空间的关键问题跳了起来.


vau*_*ham 5

您可以通过强力反转简单的哈希算法.

如果您使用密码的常用词,则某些预建表(如彩虹表)可能包含它们.这就是大多数算法多次调用哈希函数的原因:

md5(md5(md5(password)));
Run Code Online (Sandbox Code Playgroud)

使用salt为生成的密码提供了更多的随机性,从而减少了猜测.它包括在过程中添加一个随机的字符串

md5(md5(md5(password+string)+string)+string);
Run Code Online (Sandbox Code Playgroud)


归档时间:

查看次数:

3355 次

最近记录:

14 年,3 月 前