C++ c++;密码处理安全实践?

C++ c++;密码处理安全实践?,c++,encryption,cryptography,passwords,C++,Encryption,Cryptography,Passwords,我所说的基础,是指不需要大量工作的东西;我不想编写一个完整的密码库、随机寻址系统,甚至一个散列函数 另外,我假设最好不要在变量中维护这些信息,并在我不需要它时尽快将其删除 编辑: 不,我不会将此信息保存到磁盘,只会将其保存在内存中的变量中 编辑2: 该类与平台无关,并使用boost 编辑3: 以下是函数的声明: void authenticate(const std::string & user, const std::string & pass); 没有任何基本的技术可以保护

我所说的基础,是指不需要大量工作的东西;我不想编写一个完整的密码库、随机寻址系统,甚至一个散列函数

另外,我假设最好不要在变量中维护这些信息,并在我不需要它时尽快将其删除

编辑:

不,我不会将此信息保存到磁盘,只会将其保存在内存中的变量中

编辑2:

该类与平台无关,并使用boost

编辑3:

以下是函数的声明:

void authenticate(const std::string & user, const std::string & pass);

没有任何基本的技术可以保护密码不被拥有调试程序并且可以访问内存的人使用

因此,最安全的方法不是存储密码,而是只存储密码的散列。有许多可用的实现,例如来自可信源的开源实现

是的,当您不再需要变量时,请删除它。即:覆盖值,而不仅仅是销毁变量(如果你真的想安全起见,你可以在上面写随机值,但这太过分了):

如果是字符串,那么值得一提的建议是:

 string pwd; 
 ....
 std::fill_n(&pwd[0], pwd.capacity()-1, 0xff);  // really overwrite

您正在存储到磁盘吗?如果是这样的话,请计划在哈希+盐析方面投入一些精力。如果它只在内存中,那么在大多数平台上就没什么大不了的了,因为您需要管理员/调试器权限才能访问其他进程的内存。如果这是windows,您可以使用bcrypt.h访问安全散列。如果您不打算安全地存储密码(换句话说,使用某种类型的散列),那么您也可以将其存储在明文中。只需确保您通知您系统的任何用户情况就是这样,这样他们就可以选择不使用该产品。@VoidStar查看我的编辑;不,我不会将这些信息存储到磁盘,只存储在内存中。另外,该类是独立于平台的,并且使用boost。@MatsPetersson现在检索此用户和密码的函数只是将其作为常量字符串&,这不是已经公开了信息吗?另一种选择是什么?散列在使用用户名和密码初始化这些变量之前不会发生?然后,我假设密码和一般系统一样安全-换句话说,如果“外部”有人可以访问它,那么密码就不安全。如果是“安全”机器,则密码是安全的。如果有人知道您的软件是如何工作的,他们可以中断“处理密码”功能,查看密码。请注意,如果密码位于
std::string
中,则需要使用
password[0]=0
password[1]=0
等覆盖值,直到字符串长度。设置
password=”“
只会在大多数平台上释放旧字符串,但密码可能会在未使用的堆中存在一段时间。但是,我没有看到用随机值覆盖的任何值。现在检索此用户和密码的函数只是将它们作为常量字符串&,这不会已经公开了信息吗?另一种选择是什么?散列只有在这些变量用用户名初始化并在函数中传递之后才会发生?这就是全部问题:一旦密码被清除,就容易受到攻击。使用常量调用函数意味着您没有机会清除身份验证函数中的密码。在不需要时清除内存中的密钥或密码会出现问题:编译器可能会对其进行优化@MaciejS非常好的评论(以及关于这个主题的非常好的链接)。因此,是的,将密码变量
设置为volatile
。C++ Stand然后考虑访问这些变量作为副作用,确保它没有被优化。