【发布时间】:2020-09-28 02:35:00
【问题描述】:
我正在做一个需要暴力破解PDF密码的项目。
因为PDF.js 用于验证密码,promise.race 用于运行并行函数以使整体工作快速。
这就是我实现它的方式:
var sfile = "KRIS.pdf"
var dBuf = fs.readFileSync(sfile);
const tryCases = getCombos(alphaArray, 4); // permutation having total length 456976
var finishFunction = false;
async function getPass(startAt = Number(), endAt = Number()) {
var isDone = false;
var currentPass = ''
for (let index = startAt; index < endAt; index++) {
if (finishFunctions) { return; }
currentPass = tryCases[index].join("");
await pdfjsLib.getDocument({ data: dBuf, password: currentPass }).promise
.then((r) => {
console.log('Worked: ' + currentPass);
isDone = true;
pdfjsLib.distroy();
return new Promise.resolve();
})
.catch((e) => { })
if (isDone) {
finishFunctions = true;
return currentPass;
}
}
console.log(`Hey Nothing From ${startAt} - ${endAt}`);
}
console.time('Found ');
Promise.race([
getPass(0, 100000),
getPass(100000, 200000),
getPass(200000, 300000),
getPass(300000, 400000),
getPass(400000, 456976)
])
.then((s) => { console.timeEnd('Found '); console.log('HeyThen ' + s) })
.catch((e) => console.log('Hey Error ' + e));
现在可以获取 4 个字母的密码,但是有问题阻止它完成。
第一个当前函数非常慢,即使在运行并行函数之后也需要很长时间。
第二次我添加了一个标志来停止其他并行功能,但它无法按预期使用 4 个字母强制。
第三资源使用率真的很高。我的 Linux 系统停止响应。
为了可视化时间和标志问题,我使用了 3 个字母强制,这里是它的日志:
Worked: KRIS
Found: 13950.743ms
HeyThen KRIS
Hey Nothing From 4934 - 8788
Hey Nothing From 0 - 4394
Hey Nothing From 13182 - 17576
(node:3068) [DEP0005] DeprecationWarning: Buffer() is deprecated due to security and usability issues. Please use the Buffer.alloc(), Buffer.allocUnsafe(), or Buffer.from() methods instead.
【问题讨论】:
-
您的原始代码(只有一个循环)不使用
await,并且会同时触发所有myFunc.getDocument(…)调用。您的ATryCase函数按顺序执行调用(await一个接一个地调用它们),所以如果有的话,它应该会更慢。如果它们都花费相同的时间,则表明您的getDocument函数无论如何都会进行内部排队,并且几乎没有改进的余地。 -
鉴于您的
ATryCase函数访问多个文档(不仅仅是一个文档),您希望它返回什么值? -
1.我从来没有说过我的单循环使用等待。我说过为什么正常循环需要与基于承诺的循环相同的时间,后者分为多个工作。 2.
myFunc.getDocument是基于 promise 的函数,如果我不使用 await ,那么函数就会混乱。 getDocument 没有做太多。它只是验证currentPos是否是要处理的正确值。将其视为密码检查程序。每次验证currentPos是否为真时,都会中断循环并返回 currentPos。 -
你说的“分成多个工作”是什么意思?每个
myFunc.getDocument(…)已经是它自己的工作。唯一的区别是一次调用它们还是一个接一个地调用它们。 -
不擅长使用精确的词。我的意思是
using of Promise.race。 4ATryCase被调用,每次迭代 30 次,第一个找到它的人会返回它。
标签: javascript node.js promise async-await