#javascript #node.js #encryption #base64 #buffer
#язык JavaScript #node.js #шифрование #база 64 #буфер
Вопрос:
Я извлекаю зашифрованные буферные данные из Arweave. Когда я регистрирую данные ответа, они кажутся правильными, выглядят как правильные данные буфера. Когда я проверяю typeof на наличие расшифрованных буферных данных, это показывает, что это объект. Я пытаюсь взять эти расшифрованные данные буфера и отправить их обратно в качестве ответа, чтобы их можно было отобразить в виде изображения на моем интерфейсе.
Мой подход заключается в том, чтобы превратить данные буфера в base64, а затем отправить ответ обратно с данными mimetype и base64 в теге.
Проблема в том, что реакция такова lt;img src="data:image/png;base64,[object Promise]" /gt;
Вот мой код:
const express = require('express') const cors = require('cors') const bodyParser = require('body-parser') const crypto = require("crypto"); const Arweave = require("arweave"); const ALGORITHM = "aes-256-gcm"; const arweave = Arweave.init({ host: 'arweave.net', protocol: 'https' }); const decrypt = (dataBuffer, key) =gt; { // Create cipherKey const cipherKey = Buffer.from(key); // Get iv and its size const ivSize = dataBuffer.readUInt8(0); const iv = dataBuffer.slice(1, ivSize 1); // Get authTag - is default 16 bytes in AES-GCM const authTag = dataBuffer.slice(ivSize 1, ivSize 17); // Create decipher const decipher = crypto.createDecipheriv(ALGORITHM, cipherKey, iv); decipher.setAuthTag(authTag); return Buffer.concat([ decipher.update(dataBuffer.slice(ivSize 17)), decipher.final(), ]); }; const getData = async (url, key) =gt; { const response = await arweave.api.get(url, { responseType: "arraybuffer" }) console.log(response.data) const decrypted_data = decrypt(response.data, key) console.log(decrypted_data) return } const api = express() const port = 3000 api.use(cors()) api.use(bodyParser.urlencoded({ extended: false })); api.use(bodyParser.json()); api.post('/decrypt', (req, res) =gt; { const key = req.body.key const url = req.body.url const sliced_url = url.slice(20); const decrypted_data = getData(sliced_url, key) const b64 = decrypted_data.toString('base64'); const mimeType = 'image/png'; res.send(`lt;img src="data:${mimeType};base64,${b64}" /gt;`); }) api.listen(port, () =gt; console.log("Server running on port 3000"))
Консоль.журнал(данные):
lt;Buffer 10 4a 0e a9 bd b6 ca c9 e1 5d f2 2f 1f 03 3e b2 90 d8 c3 ed 7f 05 47 70 a2 11 c8 26 60 b9 70 33 ca b9 71 3a 56 68 7a b9 1b 37 c3 a2 ad 23 d2 7d 7b 85 ... 41534 more bytesgt;
Console.log(расшифрованные данные):
lt;Buffer 89 50 4e 47 0d 0a 1a 0a 00 00 00 0d 49 48 44 52 00 00 01 00 00 00 01 00 08 06 00 00 00 5c 72 a8 66 00 00 00 06 62 4b 47 44 00 ff 00 ff 00 ff a0 bd a7 ... 41501 more bytesgt;
Комментарии:
1. И в чем ваша проблема? Вы не упомянули, что не так/не работает.
2. Спасибо, я обновил пост @Marc
3. Ваш
getData
ничего не возвращает. Более того, вы не ждете обещания, что getData вернется к заполнению/заполнению.4. Спасибо @Marc, это решило проблему.