我刚刚阅读了一篇有趣的文章Bruce Schneier - Choosing Secure Passwords,并提出了一个想法,即找出JavaScript需要多长时间“破解”我自己的密码(字符串/函数参数)。
如何编写一个函数,简单地将所有可能的字母组合(以及后来的数字,可能是特殊字符等)与该函数的某个输入参数(类型为字符串)进行比较。可能的字符将列在数组中。
e.g:
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"];
// actually I would like to use a Regular Expression instead of my own letterDB, but for the beginning it is fine.
我可以找到只有1个字母的输入参数的解决方案(但我仍然缺少将更长的字符串传递给该函数)。如何处理像“云”,“播放”等字符串的问题是非常令人困惑的。我正在考虑用for循环来解决这个问题,但我真的不知道从哪里开始循环以及我如何programm循环输入,我还不知道它的长度。
我的功能:
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.
}
}
}
答案 0 :(得分:0)
您可以简单地遍历字符串并遍历所有字母:
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,则表示您可以从letterDB
数组构建字符串。
答案 1 :(得分:0)
正如评论中所说,这将需要永远。但是,使用递归实现基于排列的破解程序相对简单。
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("");
为了衡量这是多么慢,密码cloud
花了我33秒才找到(正确设置了maxlength)。对于任何长度较大的东西,时间会非常迅速地升级。