如何在您的应用程序中安全地处理密码

时间:2013-06-12 15:01:46

标签: c++ security passwords

我在Saving passwords inside an application找到了一个类似的问题,但它并没有真正回答我的担忧。

我正在处理将从用户那里(安全地)接收密码的应用程序。收到密码后,我需要将其存储在某个变量中并通过事务发送到其他系统(这个逻辑是安全可靠的,已经实现)。

我担心的是我不希望能够在核心转储中看到密码,所以我想在将密码保存到任何变量之前对其进行加密。

问题:

  • 在将其保存到足够的变量之前加密吗?或者我错过了一些安全漏洞?

  • 是否只有一个简单的标头库可以进行加密?你能引导我到我开始寻找的地方吗?

回答评论者的注意事项:

  • 密码不会长期存储;仅适用于交易的生命周期。

  • 不幸的是,交易的参与者无法解密密码,因此我需要在将密码发送给他们之前对其进行解密。

  • 我现在主要关注的是找到一种在本地加密和解密密码的方法 - 以简单的方式...

  • 我找到了OpenSSL库和crypto ++,但它需要与它们链接,我不能只包括并调用它们(即不是只有标题的库)......

谢谢,

1 个答案:

答案 0 :(得分:2)

(注意:我确信有严格的检查清单和关于如何在安全软件中处理密码的严格检查清单和官方指南,来自真正了解安全性的人和当局。这是一个那些!)

我不认为有一种加密安全的方法可以在您的进程内存中使用密码,能够使用它们,但不能让用户可以访问它,可以在调试器下运行您的应用程序或检查您的核心转储。

您可以做的是隐藏密码。以下是您可以使用的一些技巧:

  • 不要将密码保存为内存中任何地方的简单字符串(分散字符等)
  • 在使用密码后,擦除密码存储的所有变量(例如,如果将密码传递给函数,则应在完成后将该变量的所有字符设置为函数内的NUL。< / LI>
  • 加密密码。
  • 在每次运行应用程序时更改加密密钥(如果是长时间运行的应用程序,则定期更改加密密钥。)
  • 根据系统/硬件的某些方面以程序方式生成加密密钥,并且将密码的加密密钥存储在进程内存中的任何位置。
  • 使用可信平台模块(TPM)等硬件(如果有)。

持续有效地实施上述内容非常困难,会影响您处理密码的所有代码。有时你甚至不得不故意让你的代码更加模糊,并且违背你作为程序员的所有直觉(例如,不将密码作为参数传递给函数,而是使用函数内部的硬编码地址。)

我再一次必须强调,当对手完全访问物理机时,可能无法在中保护您的密码

至于问题的第二部分,我不知道任何仅限标头的加密库,但加密密码可能只需要一个密码,可能还需要一个哈希。并且所有最好的算法都具有公共域或其他免费实现。您可以获取其中一个并复制/粘贴到您自己的应用程序中。不要忘记认真测试它!