在 C++ Node Addons 中使用 Node::Buffers

Working with Node::Buffers in C++ Node Addons

我正在开发一个使用 Windows DPAPI 加密数据的节点插件。我正在使用 NAN 将两个 Javascript Uint8Array 传递给 C++ 代码。

打字稿界面是这样的:

export interface DpapiBindings{
    protectData(dataToEncrypt: Uint8Array, optionalEntropy: Uint8Array, scope: string): Uint8Array
}

然后我想在 C++ 代码中创建一个 Node::Buffer:

void ProtectData( Nan::NAN_METHOD_ARGS_TYPE info)
{
    v8::Isolate* isolate = info.GetIsolate();

   // 
    auto buffer = node::Buffer::Data(info[0]);
    auto len = node::Buffer::Length(info[0]);

    DATA_BLOB entropyBlob;
    entropyBlob.pbData = nullptr;
    if (!info[1]->IsNull())
    {
        entropyBlob.pbData = reinterpret_cast<BYTE*>(node::Buffer::Data(info[1]));
        entropyBlob.cbData = node::Buffer::Length(info[1]);
    }

    DATA_BLOB dataIn;
    DATA_BLOB dataOut;

    // initialize input data
    dataIn.pbData = reinterpret_cast<BYTE*>(buffer);
    dataIn.cbData = len;

    success = CryptProtectData(
            &dataIn,
            nullptr,
            entropyBlob.pbData ? &entropyBlob : nullptr,
            nullptr, 
            nullptr,
            flags,
            &dataOut);

    auto returnBuffer = Nan::CopyBuffer(reinterpret_cast<const char*>(dataOut.pbData), dataOut.cbData).ToLocalChecked();
    LocalFree(dataOut.pbData);

    info.GetReturnValue().Set(returnBuffer);

}

我是 C++ 新手,我的问题是:在 C++ 代码中使用 node::Buffer::Data 和 node::Buffer::Length 并调用 CryptProtectData 时,我需要担心缓冲区溢出吗?如果是这样,我该如何防范?我应该向缓冲区和 len 附加一个空字符吗?

不,您不必担心溢出。 dataIndataOut 结构是具有长度的指针。

BufferCopy 不是您想要使用的。您要使用:Nan::MaybeLocal<v8::Object> Nan::NewBuffer(char* data, uint32_t size).

https://github.com/nodejs/nan/blob/master/doc/buffers.md#api_nan_new_buffer

并确保在完成后释放 dataOut.pbData 内存(我看到你正在使用 LocalFree 调用。)它不能溢出的原因是 CryptProtectData 根据需要的大小分配缓冲区。