我在理解盐密封的目的时遇到了一些麻烦.据我所知,主要用途是阻碍彩虹表攻击.但是,我看到实现这一点的方法似乎并没有真正解决问题.
我见过许多教程,建议将盐用作以下内容:
$hash = md5($salt.$password)
Run Code Online (Sandbox Code Playgroud)
原因是哈希现在不映射到原始密码,而是密码和盐的组合.但是说$salt=foo和$password=bar和$hash=3858f62230ac3c915f300c664312c63f.现在有人用彩虹表可以反转哈希并提出输入"foobar".然后他们可以尝试所有密码组合(f,fo,foo,... oobar,obar,bar,ar,ar).获取密码可能需要几毫秒,但其他情况并不多.
我见过的其他用途是在我的linux系统上.在/ etc/shadow中,散列密码实际上与 salt一起存储.例如,"foo"的盐和"bar"的密码将散列到此:$1$foo$te5SBM.7C25fFDu6bIRbX1.如果一个黑客以某种方式能够得到这个文件,我不知道盐服务的目的是什么,因为te5SBM.7C25fFDu6bIRbX已知反向哈希包含"foo".
感谢任何人都可以解决这个问题.
编辑:谢谢你的帮助.为了总结我的理解,salt使得散列密码更加复杂,从而使得它更不可能存在于预先计算的彩虹表中.我之前误解的是,我假设所有哈希都存在彩虹表.
据我了解,生成盐的最佳做法是使用源代码中存储的一些神秘公式(甚至魔术常量).
我正在研究一个我们打算作为开源发布的项目,但问题是源代码是生成盐的秘密公式,因此能够在我们的网站上运行彩虹表攻击.
我认为很多人在我面前都考虑过这个问题,我想知道最佳做法是什么.在我看来,如果代码是开源的话,根本就没有盐,因为盐可以很容易地进行逆向工程.
思考?
在我已经阅读过关于公钥加密的解释中,据说通过将2个极大的素数相乘来得出一些大数.由于对大质量产品进行分解几乎不可能耗费时间,因此您具有安全性.
这似乎是一个可以通过彩虹表轻易解决的问题.如果您知道所使用的素数的大致大小并且知道其中有2个,您可以快速构建彩虹表.它是一个强大的表,但它可以完成,任务可以跨硬件并行化.
为什么彩虹表不是基于乘以大素数而击败公钥加密的有效方法?
免责声明:显然,数以万计的疯狂智能安全意识的人不会错过几十年我在下午想到的事情.我认为我误解了这一点,因为我正在阅读简化的外行解释(例如:如果使用超过2个数字),但我还不知道我的知识差距在哪里.
编辑:我知道"彩虹表"涉及在查找表中使用预先计算的哈希,但上面的声音听起来像彩虹表攻击所以我在这里使用这个术语.
编辑2:如答案中所述,没有办法存储所有素数,更不用说它们的所有产品.
即使1 exabyte重1克,我们也无法达到2.17×10 124所需的能够将所有这些数字装入带有太阳质量的硬盘中
cryptography rainbowtable public-key-encryption prime-factoring
我花了两个小时阅读盐渍密码,确保我理解了这个想法.我希望你们中的一些人可以分享你对我的结论的了解.
如果这是真的那么盐腌似乎真的没有那么多帮助.它只会轻微地减慢攻击者的速度.
我知道理想情况下你会想要强制使用复杂的密码并用独特的随机字符串加密它们,但强制使用复杂的密码会让用户烦恼(我知道这让我感到烦恼),所以很多网站都不这样做.看起来网站对他们的用户不利,并且强制复杂的密码比一个好的腌制方法更重要.
我想这不是一个问题,而是要求其他人了解情况.
当我们说字典攻击时,我们并不是真正的字典,是吗?我猜我们是指一个黑客的字典,即彩虹表,对吗?
我的观点是,我们不是在谈论别人的密钥不同的密码进入登录框,我们在谈论谁的人有完全访问你的数据库(已哈希密码,而不是普通的密码)和这个人扭转哈希,右?
有谁知道它为什么叫彩虹表?记得我们已经知道有一种叫做"字典攻击"的攻击.为什么不是字典?
让我们假设一个简单的非盐渍哈希函数,只是一个普通的旧函数$hash = md5($pass).
物业:
鉴于前提2,这意味着黑客已经控制了数据库,在这一点上你手上有一个更大的问题.
因此,试图阻止彩虹表攻击只是为了保护从已经受损的数据库/系统中检索密码.它是那么简单还是我还缺少其他东西.
我已经熟悉密码散列技术,但我只是想知道为什么有关于彩虹表的炒作很多.谢谢!
可能重复:
md5解码.他们是怎么做到的?
这个页面表明,由于我们现在拥有巨大的处理能力,可以颠倒像md5()和sha1()这样的哈希算法.在这一点上,我认为只有彩虹表才有可能.我错了吗?
如果Rainbow Tables是唯一的方法,有人可以如何反转用盐制作的哈希?
在这个密码学的帖子中说
链条可以随意移动,直到它达到原始输入.当它到达那一点时,它将重复自己,它将是无用的.
所以我的出发点是,12345但我不能得到终点并且无限循环,因为12345不重复.我正在使用qt4.7(lib版本:4.7.3)来实现这一目标.这是我的代码
rainbowTable::rainbowTable(QWidget *parent) :
QWidget(parent),
ui(new Ui::rainbowTable)
{
ui->setupUi(this);
passwordLength = 5;
qDebug() << getLastReduction("12345",false);
}
QString rainbowTable::hashString(QString value)
{
QString dataToReturn = QString(QCryptographicHash::hash((value.toAscii()),QCryptographicHash::Md5).toHex());
return dataToReturn;
}
QString rainbowTable::reductionOfString(QString hash)
{
QString dataToReturn = "";
int iterator = 0;
while ( iterator < hash.count() )
{
if ( hash.at(iterator) == '0' ||
hash.at(iterator) == '1' ||
hash.at(iterator) == '2' ||
hash.at(iterator) == '3' ||
hash.at(iterator) == '4' || …Run Code Online (Sandbox Code Playgroud) rainbowtable ×10
security ×6
cryptography ×4
hash ×4
salt ×3
passwords ×2
c++ ×1
encryption ×1
open-source ×1
php ×1
qt ×1
qt4 ×1