【问题标题】:implementing brute force attacks on hash values in Javascript在Javascript中对哈希值实施蛮力攻击
【发布时间】:2012-09-05 16:31:01
【问题描述】:

在我回答实际问题之前,我想澄清一些事情,因为我知道“使用 javascript 暴力破解”在脱离上下文时听起来是多么荒谬:)。

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

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

对不起,如果我对我的问题中的一些细节感到模糊。如果是这样,请告诉我,我当然会尝试进一步澄清。

【问题讨论】:

  • 您可能会在 security.stackexchange.com 上得到更好的答案
  • hm 可能是真的,谢谢 - 我还没有仔细查看这里的 stackexchange 平台中有哪些论坛 :)。我会在那里重新发布,但我希望如果我把这个问题留在这里也没关系,看看会发生什么。
  • 第二个问题应该在它自己的页面上 - 只需从这里删除它。如果您想知道应该通过哪些可能性,请在安全论坛中询问。如果您知道应该生成哪些词,但不知道如何生成,请告诉我们是哪些词。
  • 好的,我把第二个问题的部分拿出来了。 “应该生成哪些单词”是什么意思?我一般都知道蛮力是如何工作的:基本上是尝试从给定字符集中获取的所有可能的字符组合。我的问题是我不知道如何在编程方面实现这一点,就“我可以使用哪些流程/动作来执行此任务”而言。

标签: javascript hash brute-force cracking


【解决方案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"]

【讨论】:

  • 感谢您的帮助,但这就是为什么我说书面解释或只是提示会很好的原因 - 你在抛出异常后立即失去了我 - 从那里我......我不' t真的明白这里发生了什么:)。如果您愿意澄清一点,那将是非常棒的。但无论如何感谢您的帮助。
  • 在第一个异常之后 - 检查alphabet 的输入的type,如果它不是字符串,则将其转换为字符串(因为您可以对字符串执行数组样式的操作)。在第二个例外之后是复杂的位 - 如果你想计算(例如二进制,以 2 为基数)0, 1, 10, 11, 100, 101, 110, 111,那很容易,但如果你想做0, 1, 00, 01, 10, 11, 000, 001, ...,那就更难了。一种方法是在上面工作一个基础(例如基础 3),这就是我所做的。然后循环整数 => 字符。
  • 要检查哈希值,您可以更改 if(test.length === ml &amp;&amp; test === m) 行以检查 test 的哈希值是否与您想要查找的内容(即 if(myHash(test) === match)
  • 这让我很烦恼,然后我注意到我第一次做的方法是错误的(在中间重复)所以我已经改变了很多并为几乎每一行添加了 cmets。新方法在前面加上一个标识 (1),然后将其切断,这样我们就可以得到每个结果。 @slagjoeyoco 希望这更有帮助。
  • 您好,非常感谢您添加 cmets,非常有用。要么是我现在缺乏咖啡,要么我只是在简单的数学方面很愚蠢,但是在对你的代码进行了一些思考和鬼混之后,我留下了两个问题:1)我现在明白你在做什么最后一个 if-check 来确定你是否需要另一个数字,但是:你到底是怎么想出这个源的?! :) 有没有更简单的方法可以找出答案?我的意思是,你怎么知道这些数字总是会出现什么?现在为这个困惑的问题道歉,但我真的不知道该怎么问......
猜你喜欢
  • 2011-06-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-01
  • 2020-06-26
  • 2013-05-28
相关资源
最近更新 更多