boost::asio::const_buffer的安全回收
Secure deallocation of boost::asio::const_buffer
对于PA:DSS的目的,我需要确保boost::asio::const_buffer(例如在boost::asio::async_write)将在超出作用域时归零。
对于STL容器,我可以像这样替换分配器/释放器:
void deallocate(volatile pointer p, size_type n) {
std::memset(p, 0, n * sizeof(T));
::operator delete(p);
}
然而,我不知道如何用boost::asio::const_buffer实现相同的目标,至少不是以一种仍然让boost::asio::async_write消耗它的方式。我也不想重新发明轮子(如果有的话)。
简短的回答:Asio缓冲区不拥有自己的内存,所以它们也不应该负责处理内存
首先,你应该而不是使用std::memset(p, 0, n * sizeof(T));
使用像SecureZeroMemory
这样的函数:如何确保编译器优化不会引入安全风险?
我知道你有volatile
是出于这个原因,但它可能并不总是像你期望的那样荣幸:
您的
secure_memset
函数可能不够。根据http://open-std.org/jtc1/sc22/wg14/www/docs/n1381.pdf,有优化编译器只会将第一个字节归零- Daniel Trebbien Nov 9 '12 at 12:50
背景阅读:
- https://cryptocoding.net/index.php/Coding_rules Clean_memory_of_secret_data
- http://blog.quarkslab.com/a-glance-at-compiler-internals-keep-my-memset.html
On to ASIO
确保你完全意识到Boost Asio缓冲区没有所有权语义。它们只引用另一个对象拥有的数据。
比所提出的问题更重要的是,您可能希望检查缓冲区数据是否保留了足够长的时间。一个常见的缺陷是将一个局部变量作为缓冲区传递:
std::string response = "OKrnrn"; asio::async_write(sock_, asio::buffer(response), ...); // OOOPS!!!
这将立即导致未定义行为。
low const_buffer
是一个概念。有无数种方法可以在(你自己的)对象上构造它:
文档缓冲区对象表示一个连续的内存区域,它是一个由指针和大小(以字节为单位)组成的二元组。
{void*, size_t}
形式的元组指定了一个可变(可修改)的内存区域。类似地,形式为{const void*, size_t}
的元组指定了一个const(不可修改的)内存区域。这两种形式分别对应于mutable_buffer
和const_buffer
类
那么,假设你的缓冲区类型是
struct SecureBuffer
{
~SecureBuffer() { shred(); }
size_t size() const { return length_; }
char const* data() const { return data_; }
// ...
private:
void shred(); // uses SecureZeroMemory etc.
std::array<char, 1024> data_ = {0};
size_t length_ = 0u;
};
然后你可以简单地传递到你想要使用它的地方:
SecureBuffer secret; // member variable (lifetime exceeds async operation)
// ... set data
boost::asio::async_write(sock_,
boost::asio::buffer(secret.data(), secret.size()),
/*...*/
);
- 理解boost::asio-async_read在无需读取内容时的行为
- 从不同线程使用int64的不同字节安全吗
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 提升 ASIO 无法识别计时器对象
- 虚拟决赛作为安全
- 获取日期异步信号安全吗?如果在信号处理程序中使用,它会导致死锁吗
- 如何将元素添加到数组的线程安全函数?
- asio 链对象线程安全吗?
- 同时调用 ASIO 对象的 API 是否安全?
- 使用boost :: asio :: strand以这种方式安全吗?
- 线程安全关闭同步使用的 boost::asio::ip::tcp::socket
- 在asio stackful协同程序中直接使用产卵是否安全
- asio:取消后重新启动async_read_some/async_write_some是否安全
- 从其处理程序或处理程序 dtor 销毁 boost::asio 计时器是否安全?
- boost::asio::deadline_timer线程安全
- boost::asio::const_buffer的安全回收
- Boost asio TCP -套接字写入数据与缓冲区中的数据不同-可能在某处出现线程不安全
- 安全断开asio SSL套接字的正确方法是什么?
- 使用boost::asio定时器进行线程安全工作
- 是更好的同步或异步从boost asio时,有大量的计算和推/弹出线程安全容器