查找JavaScript字符串的所有组合

查找JavaScript字符串的所有组合,javascript,Javascript,我刚刚读了一篇有趣的文章,想出了一个主意,用JavaScript“破解”我自己的密码(字符串/函数参数)需要多长时间 我如何编写一个函数,它只是将所有可能的字母组合(以及后面的数字,可能是特殊字符等)与该函数的某个输入参数(类型是string)进行比较。可能的字符将在数组中列出 e、 g: 我可以为只有1个字母的输入参数找到一个解决方案(但我仍然无法将更长的字符串传递到该函数)。如何处理诸如“cloud”、“play”等字符串的问题非常令人困惑。我正在考虑使用for循环来解决这个问题,但我真的不

我刚刚读了一篇有趣的文章,想出了一个主意,用JavaScript“破解”我自己的密码(字符串/函数参数)需要多长时间

我如何编写一个函数,它只是将所有可能的字母组合(以及后面的数字,可能是特殊字符等)与该函数的某个输入参数(类型是string)进行比较。可能的字符将在数组中列出

e、 g:

我可以为只有1个字母的输入参数找到一个解决方案(但我仍然无法将更长的字符串传递到该函数)。如何处理诸如“cloud”、“play”等字符串的问题非常令人困惑。我正在考虑使用for循环来解决这个问题,但我真的不知道从哪里开始循环,也不知道如何为我还不知道长度的输入编程循环

我的职能:

function crack(x) {
  var timerStart = Date.now();  //for curiosity I want to log the time of the entire calculation
  var s = String(x);            //make sure the input is of type string (gets interesting when numbers are used in the string)

  for(i=0; i < letterDB.length; i++) {
      if (s == letterDB[i]) {
          console.log("found same combination as your input");
          console.log("letter was: " + letterDB[i]);
          console.log("interval: " + i);
          console.log("calculation time:", Date.now() - timerStart);  //interesting to see the time of the calculation when my input parameters will get longer and harder to crack because of special characters.
      }
  }
}
功能裂纹(x){
var timerStart=Date.now();//出于好奇,我想记录整个计算的时间
var s=String(x);//确保输入的类型为String(在字符串中使用数字时会变得有趣)
对于(i=0;i
您只需在字符串中循环并遍历所有字母:

function crack(x) {
    var timerStart = Date.now();
    x = x.toString();
    var charsArr = s.split('');
    var result = charsArr.every(function(char) {
        return letterDB.includes(char);
    });
    if (result) {
        console.log("Success! calculation time:", Date.now() - timerStart);
    }
    console.log("fail");
    return result;
}

如果结果为true,则意味着您可以从
lettedb
数组构建字符串。

如注释中所述,这将花费永远的时间。然而,使用递归实现基于置换的破解程序相对简单

var input = "ad";
var done = false;
var maxLength = 2;
var letterDB = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"];

function recursion (str) {
   for (var i=0; i < letterDB.length; i++) {
      var test = str+letterDB[i];
      if (test !== input && !done && str.length < maxLength) {
         recursion(test);
      } else if (test === input) {
         done = true;
         alert("your pass is "+test);
      }
   }
}
recursion("");
var input=“ad”;
var done=false;
var maxLength=2;
var letterDB=[“a”、“b”、“c”、“d”、“e”、“f”、“g”、“h”、“i”、“j”、“k”、“l”、“m”、“n”、“o”、“p”、“q”、“r”、“s”、“t”、“u”、“v”、“w”、“x”、“y”、“a”、“b”、“c”、“d”、“e”、“f”、“g”、“h”、“i”、“j”、“k”、“l”、“m”、“n”、“o”、“p”、“r”、“s”、“t”、“u”、“x”、“y”、“z”];
函数递归(str){
对于(变量i=0;i

为了判断这有多慢,密码
cloud
花了我33秒才找到(maxlength设置正确)。对于长度较大的任何东西,时间都会非常快地增加。

这些事情需要大量的时间才能完成,这使得它们甚至尝试都毫无意义。我建议改为看字典攻击。它们虽然没有那么有效,但速度更快。请注意,破解密码通常是通过生成一个完整的密码并查看它是否匹配来完成的,而不是一次只检查一个字符,因为存储的密码应该被加盐和散列,因此不可能像您试图做的那样一次检查一个字符。一次输入一个字符比输入整个密码要快得多。你说得对。但我试图提高我对JavaScript函数和编程模式的总体理解。思考问题并形成解决方案的方式。不过,我还是把寻找快速破解密码的切实可行的方法留给了Crypto City的人们。如果
letterDB.includes(char)==true,你可以简单地循环字符串并检查每个字母@GSWV需要使用函数和输入参数进行求解。e、 g.裂缝(“海洋”)..//日志计算时间:2分钟。我不认为他试图检查输入是否有效,他想知道破解生成所有可能的字符串排列的输入需要多长时间
var input = "ad";
var done = false;
var maxLength = 2;
var letterDB = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"];

function recursion (str) {
   for (var i=0; i < letterDB.length; i++) {
      var test = str+letterDB[i];
      if (test !== input && !done && str.length < maxLength) {
         recursion(test);
      } else if (test === input) {
         done = true;
         alert("your pass is "+test);
      }
   }
}
recursion("");