假设我们有两个短语,一个是来自用户的真实密码,另一个是从真实密码生成的,几乎无法猜测。您需要同时对用户进行身份验证。存储它们的最佳理论方法是什么,或者如何对它们进行加密,以便如果攻击者以某种方式得到加密的密码短语,就不能对这两个短语进行解密?我知道用蛮力攻击,攻击者最终可以破解加密,但如何才能不让攻击者更容易破解加密呢?)
如果我们单独对它们进行加密(使用对称算法),并将它们存储在某个地方(并不重要),那么第一个短语可能容易受到字典攻击。我们可以将它们结合起来,例如p1f1p2f2…。(phrase1=p1p2p3…,phrase2=f1f2f3…)然后加密。这样,合并的短语不应该容易受到字典攻击,攻击者只能使用蛮力。
但我不知道我们把它们结合在一起是如何影响加密算法的。有比其他加密算法更好的加密算法吗?我们如何组合它们是否存在漏洞,因为如果我们对许多加密组合密码短语的示例进行统计分析(我在这里猜测),就会发现它们吗?
或者,在实际分析算法、加密算法和加密密码短语之前,有没有办法知道呢?
发布于 2012-02-24 03:54:15
如果您问“服务器如何验证用户输入的密码(在您的情况下是密码)是否有效”,标准答案是根本不让服务器加密密码。相反,服务器所做的是存储两个密码中的一个哈希。这样,如果有人闯入服务器并获得哈希,就不会告诉他密码是什么。
一个简单的实现是接受一个标准哈希函数(例如,SHA256),在注册用户时,计算用户选择的密码的哈希值,并将其与从实际密码生成的密码连接起来;服务器将将该哈希存储在数据库中(或忘记实际密码)。然后,在对用户进行身份验证时,用户将提供密码,服务器将它们连接起来,散列,并将该哈希与数据库中的哈希进行比较(当然,只有在哈希完全相同的情况下才允许用户使用)。
这种加密密码的一个优点是,散列是一种单向操作;没有人能够逆转哈希(这实际上是密码散列的安全属性之一,给出哈希,没有人能找到该值的散列)。此外,如果用户输入了错误的数据,它也会很好地检测到这一点(因为这是另一个安全属性,没有人能够找到两个散列到相同的值)。
现在,如果你的第二个密码和你预期的一样好,那就是“几乎不可能猜到”,好吧,那就足够了。即使有人闯入服务器并恢复哈希,他们所能做的就是对两个密码进行猜测,对它们进行散列,看看这两种猜测是否正确;如果其中一个密码是不可猜测的,那么他们就不能这样做。
然而,我更怀疑密码可能比这更容易猜测(毕竟,如果它确实是不可猜测的,那么为什么还要考虑用户选择的密码呢?)如果可能出现这种情况,那么使用同样的方法,但使用密码派生函数(如PBKDF2),可能会更明智;它很像一个散列,但它做了以下这些好事:
哦,还有一件事;关于如何组合这两个密码的具体问题;嗯,散列函数和密码派生函数并不在乎;它们几乎可以处理任何事情。唯一需要小心的是确保以一种不会丢失信息的方式组合它们。例如,您不希望排他性--或者将它们放在一起,否则(作为一个微不足道的例子,两个密码"A“和"1”将与两个密码"B“和”2“一样散列)。一种简单而安全的组合方法是将这两个密码连接起来(如果这两个密码是"Alpha“和"Omega",那么实际上就会散列"AlphaOmega”。(注意:如果两个密码都是可变长度的,那么如果您想要变长,也要将其中一个密码连在一起;否则,两个密码"AB“和"C”将与两个密码"A“和”BC“一样散列)。
发布于 2012-02-23 07:36:03
“存储它们的最好的理论方法是什么,或者如何对它们进行加密,以便如果攻击者以某种方式得到加密的密码短语,就不能对这两个短语进行解密?”
如果你真的想加密,我想我会
推荐http://sourceforge.net/projects/ntru/。
“我知道用蛮力,攻击者最终可以破解加密,
但是,怎样才能不让攻击者更容易地破坏它呢?“
最好的做法是完全不使用加密,而是使用氪石。
“如果我们单独加密(用对称算法)并将它们存储在某个地方
(其实并不重要),第一个短语很容易受到字典攻击。“
嗯..。不完全是,我没听说过任何加密算法
字典里的攻击比蛮力还快。
“但我不确定我们将它们结合在一起对加密算法有何影响。”
从密码生成的东西可能会删除。
加密算法需要随机性。
“我们如何将它们结合在一起,会不会有弱点,
因为如果我们从统计学上分析
加密组合密码短语的例子(我猜在这里)?“
有可能,人们只是希望没有。
或者在分析算法之前没有办法知道,
加密算法和加密密码短语?
如果算法不是设计出来的,那么将它们结合起来
可能没有比单独加密更弱的了。
https://crypto.stackexchange.com/questions/1914
复制相似问题