C++ 覆盖堆上敏感数据的保存方式

C++ 覆盖堆上敏感数据的保存方式,c++,security,passwords,password-protection,C++,Security,Passwords,Password Protection,假设我们有一个密码,保存为char数组char m_topSecretPassword[128]。我们要求用户输入密码,然后以某种方式使用它(例如连接到数据库)。是否有一些保存方法可以绝对确保密码在使用后从内存中删除 我的第一个想法是,我们可以迭代数组并将每个值设置为0或某个随机数。然而,优化器可以对此进行优化,在系统上的某个内容覆盖密码之前,将密码保留在内存中,这可能需要相当长的时间 然后我考虑使用volatile,但这可能会减慢程序的速度 我们可以用汇编程序来实现,但这会破坏可移植性 有更好

假设我们有一个密码,保存为char数组
char m_topSecretPassword[128]。我们要求用户输入密码,然后以某种方式使用它(例如连接到数据库)。是否有一些保存方法可以绝对确保密码在使用后从内存中删除

我的第一个想法是,我们可以迭代数组并将每个值设置为0或某个随机数。然而,优化器可以对此进行优化,在系统上的某个内容覆盖密码之前,将密码保留在内存中,这可能需要相当长的时间

然后我考虑使用volatile,但这可能会减慢程序的速度

我们可以用汇编程序来实现,但这会破坏可移植性


有更好的方法吗?

请注意。C11引入了
memset_s
,但在较旧的C方言中没有可移植的方式;我不知道C++。“可以慢下来”好吧,这不是非常相关的,因为<>代码> Value不是开始的正确工具,但是这个声明证明你没有做你的作业。有些东西太慢或太慢,对性能的猜测是非常不准确的。@Gilles memset_s只确保没有发生缓冲区溢出(以及其他一些事情),它不确保调用没有被优化@Brotcrunsher也不是这样:“如果由该函数修改的对象在其剩余生命周期内(例如gcc bug 8537)未被再次访问,则memset可能会被优化掉(根据假设规则)。因此,该函数不能用于清理内存(例如,用零填充存储密码的数组)。此优化对memset_s是禁止的:它保证执行内存写入。“从您链接的页面开始。@BaummitAugen您是对的。请注意。C11引入了
memset_s
,但在较旧的C方言中没有可移植的方式;我不知道C++。“可以慢下来”好吧,这不是非常相关的,因为<>代码> Value不是开始的正确工具,但是这个声明证明你没有做你的作业。有些东西太慢或太慢,对性能的猜测是非常不准确的。@Gilles memset_s只确保没有发生缓冲区溢出(以及其他一些事情),它不确保调用没有被优化@Brotcrunsher也不是这样:“如果由该函数修改的对象在其剩余生命周期内(例如gcc bug 8537)未被再次访问,则memset可能会被优化掉(根据假设规则)。因此,该函数不能用于清理内存(例如,用零填充存储密码的数组)。此优化对memset_s是禁止的:它保证执行内存写入。“从您链接的页面开始。@BaummitAugen您是对的。