Passwords 如何强制使用已多次散列的密码?

Passwords 如何强制使用已多次散列的密码?,passwords,hash,Passwords,Hash,昨天我问了一个关于安全散列的问题,这让我想到了一个人实际上会如何破解一个用自定义散列算法创建的密码。我当前的(非常不安全的)密码脚本在密码上使用sha1的迭代,然后在由该密码生成的哈希上使用3位数的salt进行迭代 $hash = sha1($pass1); //creates a 3 character sequence function createSalt() { $string = md5(uniqid(rand(), true)); return substr($st

昨天我问了一个关于安全散列的问题,这让我想到了一个人实际上会如何破解一个用自定义散列算法创建的密码。我当前的(非常不安全的)密码脚本在密码上使用sha1的迭代,然后在由该密码生成的哈希上使用3位数的salt进行迭代

$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&abel的程序,它可以对特定的哈希算法进行暴力攻击,但是我该如何做,比如获取每个尝试过的密码,将其sha1,将其连接到(已知)salt,然后再次sha1?这看起来很简单,但我从来没有用C++语言编程过,我认为这是必要的。p> 编辑: 我要具体说明以下几点:

这是一种离线暴力攻击

我有一个数据库,里面全是散列和它们各自的盐

盐是每个用户的,但我一次只想攻击一个用户的密码

具体来说,我要问的是如何使用一系列自定义哈希算法强制输入密码,如我在上面展示的算法:

伪代码:

$hash = sha1( 'password' );
$salt = '3Sf';
$hash = sha1( $salt.$hash);
我认为,无论使用何种方法,也可以使用已知算法对密码进行哈希运算,例如:

$hash = sha1( 'password' );
$salt = '3Sf';
for($i; $i<1000; $i++){
    $hash = sha1( $salt.$hash);
}
$hash=sha1('password');
$salt='3Sf';

对于一个问题来说,太简单了。在一个帖子里有很多事情需要考虑,而且有太多的事情要做,但是这里有几个。1)黑客有密码存储吗?如果是这样,暴力攻击可能会更成功,因为没有其他缓解措施阻止攻击继续进行。2) 黑客是否能够渗透你的系统并泄露你的盐/哈希系统?这将使暴力攻击更加容易,特别是如果1为真。3) 如果1和2为假,是否有适当的缓解系统来防止/减缓暴力攻击,例如在一行中出现大量错误密码后锁定帐户等


总的来说,网络钓鱼,尤其是鱼叉式网络钓鱼,在维护良好/安全的系统上比暴力更容易成功,尽管暴力也是实现DOS的一种很好的方式。基于这一主题有一个完整的学科,而且还有很多要考虑的问题。

据我所知,没有广泛可用的哈希破解工具支持这个功能。

但是,正如您所说的,如果有足够的时间,编写一个程序来破解散列将非常简单

如果你的攻击者已经知道你计算盐散列的方法,我们可以安全地假设他可以访问你的数据库(这必然也会存储盐)、转储或访问你的应用程序和客户端之间的明文通信

然后,为了破解散列,他只需复制您的sha1($salt.$hash)函数,并开始向其提供通用密码。与纯粹的暴力强制所有可能的组合相比,这将节省时间。他会从数据库中取出$salt,并将经过哈希处理的salt密码的结果与存储在同一数据库中的salt哈希进行比较。 如果结果哈希匹配,则密码已被“破解”

一般来说,为每个用户使用单独的密码是一个好主意,因为它会以指数方式增加破解整个DB密码表的时间。他将不得不针对数据库中的每个哈希PW运行整个单词列表,而不是针对单个哈希函数和单个salt运行单词列表


这就是说,如果攻击者深入到您的系统中,实际获取哈希值/盐,那么他将更容易修改您的代码,首先向他发送登录用户凭据的纯文本副本。

ahhh很抱歉,我再次没有清楚地解释我的问题。让我来澄清一下