从Stream Openpgp.js加载消息时出现格式错误的铠装文本



我有一个在后台处理解密作业执行的作业。这是解密的代码:

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个案例:

  1. 它读取一个未定义的行:
if (line === undefined) {
throw new Error('Misformed armored text');
} 
  1. 如果编写器在实际关闭之前完成:
const { done, value } = await reader.read();
if (done) {
throw new Error('Misformed armored text');}
  1. 我真的不确定。。。但如果有人能帮忙,这里有代码
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我在文件中测试了第三个可能的原因,以了解它的作用。当我们到达消息中存在"0"的部分时,代码的最后一位开始执行="或一个"-&";,例如,在这个测试文件中,我使用了:

-----BEGIN PGP MESSAGE-----
wV4D657zkXTrd+wSAQdA2p3p2iMnFX7oHSPSFSJP20J4ibR3ilwz1T6XO7jo
.....
.....
zef62S0eNiLhU1KTThfYNKLuiG8y4N90MSlH92ruYC8RFiMvuaDud52sl4jX
D/IuUi0yPSdwbuc=
=j9F8
-----END PGP MESSAGE-----

当读卡器到达最后3行时,它读取直到末尾清除空格并通过正则表达式拆分以找到部分=["D/IuUi0yPSdwbuc==j9F8","]。并且检查通过(parts.length!==1(。所以我认为可以肯定地说,这不是问题的原因!

我找到了解决方案。感谢openpgp.js团队的Daniel Huigens!文档中没有指定,但解决此问题的方法是读取utf8编码的数据,而不是二进制数据。所以解决方案是:

const sourceStream = createReadStream(sourcePath,'utf8')

相关内容

  • 没有找到相关文章

最新更新