[英]Misformed armored text error when loading key using OpenPGP
[英]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個案例:
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');
}
起初我認為問題可能出在文件格式上,但該文件是由上一份工作中相同的 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.