在Javascript中实现对哈希值的暴力攻击

在Javascript中实现对哈希值的暴力攻击,javascript,hash,brute-force,cracking,Javascript,Hash,Brute Force,Cracking,在我开始讨论实际问题之前,我想澄清一些事情,因为我知道脱离上下文时,“使用javascript进行暴力强制”听起来有多可笑:) 我正在准备我的学士学位论文,最后我打算实现一个基于Javascript的哈希破解程序。我们的想法是这样工作: 用户可以提交哈希值以及有关所用算法的信息。(其他)用户也可以点击网站上的按钮参与破解过程。 服务器的任务是接受提交的“订单”,并根据可用工作人员的数量将其拆分为多个范围。然后将范围发送给单击所述按钮的客户 我目前面临着两个大问题:如何真正实现这个暴力功能。 所以

在我开始讨论实际问题之前,我想澄清一些事情,因为我知道脱离上下文时,“使用javascript进行暴力强制”听起来有多可笑:)

我正在准备我的学士学位论文,最后我打算实现一个基于Javascript的哈希破解程序。我们的想法是这样工作: 用户可以提交哈希值以及有关所用算法的信息。(其他)用户也可以点击网站上的按钮参与破解过程。 服务器的任务是接受提交的“订单”,并根据可用工作人员的数量将其拆分为多个范围。然后将范围发送给单击所述按钮的客户

我目前面临着两个大问题:如何真正实现这个暴力功能。 所以我现在的主要问题是,坦率地说,我还没有完全适应Javascript。对于初学者,我只使用硬编码字符集:字母数字、小写和大写,没有特殊字符。问题是,老实说,我完全不知道如何实际实现这个函数,该函数将尝试所有的字符组合,以及如何编程。我可以想象使用一个包含字符集的普通数组,然后是两个字符串。一个字符串将包含范围,另一个字符串将包含尝试过的组合。因此,我必须以某种方式遍历字符集数组和字符串,可能是使用级联for循环或其他方法,但我确实遇到了“如何”的问题:)。我不希望你们中的任何人真的向我提供这样一个函数的完整源代码(当然,除非你愿意),但我真的很感激关于如何实现这样一个蛮力函数的一些提示或解释。在这一点上,我也不关心性能或优化的编码,而是关心全面的编码,或者你可能想叫它什么的:)


对不起,我的问题中有些细节不清楚。如果是这样,请告诉我,我当然会进一步澄清

字母表上的蛮力式函数。也许有更简单的方法可以做到这一点

function brute(alphabet, match, int_start, int_stop){
    var a = alphabet, al = 0,                     // for alphabet
        m = match.toString(), ml = m.length,      // for our compare
        i = int_start || 0, j = int_stop || 0,    // range of numbers to test
        k = 0, l = 0, add = 0, sub = 0, diff = 0, // for building test string
        test = '', found = false;                 // test string and result

    if(i < 0) throw 'int_start must be at least 0';

    if(a.constructor !== undefined){           // We need a string or array as
        if( a.constructor.name !== 'String' && // our alphabet so we check for
            a.constructor.name !== 'Array' )   // correct input and modify if
                a = a.toString();              // necessary, or if we can't, 
    }
    else throw 'Bad alphabet type';            // we throw an error

    al = a.length;    // shorthand length

    add = al;                             // when i=0, we start prefix here
    while(add <= i - sub) sub += add,     // then work out what we have to
                          add = add * al; // prefix our number with

    diff = add - sub; // shorthand to save calculations

    while( i < j ){   // actual brute force loop starts here
        test = '';       // empty any previous string
        k = diff + i;    // convert our number from "x" to "1x"

        while(k > 0){           // build it as a string
            l = k % al;         // get index of digit
            test = a[l] + test; // add digit to string
            k = ( k - l ) / al; // move digits along
        }

        test = test.substring(1); // cut off the initial "1" we added

        if(test.length === ml && test === m){ // compare test to what you want
            found = true;
            break;
        }

        i++;                  // prepare for our next loop
        if(i - sub === add)   // and if we need another digit
            sub += add,       // then recalculate our prefix
            add = add * al,   // and then
            diff = add - sub; // update the shorthand 
    }

    // brute force ended, let's see what we've got

    if(found === false) i = -1; // if not found, return -1 as index

    return [i, test, m]; // index found, string found with, what we were looking for
}

字母表上的蛮力式函数。也许有更简单的方法可以做到这一点

