【问题标题】:c++ password handling security practices?c++密码处理安全实践?
【发布时间】:2015-05-13 20:56:52
【问题描述】:

我正在创建一个处理用户名和密码的 c++ 类。

我试图对一些基本但有效的做法进行一些研究,以便我在 c++ 中处理这些信息,因此其他人不容易找到它,例如,扫描内存和变量以确定信息。

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

另外,我假设最好不要将这些信息保存在变量中,并在我不需要它时立即删除它?

编辑:

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

编辑2:

该类独立于平台并使用 boost。

编辑3:

这是函数的声明:

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

【问题讨论】:

  • 您要存储到磁盘吗?如果是这样,请计划在哈希+加盐方面付出一些努力。如果它仅在内存中,那么在大多数平台上这没什么大不了的,因为您需要管理员/调试器权限才能访问另一个进程的内存。如果这是 Windows,您可以使用 bcrypt.h 访问安全哈希。
  • 如果您不打算安全地存储您的密码(换句话说,使用某种散列),那么您最好以明文形式存储它们。只需确保通知系统的任何用户就是这种情况,这样他们就可以选择不使用该产品。
  • @VoidStar 查看我的编辑;不,我不会将这些信息存储到磁盘,只有内存。此外,该类独立于平台并使用 boost。
  • @MatsPetersson 现在检索此用户和密码的函数只是将它们作为 const string &,这不是已经暴露了信息吗?什么是替代方案?在使用用户名初始化这些变量并通过之前,不会发生散列?
  • 然后,我假设密码和一般系统一样安全——换句话说,如果“外部”有人可以访问它,那么密码就是不安全的。如果它是“安全”机器,那么密码就是安全的。如果有人知道你的软件是如何工作的,他们可以闯入“处理密码”功能,查看密码。

标签: c++ encryption cryptography passwords


【解决方案1】:

没有任何基本技术可以保护密码不被具有调试器并且可以访问内存的人的攻击!

因此,最安全的方法是不存储密码,而只存储密码的哈希值。有许多可用的实现,例如 this 来自受信任来源的开源之一。

是的,当您不再需要变量时,将其删除。即:覆盖值,而不仅仅是破坏变量(如果您想真正安全起见,您可以在其上写入随机值,但这在这里太过分了):

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

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

【讨论】:

  • 请注意,如果密码在std::string中,则需要使用password[0]=0password[1]=0等覆盖值,直到字符串的长度。设置password="" 只是在大多数平台上释放旧字符串,但密码可能会在未使用的堆中存在一段时间。但是我看不到用随机值覆盖的任何价值。
  • 现在检索这个用户和密码的函数只是把它们当作 const string &,那不是已经暴露了信息吗?什么是替代方案?在使用用户名初始化这些变量并在函数内传递之前,不会进行散列?
  • 这就是问题的全部:一旦你有一个明确的密码,你就很容易受到攻击。使用 const 调用您的函数意味着您没有机会在您的身份验证函数中清除密码。
  • 当您不需要时清除内存中的密钥或密码会出现问题:编译器可能会对其进行优化。 123
  • @MaciejS 出色的评论(以及关于此主题的非常好的链接)。所以是的,让密码变量volatile。然后,C++ 标准将访问这些变量视为副作用,从而确保它不会被优化掉。
猜你喜欢
  • 1970-01-01
  • 2017-06-11
  • 1970-01-01
  • 1970-01-01
  • 2020-01-03
  • 2015-11-21
  • 2018-07-18
  • 2018-07-20
  • 2015-06-19
相关资源
最近更新 更多