我昨天问了一个关于安全散列的问题,这让我想到了如何实际打破使用自定义散列算法创建的密码。我当前(非常不安全)的密码脚本在密码上使用sha1的迭代,然后在前面生成3位盐的哈希值上进行迭代。
$hash = sha1($pass1);
//creates a 3 character sequence
function createSalt()
{
$string = md5(uniqid(rand(), true));
return substr($string, 0, 3);
}
$salt = createSalt();
$hash = sha1($salt . $hash);
现在我,作为此服务器的管理员并完全访问源代码和密码表,加上管理工具可以简单地将用户的密码重置为我想要的任何内容,但为了更好地理解安全性,我是好奇如何以黑客的方式去做这件事。我有一个名为cain& amp;的程序。 abel哪个暴力强制反对特定的哈希算法,但我怎么做一些事情,比如取每个尝试过的密码,将它连接起来,将它连接到(已知的)盐,然后再次进行修改?这似乎很简单,但我从来没有使用像C ++这样的语言编程,我认为这是必要的。
我应该指定以下内容:
这是一次离线蛮力攻击。
我的数据库中充满了哈希值及其各自的盐。
盐是每个用户,但我只想一次攻击一个用户的密码。
具体来说,我问的是如何使用一系列自定义散列算法来强制输入密码,例如我上面展示的算法:
伪代码:
$hash = sha1( 'password' );
$salt = '3Sf';
$hash = sha1( $salt.$hash);
我认为无论使用哪种方法,这也可以用来强制使用已知算法进行哈希密码,例如:
$hash = sha1( 'password' );
$salt = '3Sf';
for($i; $i<1000; $i++){
$hash = sha1( $salt.$hash);
}
所以我并没有特别要求CODE做第一件事,我问的是我可以用什么方法运行一个强力程序来对抗自定义哈希算法,比如我上面列出的2。
注意:我没有说明我可能遇到这种情况,但我想知道它是如何完成的。
答案 0 :(得分:2)
据我所知,没有广泛使用的哈希破解工具支持此功能。
然而,正如你所说,如果给出足够的时间来编写一个程序来破解哈希,那将非常简单。
如果您的攻击者已经知道您计算盐渍哈希的方式,我们可以放心地假设他可以访问您的数据库(也必须存储盐),转储它或访问您的应用程序之间的纯文本通信和客户。
然后破解哈希,他只需复制你的sha1($ salt。$ hash)函数并开始向它提供常用密码。与纯粹强制所有可能的组合相比,这将节省时间。他从你的DB中获取$ salt,并将散列盐渍哈希密码的结果与存储在同一个DB中的盐渍哈希进行比较。 如果生成的哈希值匹配,则密码已“破解”。
通常,为每个用户使用单独的盐是一个好主意,因为它会增加以指数方式破解整个密码数据库表的时间。他不必使用单个盐对单个散列函数运行单词列表,而是必须针对数据库中的每个散列PW运行整个单词列表。
也就是说,如果攻击者远远超出你的系统来实际获取哈希/盐,那么他就会更容易改变你的代码,向他发送首先登录用户凭据的纯文本副本。
答案 1 :(得分:1)
问题太简单了。有很多事情需要考虑,并且在一篇文章中有太多的东西要点击,但这里有一些。 1)黑客是否有密码存储?如果是这样,暴力攻击可以更成功,因为没有其他缓解措施可以防止攻击继续进行。 2)黑客是否能够穿透您的系统并显示您的盐/哈希系统?这将使蛮力攻击更容易,特别是如果1为真。 3)如果1和2是假的,是否有适当的缓解系统来防止/减缓强力攻击,例如在连续多次不正确的密码后锁定帐户等。
基本上,网络钓鱼,特别是鱼叉式网络钓鱼更有可能在维护良好/安全的系统上取得成功,而不是蛮力,尽管蛮力也是实现DOS的好方法。基于这个主题有一个完整的学科,所以要考虑更多。