【发布时间】:2022-01-26 16:05:18
【问题描述】:
我有一个作业在后台处理解密作业的执行。 这是解密的代码:
export default async function (
job: Job<DecryptionJobPayload>,
cb: DoneCallback,
) {
console.log(
`[${process.pid}] Attempting Decryption delegated to job with UUID: ${job.id}`,
);
const {privateKey, sourcePath, outputPath} = job.data;
const pKey = await opengpg.readPrivateKey({armoredKey: privateKey});
const sourceStream = createReadStream(sourcePath);
opengpg
.readMessage({
armoredMessage: sourceStream,
})
.then((M) => {
opengpg
.decrypt({
message: M,
decryptionKeys: pKey,
})
.then((e) => {
e.data
.pipe(createWriteStream(outputPath))
.on('end', cb(null, 'SUCCESS'))
.on('error', cb(new Error('Error Occured'), 'FAILED'));
})
.catch((err) => cb(err, 'FAILED'));
})
.catch((err) => {
cb(err, 'FAILED READING THE MESSAGE FROM STREAM');
});
异常发生在这个catch块:
.catch((err) => {
cb(err, 'FAILED READING THE MESSAGE FROM STREAM');
});
以下例外:
Misformed armored text
at /usr/src/app/node_modules/openpgp/src/encoding/armor.js:250:25
at processTicksAndRejections (internal/process/task_queues.js:93:5)
在检查 openpgp.js 代码以查看导致 unarmor 函数中此类异常提升的原因之后。我找到了这3个案例:
- 它读取一个未定义的行:
if (line === undefined) {
throw new Error('Misformed armored text');
}
- 如果编写器在实际关闭之前完成:
const { done, value } = await reader.read();
if (done) {
throw new Error('Misformed armored text');}
- 我不太确定...但是如果有人可以提供帮助,这里是代码!
const { done, value } = await reader.read();
const reSplit = /^-----[^-]+-----$/m;
const line = value + '';
if (line.indexOf('=') === -1 && line.indexOf('-') === -1) {
await writer.write(line);
} else {
let remainder = await reader.readToEnd();
if (!remainder.length) remainder = '';
remainder = line + remainder;
remainder = util.removeTrailingSpaces(remainder.replace(/\r/g, ''));
const parts = remainder.split(reSplit);
if (parts.length === 1) {
throw new Error('Misformed armored text');
}
起初我以为问题可能出在文件格式上,但文件是由之前工作中的同一个包生成的...
更新 1 我在我的文件中测试了第三个可能的原因,以确定它的作用。 当我们到达消息中存在“=”或“-”的部分时,最后一段代码开始执行,例如在我使用的这个测试文件中:
-----BEGIN PGP MESSAGE-----
wV4D657zkXTrd+wSAQdA2p3p2iMnFX7oHSPSFSJP20J4ibR3ilwz1T6XO7jo
.....
.....
zef62S0eNiLhU1KTThfYNKLuiG8y4N90MSlH92ruYC8RFiMvuaDud52sl4jX
D/IuUi0yPSdwbuc=
=j9F8
-----END PGP MESSAGE-----
当阅读器到达最后 3 行时,它会一直读取到末尾清除空格并由正则表达式拆分以找到部分 =[“D/IuUi0yPSdwbuc==j9F8”、“”]。并且检查通过(parts.length!==1)。 所以我认为可以肯定地说这不是问题的原因!
【问题讨论】:
标签: node.js encryption node-streams node-crypto openpgp.js