微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在openpgp JS中将参数消息作为文本传递

如何解决如何在openpgp JS中将参数消息作为文本传递

我想做什么:

  • 从容器 DIDE 获取一些 Azure 存储 blob,并使用 RSA 2048 对其进行加密,然后将它们上传到名为 encrypted-dide 的其他容器中 这些 blob 通过流下载(此处 Microsoft 做得很好 https://docs.microsoft.com/en-us/azure/storage/blobs/storage-quickstart-blobs-nodejs#upload-blobs-to-a-container)并由 func 重新组合。 streamToString(readableStream) (我没有使用 openpgp JS 流,因为我不知道 Microsoft 流是否与 NodeJs 流相同)
  • 我的代码使用未加密的文本按预期工作,并在据称加密的容器中上传 blob encrypted-dide
  • 我遵循了 openpgp js 的官方文档和一些互联网资源。
  • 我得到的错误错误:参数 [message] 需要是 openpgp JS 中的 Message 类型

publicKey 被硬编码在文件 keys.js 中,并像这样导出:

const publicKey = `-----BEGIN PGP PUBLIC KEY BLOCK-----

xsBNBGDgi3gBCADcZqIcczPDAx3+os5cCFVgaoT62Y+5rRvwPGPaPKKA1ajw
7NvoxS0RsJbqYAwNk0IEneoZvgSPpqkehGQCOBdsEhjcEgxVxaSlbbgPJkPh
avjTBDUhr6pIUc+MkSX7eh5LdkgWRSfzZdlxX2es5ycM5R1ZryzPTAenZh7D
l1g1x9TsyX+scI7gAtuyfbzAybYVqYMIvcHYZdIi8m6pgmxIqb0QW6sgO6nG
GyjVgxLDyMnHzYMInFRmKUV8XUUw9ECLZ6ioW4rthmpjoswh9vmP6vWI9OL/
Y7Zb3xY5XnIT6UFSpAHS5V/TNbEUD/EpoNtEI30bUl2X35UM277fUxetABEB
AAHNG0pvbiBTbWl0aCA8am9uQGV4YW1wbGUuY29tPsLAigQQAQgAHQUCYOCL
eAQLCQcIAxUICgQWAAIBAhkBAhsDAh4BACEJEGHAYnRSOf5GFiEExGMJvxnV
v1dXecI0YcBidFI5/kY5PAgAxL10QcUZIrxRXQIrqk04ZDhO4ehMirPqH/KT
L/MeHppHFqV06Fm4JDAOpGyh8lgleLwP4P9Lrod3AVSOKSX48u+UM/Bo4LtG
foAntS+tC9RjWlpR6PZ0aJA8SqHKLCnkaUvz7wv/M55fgGxeeQbhOLutNxN4
L8rCNhPo3UbWwoB+ifgQ9S4bv4kgyJxXYinyGYG0CD67YxQKxiAt58qjsdmK
x4uKCoFbHd1Oa4wfr6ezXet+2hCQvsf8eJV88+qL7TmpSe3ypiTWHNgxymNx
v77SlOkkzayJVWxrWtFU8ZoatlsfOP3A5tToio2rEhCHcnqYl4KtF1a0WUR8
KG+pJc7ATQRg4It4AQgA0Q2uZL9TIqGWtNzeAygdG0C3o+D+MoEYI/Qx0A6X
aZv7/1v84V++lRD0iuiMUlBgFEJWMsHF7cN1EMlUV1lRxOzyKTv+0FqyoSTr
bWexA+jG/Nb3Q8vSX1+eVHvm1+2H7AGhBH2szVmxeH15bGNaOaw03EmG5pCh
CIaCoXYUXKoavsa+C8827lGSuqLs1uRniCmIjQvkQSZg7a0IH6dpMIpxdHPh
h9Zyt8e74WwfmXW/be6cjWRI9FgBzl9U5EQEEVO1JdLvfzEEXkNthyAAhl+P
Z1oTR2PSs4ZUlYdb3MQrt7XoKeEOqCHHxoHB3gsj+75Jnc/aAbM+hb13imAJ
iwaraQABwsB2BBgBCAAJBQJg4It4AhsMACEJEGHAYnRSOf5GFiEExGMJvxnV
v1dXecI0YcBidFI5/kZYSQgAop0OsPV11O/fzbZ+oEabC3Ye9hNGapJQNdmJ
MJkiJg7Hnl1FO4MDtHK5OJ4YePFAqtlKRDIBCALPiN0E2v9+3yAafs6TQDc9
Lg3iIPDOnrXv7J7pv2WPnnue4o8Gkggpa+wEjbQJcUBLX311xJGBG4pSNIVN
FJcsl1fGoaxXB5ANPy/+UNMv0l/7cQWDzSw8V9WH10SO2Q4dQF7Zxw+UgBdb
mRVXWNHkcTs81WA/hYtAuLw0O5Q1QWfbXzlTJGNPy/lMMsxLF6La8fBPHlE0
CjYd4ZH9HgOvpCACjRtbc1jywaZJEisO2aJcO2BaozSzYUmkr5sH2wjSKcMS
nLviCw==
=Wg0i
-----END PGP PUBLIC KEY BLOCK-----`
const { BlobServiceClient } = require('@azure/storage-blob');
// const { v1: uuidv1 } = require('uuid');
// const stream = require('stream').promises
const openpgp = require('openpgp');
// import * as openpgp from 'openpgp'
const { publicKey } = require('./keys')





async function main() {

   const AZURE_STORAGE_CONNECTION_STRING = process.env.AZURE_STORAGE_CONNECTION_STRING;
   const blobServiceClient = BlobServiceClient.fromConnectionString(AZURE_STORAGE_CONNECTION_STRING);
   const containerClient = blobServiceClient.getContainerClient("uploadebs");
   const containerEncryptedFiles = blobServiceClient.getContainerClient("encrypted-dide");
   await containerEncryptedFiles.createIfNotExists("encrypted-dide") 
   
  // console.log(await openpgp.readKey({ armoredKey: publicKey })) <- THIS WORKS!
   for await (const blob of containerClient.listBlobsFlat()) {

       if (blob.name.match('^DIDE*')) {
           const blockBlobClient = containerClient.getBlockBlobClient(blob.name);
           const encryptedblockBlobClient = containerEncryptedFiles.getBlockBlobClient(blob.name)
           blockBlobClient.download(0)
           .then(downloadBlockBlobResponse => streamToString(downloadBlockBlobResponse.readableStreamBody))
           .then(blobAsstring => openpgp.encrypt({
                   message:  openpgp.createMessage({ text: blobAsstring }),// input as Message object
                   publicKeys: openpgp.readKey({ armoredKey: publicKey }),}))
            // BELOW LINE,SENDS TEXT IN BLOBS,ENCRYPTED OR NOT THROUGH FUNC UPLOAD
           .then(encrypted => {encryptedblockBlobClient.upload(encrypted,encrypted.length)})
       }
   }

}

async function streamToString(readableStream) {

 
   return new Promise((resolve,reject) => {
       const chunks = [];
       readableStream.on("data",(data) => {
           chunks.push(data.toString());
       });

       readableStream.on("end",() => {
           resolve(chunks.join(""));
       });
       readableStream.on("error",reject);
   });
}

main().then(() => console.log('Done')).catch((ex) => console.log(ex.message));

解决方法

openpgp.createMessage 返回一个 Promise。所以你需要做 .then 或在它之前添加 await

penpgp.readKey 相同。也是一种承诺。

例如来自Doc

const publicKey = await openpgp.readKey({ armoredKey: publicKeyArmored });

const encrypted = await openpgp.encrypt({
    message: await openpgp.createMessage({ text: 'Hello,World!' }),// input as Message object
    publicKeys: publicKey,// for encryption
    privateKeys: privateKey // for signing (optional)
});

EDIT2: 不使用等待。

.then(blobAsString => {
    return Promise.all([openpgp.createMessage({ text: blobAsString }),openpgp.readKey({ armoredKey: publicKey })])
    .then(([message,publicKeys ])=>{
        return openpgp.encrypt({
            message,publicKeys,});
    });    
})
,

像这样使用:

            .then(blobAsString => {
                return Promise.all([openpgp.createMessage({ text: blobAsString }),openpgp.readKey({ armoredKey: publicKey })])
                .then(([message,publicKeys ])=>{
                    return openpgp.encrypt({
                        message,})                   
                })
                .then(encrypted => {encryptedblockBlobClient.upload(encrypted,encrypted.length)});;    
            })

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?