簡體   English   中英

從 Stream Openpgp.js 加載消息時出現錯誤的裝甲文本

[英]Misformed armored text when loading Message from 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 function 中此類異常提升的原因之后。 我發現了這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');
   }

起初我認為問題可能出在文件格式上,但該文件是由上一份工作中相同的 package 生成的......

更新 1我在我的文件中測試了第三個可能的原因,以確定它的作用。 當我們到達消息中存在“=”或“-”的部分時,最后一段代碼開始執行,例如在我使用的這個測試文件中:

-----BEGIN PGP MESSAGE-----

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

當 Reader 到達最后 3 行時,它會一直讀取到末尾清除空格並由正則表達式拆分以找到 parts=["D/IuUi0yPSdwbuc==j9F8",""]。 並且檢查通過(parts.length.==1)。 所以我認為可以肯定地說這不是問題的原因!

我找到了解決方案。 感謝 openpgp.js 團隊的 Daniel Huigens,它沒有在文檔中指定,但是解決這個問題的方法是讀取 utf8 編碼的數據。 不是二進制:所以解決方案是:

const sourceStream = createReadStream(sourcePath,'utf8')

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM