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

时间:2012-09-05 16:31:01

标签: javascript hash brute-force cracking

在我开始讨论实际问题之前,我想澄清一些事情,因为我知道,当脱离上下文时,“使用javascript强制执行”是多么荒谬:)。

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

我目前陷入了如何实际实施这种强力功能的两大问题。 所以我现在的主要问题是,坦率地说,我还没有真正解决Javascript问题。对于初学者,我只会使用硬编码字符集:字母数字,小写和大写,没有特殊字符。问题是我老实说完全不知道如何实际实现将尝试字符组合的函数,如何编程。我可以想象使用包含charset的普通数组,然后是两个字符串。一个字符串将包含范围,另一个字符串将包含尝试的组合。所以我会以某种方式迭代charset数组,字符串可能是级联的for循环或其他东西,但我真的坚持'如何'的问题:)。我不希望你们中的任何人真正为我提供这样一个函数的完整源代码(当然除非你想要),但我真的很感激有关如何实现这种强力函数的一些提示或解释。此时我也不打扰性能或优化编码,而是关于全面编码,或者您可能想要称之为的任何内容:)

很抱歉,如果我对问题中的某些细节感到困惑。如果是这样,请告诉我,我当然会尝试进一步澄清。

1 个答案:

答案 0 :(得分:1)

字母表上的暴力样式功能。可能有更简单的方法来做到这一点。

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
}

然后使用例如

brute('0123abcd', '0c', 0, 20); // [14, "0c", "0c"]