【问题标题】:Misformed armored text when loading Message from Stream Openpgp.js从 Stream Openpgp.js 加载消息时出现错误的装甲文本
【发布时间】: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个案例:

  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 我在我的文件中测试了第三个可能的原因,以确定它的作用。 当我们到达消息中存在“=”或“-”的部分时,最后一段代码开始执行,例如在我使用的这个测试文件中:

-----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


    【解决方案1】:

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

    const sourceStream = createReadStream(sourcePath,'utf8')
    

    【讨论】:

      猜你喜欢
      • 2021-10-27
      • 2017-09-18
      • 2022-10-24
      • 2021-12-24
      • 1970-01-01
      • 2021-01-22
      • 2015-12-29
      • 2021-07-31
      • 1970-01-01
      相关资源
      最近更新 更多