function brute(alphabet, match, int_start, int_stop){
    var a = alphabet, al = 0,                     // for alphabet
        m = match.toString(), ml = m.length,      // for our compare
        i = int_start || 0, j = int_stop || 0,    // range of numbers to test
        k = 0, l = 0, add = 0, sub = 0, diff = 0, // for building test string
        test = '', found = false;                 // test string and result

    if(i < 0) throw 'int_start must be at least 0';

    if(a.constructor !== undefined){           // We need a string or array as
        if( a.constructor.name !== 'String' && // our alphabet so we check for
            a.constructor.name !== 'Array' )   // correct input and modify if
                a = a.toString();              // necessary, or if we can't, 
    }
    else throw 'Bad alphabet type';            // we throw an error

    al = a.length;    // shorthand length

    add = al;                             // when i=0, we start prefix here
    while(add <= i - sub) sub += add,     // then work out what we have to
                          add = add * al; // prefix our number with

    diff = add - sub; // shorthand to save calculations

    while( i < j ){   // actual brute force loop starts here
        test = '';       // empty any previous string
        k = diff + i;    // convert our number from "x" to "1x"

        while(k > 0){           // build it as a string
            l = k % al;         // get index of digit
            test = a[l] + test; // add digit to string
            k = ( k - l ) / al; // move digits along
        }

        test = test.substring(1); // cut off the initial "1" we added

        if(test.length === ml && test === m){ // compare test to what you want
            found = true;
            break;
        }

        i++;                  // prepare for our next loop
        if(i - sub === add)   // and if we need another digit
            sub += add,       // then recalculate our prefix
            add = add * al,   // and then
            diff = add - sub; // update the shorthand 
    }

    // brute force ended, let's see what we've got

    if(found === false) i = -1; // if not found, return -1 as index

    return [i, test, m]; // index found, string found with, what we were looking for
}


您可能会在security.stackexchange.comhm上得到更好的答案,这可能是真的,谢谢您-我还没有仔细看看这个stackexchange平台中有哪些论坛:)。我会在那里转贴,但我希望如果我把这个问题留到这里就可以了,看看会发生什么。第二个问题应该在它自己的页面上——从这里删除它。如果你想知道哪些可能性你应该通过运行,在安全论坛询问。如果你知道应该生成哪些单词,但不知道如何生成,请告诉我们这些单词是什么。好的,我把关于第二个问题的部分拿出来了。“应该生成哪些单词”是什么意思?我大体上知道暴力是如何工作的:基本上是尝试从给定角色集中提取的所有可能的角色组合。我的问题是,我不知道如何在编程方面实现这一点,也不知道“我可以使用哪些流程/操作来执行此任务”。您可能会在security.stackexchange.comhm上得到更好的答案,谢谢您-我还没有仔细了解此stackexchange平台中有哪些论坛:)。我会在那里转贴,但我希望如果我把这个问题留到这里就可以了,看看会发生什么。第二个问题应该在它自己的页面上——从这里删除它。如果你想知道哪些可能性你应该通过运行,在安全论坛询问。如果你知道应该生成哪些单词,但不知道如何生成,请告诉我们这些单词是什么。好的,我把关于第二个问题的部分拿出来了。“应该生成哪些单词”是什么意思?我大体上知道暴力是如何工作的:基本上是尝试从给定角色集中提取的所有可能的角色组合。我的问题是我不知道如何在编程方面实现这一点,关于“我可以使用哪些流程/操作来执行此任务”。感谢您的帮助,但这就是为什么我说书面解释或只是提示会很好的原因-在抛出异常后,您立即失去了我-从那里我…我真的不明白这里发生了什么:)。如果你想澄清一下,那就太棒了。但无论如何,感谢您的帮助。出现第一个异常后,请检查
字母表的
输入类型
,如果不是字符串,请将其转换为字符串(因为您可以对字符串执行数组样式的操作)。第二个异常之后是复杂的位-如果您想计数(例如,二进制,基数2)
0、1、10、11、100、101、110、111
,这很容易,但如果您想进行
0、1、00、01、10、11、000、001,
,则要困难得多。一种方法是在上面做一个基地(例如基地3),这就是我所做的。然后循环整数=>chars。为了让它检查哈希值,你需要更改行
if(test.length==ml&&test==m)
来检查
test
的哈希值,检查你想要查找的内容(即
if(myHash(test)==match)
),这让我感到困扰,然后我注意到我首先做的方法是错误的(在中间重复)所以我对它做了很多修改&几乎每行都添加了注释。新方法的前缀是标识(1)在前面,然后把它切掉,这样我们就能得到所有结果。@slagjoeyoco希望这更有用。嗨,非常感谢你添加的评论,非常有用。要么是因为我现在没有咖啡,要么是因为我在简单的数学方面很笨,但是经过一些思考和玩弄你的代码之后,我剩下两个问题:1)我现在看到你在上一次if检查中做了什么,以确定你是否需要另一个数字,但是:你到底是怎么找到这个数据源的?!:)有没有更简单的方法来找出这个问题?我是说,你怎么知道这是什么